1.在边界时移动
鼠标到达游戏界面的边界时开始移动相机,适用于PC端、需要鼠标的游戏。
if (Input.mousePosition.y > Screen.height)
{
m_camFollowPos.y += moveAmount * Time.deltaTime;
}
if (Input.mousePosition.y < 0)
{
m_camFollowPos.y -= moveAmount * Time.deltaTime;
}
if (Input.mousePosition.x > Screen.width)//如果鼠标位置在右侧
{
m_camFollowPos.x += moveAmount * Time.deltaTime;//就向右移动
}
if (Input.mousePosition.x < 0)
{
m_camFollowPos.x -= moveAmount * Time.deltaTime;
}
m_camFollowPos.y = Mathf.Clamp(m_camFollowPos.y, m_minCamYPos, m_maxCamYPos);
m_camFollowPos.x = Mathf.Clamp(m_camFollowPos.x, m_minCamXPos, m_maxCamXPos);
myCamera.transform.position = m_camFollowPos;//刷新摄像机位置
2. 按住鼠标/触摸时拖动相机
在PC端按住鼠标拖动相机。在移动端单指按住拖动相机。
void Update()
{
if (GameRoot.Instance.isMenuActive)
{
return;
}
#if (UNITY_ANDROID || UNITY_IPHONE) && !UNITY_EDITOR
HandleTouchInput();
#else
HandleMouseInput();
#endif
}
void HandleTouchInput()
{
if (Input.touchCount == 1)
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
m_prevPosition = touch.position;
}
else if (touch.phase == TouchPhase.Moved)
{
Vector2 curPosition = touch.position;
MoveCamera(m_prevPosition, curPosition);
m_prevPosition = curPosition;
}
}
}
void HandleMouseInput()
{
if (Input.GetMouseButtonDown(0))
{
m_prevPosition = Input.mousePosition;
}
else if (Input.GetMouseButton(0))
{
Vector2 curMousePosition = Input.mousePosition;
MoveCamera(m_prevPosition, curMousePosition);
m_prevPosition = curMousePosition;
}
}
private void MoveCamera(Vector2 prevPosition, Vector2 curPosition)
{
//注意这里的myCamera.nearClipPlaen。由于我使用的是透视相机,所以需要将z值改为这个
//如果读者使用的是正交相机,可能不需要这个
Vector2 offset = (myCamera.ScreenToWorldPoint(new Vector3(prevPosition.x, prevPosition.y, myCamera.nearClipPlane)) - myCamera.ScreenToWorldPoint(new Vector3(curPosition.x, curPosition.y, myCamera.nearClipPlane)));
//这里的m_cameraScale,因为我不想修改nearClipPlaen的值来达到移动的快慢,所以加了个移动参数
Vector2 newPos = new Vector2(transform.localPosition.x + offset.x * m_cameraScaleVal, transform.localPosition.y + offset.y * m_cameraScaleVal);
newPos.y = Mathf.Clamp(newPos.y, m_minCamYPos, m_maxCamYPos);
newPos.x = Mathf.Clamp(newPos.x, m_minCamXPos, m_maxCamXPos);
transform.position = new Vector3(newPos.x, newPos.y, transform.position.z);
}