【发布时间】:2021-11-19 23:37:55
【问题描述】:
我正在编写一个代表圆形网格的脚本。随着层与中心的距离增加,每层中的对象数量按比例增加,因此每个 tile 之间的距离应该保持不变。我试图通过舍入鼠标世界位置来计算每个 tile 的近似值,但这固有地导致了一些问题,例如围绕起始角度抽搐并在鼠标到达之前移动对象。 这是一个完全糟糕的方法还是我错过了什么? 代码如下:
customGrid.cs
using UnityEngine;
public class customGrid : MonoBehaviour
{
[SerializeField] private Camera mainCamera;
[SerializeField] private LayerMask layerMask; // this is a simple LayerMask attached to a simple Plane object
public GameObject structure;
Vector3 truePos;
public int maxLayers = 1;
public int minLayers = 0;
public float objectSize = 1.5f;
public float radius = 0f;
void LateUpdate()
{
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit raycastHit, float.MaxValue, layerMask))
{
float angleRadian = Mathf.Atan2(raycastHit.point.x, raycastHit.point.z);
float cursorDistanceFromOrigin = Vector3.Distance(Vector3.zero, new Vector3(raycastHit.point.x, 0, raycastHit.point.z));
var circumference = 2 * Mathf.PI * radius;
var quantization = 360 / (circumference / objectSize);
float objectDistanceFromOrigin = Mathf.Floor(cursorDistanceFromOrigin / objectSize) * objectSize;
var maxDistance = objectSize * maxLayers;
var minDistance = objectSize * minLayers;
objectDistanceFromOrigin = Mathf.Clamp(objectDistanceFromOrigin, minDistance, maxDistance);
radius = objectDistanceFromOrigin;
if (radius < 1) return;
var degree = angleRadian * Mathf.Rad2Deg;
degree = Mathf.Round(degree / quantization) * quantization;
angleRadian = degree * Mathf.Deg2Rad;
truePos.x = Mathf.Sin(angleRadian) * radius;
truePos.y = 0;
truePos.z = Mathf.Cos(angleRadian) * radius;
RepositionObject();
}
}
private void RepositionObject()
{
structure.transform.position = truePos;
var dir = truePos - Vector3.zero;
dir = Vector3.Normalize(dir);
structure.transform.rotation = Quaternion.LookRotation(dir);
}
}
【问题讨论】:
-
你能大致画出你希望网格线的样子吗?
-
@AndrewWilliamson 当然!我在问题中添加了一张图片。
标签: c# algorithm unity3d trigonometry