我正在制作一个 2d 自上而下的游戏,玩家可以在他穿越世界时围绕自己旋转相机。
当玩家在世界各地移动时,一切都很好,相机可以很好地跟随他。如果他静止不动,那么摄像机旋转也很有效。但是,一旦我开始同时进行这两项操作,相机中就会出现抖动,这会使除了玩家之外的所有其他对象都抖动。
现在在处理这个问题时,我发现这可能与我使用rigidbody2d.AddRelativeForce(所以物理)来移动玩家并且他的动作在FixedUpdate中检查的事实有关。
https://forum.unity3d.com/threads/camera-jitter-problem.115224/ http://answers.unity3d.com/questions/381317/camera-rotation-jitterness-lookat.html
我已经尝试将我的相机旋转和以下脚本移动到 LateUpdate、FixedUpdate、Update 你的名字。似乎没有任何效果。我确信在相机的移动和导致这种情况的旋转之间存在某种延迟。我想知道是否有人有任何反馈?
我曾尝试禁用 Vsync,但并未完全删除它我曾尝试对刚体进行插值和外插,尽管存在差异,但它并没有完全删除它。具有讽刺意味的是,如果我将其设置为无,它似乎效果最好。
脚本:
要跟随角色,脚本应用于将相机作为子对象的游戏对象
public class FollowPlayer : MonoBehaviour {
public Transform lookAt;
public Spawner spawner;
private Transform trans;
public float cameraRot = 3;
private bool smooth = false;
private float smoothSpeed = 30f;
private Vector3 offset = new Vector3(0, 0, -6.5f);
//test
public bool changeUpdate;
private void Start()
{
trans = GetComponent<Transform>();
}
private void FixedUpdate()
{
CameraRotation();
}
private void LateUpdate()
{
following();
}
public void following()
{
Vector3 desiredPosition = lookAt.transform.position + offset;
if (smooth)
{
transform.position = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
}
else
{
transform.position = desiredPosition;
}
}
void CameraRotation()
{
if (Input.GetKey("q"))
{
transform.Rotate(0, 0, cameraRot);
}
if (Input.GetKey("e"))
{
transform.Rotate(0, 0, -cameraRot);
}
}
public void SetTarget(string e)
{
lookAt = GameObject.Find(e).GetComponent<Transform>();
}
角色Controller,脚本应用到Player,在FixedUpdate中调用
private void HandleMovement()
{
if (Input.GetKey("w"))
{
rigid.AddRelativeForce(Vector2.up * speed);
}
if (Input.GetKey("s"))
{
rigid.AddRelativeForce(Vector2.down * speed);
}
if (Input.GetKey("a"))
{
if (facingRight)
{
Flip();
}
rigid.AddRelativeForce(Vector2.left * speed);
}
if (Input.GetKey("d"))
{
if (!facingRight)
{
Flip();
}
rigid.AddRelativeForce(new Vector2(1,0) * speed);
}
}