首先单击屏幕可更改相机在物体上的位置和角度

问题描述 投票:0回答:1

在给定的脚本中,摄像机在游戏开始时设置在某个位置。要调整视图,我必须使用鼠标拖动。但是,第一次单击屏幕时,相机位置和角度会略有变化。

public class CameraOrbit : MonoBehaviour
{
    public Camera cam;
    public Transform target;
    public float radius = 10;
    private Vector3 currentPosition;

    public Vector3 positionPreOffset;
    public Vector3 rotationPreOffset;

    private void Start()
    {
        // Calculate the initial camera position based on target, position offset, and rotation offset.
        Vector3 desiredPosition = target.position + target.rotation * positionPreOffset;
        cam.transform.position = desiredPosition;

        Quaternion desiredRotation = target.rotation * Quaternion.Euler(rotationPreOffset);
        cam.transform.rotation = desiredRotation;

        // Store the current camera position and calculate the radius.
        currentPosition = cam.transform.position;
        radius = currentPosition.magnitude;
    }

    private void LateUpdate()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // Store the current mouse position when the left mouse button is clicked.
            currentPosition = cam.ScreenToViewportPoint(Input.mousePosition);
        }
        else if (Input.GetMouseButton(0))
        {
            // Calculate the new mouse position.
            Vector3 newPosition = cam.ScreenToViewportPoint(Input.mousePosition);

            // Calculate the direction of mouse movement.
            Vector3 direction = currentPosition - newPosition;

            // Calculate rotation angles based on mouse movement.
            float rotationYAxis = -direction.x * 90;
            float rotationXAxis = direction.y * 90;

            // Reset the camera's position to the target's position.
            cam.transform.position = target.transform.position;

            // Apply the calculated rotations to the camera's rotation.
            cam.transform.rotation *= Quaternion.Euler(rotXaxis, rotYaxis, 0);
            cam.transform.Translate (new Vector3(0, 0, -radius));

            currentPosition = newPosition;
        }

我希望相机的位置在第一次鼠标单击屏幕时不会改变,并在调整/更改视图之前保持其位置和角度。

c# unity-game-engine camera
1个回答
0
投票

你完全忽略了之前应用的

positionPreOffset
rotationPreOffset

你为什么不简单地使用

Transform.RotateAround
:

private void LateUpdate()
{
    if (Input.GetMouseButtonDown(0))
    {
        // Store the current mouse position when the left mouse button is clicked.
        currentPosition = cam.ScreenToViewportPoint(Input.mousePosition);
    }
    else if (Input.GetMouseButton(0))
    {
        // Calculate the new mouse position.
        var newPosition = cam.ScreenToViewportPoint(Input.mousePosition);

        // Calculate the direction of mouse movement.
        var direction = currentPosition - newPosition;

        // Calculate rotation angles based on mouse movement.
        var rotationYAxis = -direction.x * 90;
        var rotationXAxis = direction.y * 90;

        cam.transform.RotateAround(target.position, Vector3.up, rotationYAxis);
        cam.transform.RotateAround(target.position, cam.transform.right, rotationXAxis);

        currentPosition = newPosition;
    }
}

顺便说一句,还解决了在本地空间中进行两次旋转的问题,而现在可以在全局 Y 轴上正确旋转

© www.soinside.com 2019 - 2024. All rights reserved.