在Unity中的最小,最大X,Y和Z坐标之间移动相机

时间:2018-08-03 17:34:57

标签: c# unity3d camera

我正在使用Unity制作3D游戏,并将使用 Z Q S D (我使用Azerty键盘)和鼠标滚动条进行缩放。 escape 键将切换相机的移动。

我将让我的相机停留在最小和最大区域内。为此,我使用两个min类型的变量maxVector3。这是Unity中Main Camera的配置:

这是我的代码:

using UnityEngine;

public class CameraController : MonoBehaviour
{
    [Header("Speeds")]
    public float panSpeed = 30;
    public float scrollSpeed = 5;

    [Header("Movement")]
    public bool doMovement = true;

    [Header("Min and max values")]
    public Vector3 min;
    public Vector3 max;

    private void Update()
    {
        if (Input.GetKey(KeyCode.Escape))
        {
            doMovement = !doMovement;
        }

        if (doMovement)
        {
            if (Input.GetKey(KeyCode.Z))
            {
                Move(Vector3.forward);
            }
            else if (Input.GetKey(KeyCode.S))
            {
                Move(Vector3.back);
            }
            else if (Input.GetKey(KeyCode.Q))
            {
                Move(Vector3.left);
            }
            else if (Input.GetKey(KeyCode.D))
            {
                Move(Vector3.right);
            }

            float scroll = Input.GetAxis("Mouse ScrollWheel") * 1000;

            Vector3 pos = transform.position;
            pos.y -= scroll * scrollSpeed * Time.deltaTime;
            pos.y = Mathf.Clamp(pos.y, min.y, max.y);
            transform.position = pos;
        }
    }

    private void Move(Vector3 direction)
    {
        Vector3 pos = direction * panSpeed * Time.deltaTime;
        pos.x = Mathf.Clamp(pos.x, min.x, max.x);
        pos.z = Mathf.Clamp(pos.z, min.z, max.z);

        transform.Translate(pos, Space.World); // problem 1 
        transform.position = pos;              // problem 2
    }
}

问题是当我使用按键移动相机时。我尝试了两行不同的代码,但都无法正常工作。这是我的问题。上面有我代码的注释行。

  • 第一行忽略最小值和最大值。

  • 第二行将摄像机移动时始终设置为(0, 10, 0.4970074)。我按 Q 后会出现类似的情况:

我不会同时使用这两行。

您能找到问题吗?

1 个答案:

答案 0 :(得分:2)

  • 第1行不起作用,因为transform.Translate将使对象沿Vector(而不是位置)移动。您的代码以一定的速度平移对象,并以速度而不是位置来固定。

  • 第2行不起作用,因为将移动矢量分配到该位置只会将摄像机移动到您的矢量值。

尝试一下:

transform.Translate(direction * panSpeed * Time.deltaTime);  // move object
Vector3 pos = transform.position; // get position as Vector
pos.x = Mathf.Clamp(pos.x, min.x, max.x); // clamp position
pos.z = Mathf.Clamp(pos.z, min.z, max.z);
transform.position = pos; // reassign clamped Vector to position