在 Unity 中围绕对象移动摄像机



以前的帖子似乎没有解决我的问题。

我试图让我的相机围绕一个叫做"目标"的特定点移动。目标是一个空的游戏对象,设置在我的游戏中心。这个想法是相机不会靠近或远离目标,而只是围绕目标旋转,就好像它在一个看不见的球体周围移动一样。相机应始终指向目标。 transform.LookAt(target)可以很好地保持相机对目标的训练,但我无法正确移动。无论我沿着水平轴还是垂直轴移动,它总是直接螺旋进入目标,而不仅仅是围绕它移动。有什么想法吗?

public class CameraController : MonoBehaviour {
public float speed;
public Transform target;
void Update () {
    transform.LookAt(target);
    if(Input.GetAxis("Vertical") != 0)
    {
        transform.Translate(transform.up * Input.GetAxis("Vertical") * Time.deltaTime * speed); //.up = positive y
    }
    if(Input.GetAxis("Horizontal") != 0)
    {
        transform.Translate(transform.right * Input.GetAxis("Horizontal") * Time.deltaTime * speed); //.right = positive x
    }
}
}

要围绕特定点旋转,我使用 Transform.RotateAround

transform.RotateAround(target.position, transform.right, -Input.GetAxis("Mouse Y") * speed);
transform.RotateAround(target.position, transform.up, -Input.GetAxis("Mouse X") * speed);

或者,如果您的目标移动并且您希望在相机和目标之间保持相同的距离,您可以使用我的answers.unity3d.com页面中的这段代码:

public class SphericalCam 
    : MonoBehaviour 
{
     public float MinDist, CurrentDist, MaxDist, TranslateSpeed, AngleH, AngleV;
     public Transform Target;
     public void Update()
     {
         AngleH += Input.GetAxis("Mouse X");
         AngleV -= Input.GetAxis("Mouse Y");
         CurrentDist += Input.GetAxis("Mouse ScrollWheel");
     }
     public void LateUpdate()
     {
         Vector3 tmp;
         tmp.x = (Mathf.Cos(AngleH * (Mathf.PI / 180)) * Mathf.Sin(AngleV * (Mathf.PI / 180)) * CurrentDist + Target.position.x;
         tmp.z = (Mathf.Sin(AngleH * (Mathf.PI / 180)) * Mathf.Sin(AngleV * (Mathf.PI / 180)) * CurrentDist + Target.position.z;
         tmp.y = Mathf.Sin(AngleV * (Mathf.PI / 180)) * CurrentDist + Target.position.y;
         transform.position = Vector3.Slerp(transform.position, tmp, TranslateSpeed * Time.deltaTime);
         transform.LookAt(Target);
     }
 }

摄像机围绕目标水平旋转:

transform.RotateAround(target.position, target.forward, Time.deltaTime * speed);

垂直:

transform.RotateAround(target.position, target.right, Time.deltaTime * speed);

最新更新