在Unity中围绕物体移动相机

4

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

我正在尝试使我的相机围绕一个名为“target”的特定点移动。Target是设置在我的游戏中心的一个空的gameobject。理想情况下,相机不会向目标靠近或远离,并且将简单地围绕目标旋转,就像它正围绕着一个无形的球体移动一样。相机应始终朝向目标。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
    }
}
}
2个回答

9

我使用 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);
     }
 }

1
这仍然不太行。首先,在绕X轴旋转时,它无法完全绕一圈(在极点处停滞并振荡)。而且,在绕Y轴旋转时,无论你离目标有多远,它都会降落到轨道上,直到其Y平移与目标相匹配。 - Dylan Russell
@DylanRussell 我在我的项目中使用这两个功能,看起来一切都正常。你确定是由它们引起的吗? - mrogal.ski
折腾了一下,我实际上注意到极点的问题是当您围绕X轴旋转到某个特定点时,本地正负轴会“切换”。您知道有什么方法可以解决这个问题,以便在只按住向上或向下键时平稳地围绕目标旋转吗? - Dylan Russell
transform.RotateAround(target.position, transform.right, -Input.GetAxis("Vertical") * speed); transform.RotateAround(target.position, transform.up, -Input.GetAxis("Horizontal") * speed);这是我正在使用的代码。如果你使用它并按住上下箭头键(假设你没有更改输入),当你到达旋转对象的南北极时,你会注意到发生了什么。 - Dylan Russell
1
啊,我修好了!我没有删除 transform.LookAt(target); 现在它完美地工作了!非常感谢你! - Dylan Russell
好的,我会检查如何修复这个问题。目前为止,我认为你可以使用第二个脚本,它应该可以正常工作。 - mrogal.ski

3

相机水平围绕目标旋转:

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

垂直方向:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接