旋转到鼠标位置的最佳放克单位2d



我看了一个教程,他是这样做的:

public Rigidbody2D rb;
public Camera cam;
Vector2 movement;
Vector2 mousePos;
void Update()
{
mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
}
private void FixedUpdate()
{
Vector2 lookDir = mousePos - rb.position;
float angle = Mathf.Atan2(lookDir.y ,lookDir.x) * Mathf.Rad2Deg - 90f;
rb.rotation = angle;
}

但我想我可以用一种更简单的方法来做:

Vector3 mousePosition;
void Update()
{
mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 direction = mousePosition - transform.position;
transform.up = direction;
}

它有效,但我认为"他为什么要用这么复杂的方式来做呢?它比什么东西更有效率吗"这正是我无法摆脱的问题

没有理由使用FixedUpdate进行相机更新。实际上,建议使用LateUpdate(),因为它跟踪可能在Update`中移动的对象。查看文档。

关于效率,我想说你的方式更高效,但为了确保效率,我会检查设置一些定时器,并检查使用一些无用的for的方式更有效,例如:

测量1:

var watch = new System.Diagnostics.Stopwatch();
watch.Start();
for (int i = 0; i<1000000; i++) {
Vector2 lookDir = mousePos - rb.position;
float angle = Mathf.Atan2(lookDir.y ,lookDir.x) * Mathf.Rad2Deg - 90f;
rb.rotation = angle;
}
watch.Stop();
Debug.LogError($"elapsed: {watch.ElapsedMilliseconds} ms");

测量2:

var watch = new System.Diagnostics.Stopwatch();
watch.Start();
for (int i = 0; i<1000000; i++) {
mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 direction = mousePosition - transform.position;
transform.up = direction;
}
watch.Stop();
Debug.LogError($"elapsed: {watch.ElapsedMilliseconds} ms");

最新更新