0

我做了一个简单的赛车游戏。摄像机跟随汽车(玩家),其位置和旋转基于汽车的 Y 旋转。我想平滑相机旋转,但是当它越过 0 度点时,它会旋转 360 度。这是代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Camera : MonoBehaviour {
    public Transform camera, player;


    void Update() {
        Vector3 cameraPosition = camera.transform.position;
        float cameraRotation = camera.eulerAngles.y;
        float playerRotation = player.eulerAngles.y;
        Vector3 playerPosition = player.transform.position;
        cameraPosition.x = (Mathf.Sin((playerRotation / 180) * Mathf.PI) * -6 + player.position.x);
        cameraPosition.y = playerPosition.y + 2.5f;
        cameraPosition.z = (Mathf.Cos((playerRotation / 180) * Mathf.PI) * -6 + player.position.z);
        camera.transform.position = cameraPosition;
        cameraRotation = cameraRotation + (playerRotation-cameraRotation)/2;
        camera.localRotation = Quaternion.Euler(20f, cameraRotation, 0f);
    }
}

我发现这种旋转是由平滑脚本引起的:

 cameraRotation = cameraRotation + (playerRotation-cameraRotation)/2;

如何防止这种不必要的旋转?

4

2 回答 2

1

我会这样做:

public int smoothSpeed = 1f; // Change accordingly to increase/decrease smooth speed.

然后在更新:

Vector3 directionToCar = player.position - camera.position;
Quaternion desiredRotation = Quaternion.LookRotation(directionToCar);
camera.rotation = Quaternion.Slerp(camera.rotation, desiredRotation, Time.deltaTime * smoothSpeed);

在侧节点上,如果此相机脚本附加到相机,则不必创建引用相机变换的字段。你可以简单地做transform.position而不是camera.transform.position.

于 2018-05-12T13:42:44.373 回答
0

使用 Slerp 的一个更简单的解决方案是使用 Mathf.SmoothDamp,它有一个名为 Mathf.SmoothDampAngle 的变体,可以正确处理循环。我也成功地手工完成了环绕,但这不是一次非常有益的体验

using UnityEngine;
public class RotFollow : MonoBehaviour
{
    [SerializeField] Transform carTransform;
    [SerializeField] float smoothTime = .4f; 

    float currentYAngle;
    float targetYAngle;
    float angleVel;
    void Update()
    {
        targetYAngle = carTransform.rotation.eulerAngles.y;
        currentYAngle =  Mathf.SmoothDampAngle(currentYAngle, targetYAngle, ref angleVel, smoothTime);
        transform.rotation = Quaternion.Euler(
                                        transform.rotation.eulerAngles.x,
                                        currentYAngle, 
                                        transform.rotation.eulerAngles.z);
        }
    }
于 2018-05-14T09:47:39.017 回答