unity3d 如何通过脚本旋转玩家摄像头?

f1tvaqid  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(133)

我把我的主摄影机作为我的播放器对象的一个组件,但我想让它们分开,所以我创建了一个脚本,允许我的摄影机跟随我的播放器,而不是保持我的摄影机作为播放器对象的子对象。
然而,尽管我的播放器对象本身能够正确旋转,但当我水平移动鼠标时,相机并不跟随它,而只能垂直工作。
我现在有一个空的游戏对象,它连接了我的主摄像机,并引用了玩家身体(变换)和以下脚本:

public class FollowPlayer : MonoBehaviour
{

    public Transform player;
    public Vector3 offset;

    public float mouseSensitivity = 100f;

    float xRotation = 0f;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        // Make the camera follow the player
        transform.position = player.position + offset;

        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.fixedDeltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.fixedDeltaTime;

        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -90f, 90f);

        transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
        player.Rotate(Vector3.up * mouseX);

    }
}

如果我把这个摄像机放回我的播放器对象下面,并去掉带有“偏移”的线,它就可以工作,但是如果摄像机单独工作,它就不能工作。

fnvucqvd

fnvucqvd1#

我想我找到了。
代替

transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);

试试

transform.rotation = Quaternion.Euler(xRotation, player.rotation.eulerAngles.y, 0f);

(编辑)
以便摄影机也跟随球员的Y旋转,而不仅仅是位置。
希望这有帮助!
亚历克莎

5hcedyr0

5hcedyr02#

相机不旋转,因为你在脚本中旋转的是玩家对象,而不是相机连接的对象。而且你在脚本中没有任何关于玩家水平旋转的引用。3DartBlade在第一条评论中向你展示了如何使相机和玩家水平旋转相等[ transform.rotation = Quaternion.Euler(xRotation,player.rotation.euler.y,0 f);],但如果你有从播放器偏移,你不会得到所需的行为相机在这样的方式。最简单的方式来实现所需的行为(3D人物相机)是创建一个空对象与脚本:

public Transform player;
private void LateUpdate() {
    transform.position = player.transform.position;
    transform.rotation = player.transform.rotation;
}

并使用上一个对象的附加摄影机子对象创建您的空对象,并在其上使用下一个脚本:

public Vector3 offset;
public float mouseSensitivity = 100f;
float xRotation = 0f;
void Start() {
    transform.position = cube.position + offset;
}
private void LateUpdate() {
    float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
    xRotation -= mouseY;
    xRotation = Mathf.Clamp(xRotation, -90f, 90f);

    transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
}

然后,你应该在PlayerController脚本中实现球员绕Y轴旋转。在相机控制脚本中控制球员没有意义。当然,你可以,但它会在将来造成很大的问题。
还有几点注意事项:
1.你应该在LateUpdate()方法中移动或旋转你的相机,而不是在Update()中。因为,否则它可能会导致相机抖动。
1.不要在Update()或LateUpdate()方法中使用Time.fixedDeltaTime。它没有意义并且可能导致错误的行为。在FixedUpdate()方法中使用它-当您使用物理时。在Update()中,LateUpdate()使用Time. deltaTime。
1.对于先进和容易的相机控制-使用电影机包是最好的做法。你会松散一些时间来学习这个工具(从15分钟到一个小时),但它会使您的生活更容易在未来。

相关问题