限制团结正交相机平移运动

时间:2015-12-22 07:49:32

标签: c# unity3d game-engine orthographic

我有一个脚本,通过使用鼠标中键控制Unity中的正交摄像机平移运动。世界中心(0,0,0)的空GameObject(例如名称为MainCamPivot(请参见图片))充当摄像机的父级。相机本身具有Vector3的局部欧拉角(45f,225f,0f)。我可以使用此脚本(连接到相机)在X轴和Y轴上很好地平移/移动相机:

public float panSpeed = 0.05f;

private Vector3 lastMousePos;

void Start ()
{
    lastCamPos = transform.position;
}

void Update()
{
   if(Input.GetMouseButtonDown(2))
   {
      lastMousePos = Input.mousePosition;
   }
   if(Input.GetMouseButton(2))
   {
      Vector3 touchDeltaPosition = Input.mousePosition - lastMousePos;
      transform.Translate(-touchDeltaPosition.x * panSpeed, -touchDeltaPosition.y * panSpeed, 0);
      lastMousePos = Input.mousePosition;
   }

   // To limit the orthographic camera panning movement:
   if(transform.localPosition.x < 10f) transform.localPosition = new Vector3(10f, transform.localPosition.y, 16.3f);
   if(transform.localPosition.x > 23f) transform.localPosition = new Vector3(23f, transform.localPosition.y, 16.3f);
   if(transform.localPosition.y < 15f) transform.localPosition = new Vector3(transform.localPosition.x, 15f, 16.3f);
   if(transform.localPosition.y > 28f) transform.localPosition = new Vector3(transform.localPosition.x, 28f, 16.3f);
}

为限制相机平移移动,我为相机的X和Y位置设置了一些限制。问题是摄像机的Z位置值总是在变化,因此为摄像机的Z位置设置固定位置会使摄像机像对齐下图一样平移/移动:

Wrong camera movement

使用脚本编写正确限制正交相机平移运动的最佳方法是什么? (如下图所示)

Camera panning movement should follow mouse movement

1 个答案:

答案 0 :(得分:0)

如果不是使用枢轴,请在玩家按住按钮时根据鼠标位置的不同设置摄像机的位置。您在上面尝试做的是相对于块状物体移动相机。相反,您应该相对于自身移动相机。

当用户点击按钮并在LateUpdate()中获取鼠标位置,而玩家仍按住按钮,请致电:

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

public class CameraMovement : MonoBehaviour {

    private Vector3 InitialClickPosition;
    private bool Pan = false;
    private const int MOUSE_BUTTON = 0;

    private void LateUpdate()
    {
        if (Input.GetMouseButtonDown(MOUSE_BUTTON))
        {
            InitialClickPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        }
        else if (Input.GetMouseButton(MOUSE_BUTTON))
        {
            var difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - Camera.main.transform.position;
            Camera.main.transform.position = InitialClickPosition - difference;
        }
    }
}

有效。