主要思路是鼠标拖拽的时候,记录下移动的距离和方向,然后同步操作相机的移动。
代码如下:
private void Update()
{
#if UNITY_EDITOR
if (Input.GetMouseButtonDown(0))
{
Debug.Log("Mouse Button Down");
Ray myRay = _bgCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(myRay, out hitInfo))
{
_startPosition = hitInfo.point;
}
_isDragging = false;
}
if (Input.GetMouseButtonUp(0))
{
Debug.Log("Mouse Button Up");
_isDragging = false;
}
if (!_isDragging && Input.GetMouseButton(0))
{
Ray myRay = _bgCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(myRay, out hitInfo))
{
Vector3 length = hitInfo.point - _startPosition;
if (length.sqrMagnitude > 0.01f)
{
_isDragging = true;
}
}
}
ScrollCameraSize();
#elif PLATFORM_ANDROID
StringBuilder logSb = new StringBuilder();
if (Input.GetTouch(0).phase == TouchPhase.Began)
{
logSb.AppendLine("Finger DOWN");
_slgui.ShowLog(logSb.ToString());
Ray myRay = _bgCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(myRay, out hitInfo))
{
_startPosition = hitInfo.point;
}
_isDragging = false;
}
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
logSb.AppendLine("Finger Dragging");
_slgui.ShowLog(logSb.ToString());
_isDragging = true;
}
if (Input.GetTouch(0).phase == TouchPhase.Ended)
{
logSb.AppendLine("Finger UP");
_slgui.ShowLog(logSb.ToString());
_isDragging = false;
}
#endif
if (_isDragging)
{
Ray myRay = _bgCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(myRay, out hitInfo))
{
Vector3 move = (hitInfo.point - _startPosition);
float length = Vector3.SqrMagnitude(move);
Vector3 normalMove = Vector3.Normalize(move);
_horizontal = -normalMove.x * _dragSpeed * length;
_vertical = -normalMove.z * _dragSpeed * length;
MoveOffset(_horizontal, _vertical);
}
}
}
private void MoveOffset(float horizontal, float vertical)
{
Vector3 offset = Vector3.zero;
offset.x = horizontal * 0.2f;//moveSpeed * Time.deltaTime
offset.z = vertical * 0.2f;//moveSpeed * Time.deltaTime
bool changePos = false;
var bgPos = _bgCamera.transform.position + _bgCameraRight * offset.x * _moveAngel + _bgCameraForward * offset.z * _moveAngel * _moveAngelOffset;
if (bgPos.x < _bgCameraMinX || bgPos.x > _bgCameraMaxX)
{
offset.x = 0;
changePos = true;
}
if (bgPos.z < _bgCamerMinZ || bgPos.z > _bgCameraMaxZ)
{
offset.z = 0;
changePos = true;
}
var bgNewPos = changePos
? _bgCamera.transform.position + _bgCameraRight * offset.x * _moveAngel + _bgCameraForward * offset.z * _moveAngel * _moveAngelOffset
: bgPos;
_bgCamera.transform.position = Vector3.Lerp(_bgCamera.transform.position, bgNewPos, Time.deltaTime*moveSpeed);
var cameraPos = _camera.transform.position + _mainCameraRight * offset.x + _mainCameraForward * offset.z;
_camera.transform.position = Vector3.Lerp(_camera.transform.position, cameraPos, Time.deltaTime*moveSpeed);
}