1.手指操作代碼
public class InputManager : MonoBehaviour {
Vector3 CameraMoveStartPos; //相機滑動按下的位置
private Vector2 currTouch1; //相機縮放手1位置
private Vector2 currTouch2; //相機縮放手2位置
private void LateUpdate()
{
if (Input.GetMouseButtonDown(0)) //按下
{
CameraMoveStartPos = Input.mousePosition;
}
else if (Input.GetMouseButton(0)) //滑動
{
MoveCame();
}
if (Application.isMobilePlatform) //縮放
{
Touch Touch1 = Input.GetTouch(0);
Touch Touch2 = Input.GetTouch(1);
if (Touch1.phase == TouchPhase.Moved && Touch2.phase == TouchPhase.Moved)
{
Vector2 p1 = Touch1.position;
Vector2 p2 = Touch2.position;
float l1 = Vector2.Distance(currTouch1, p1);
float l2 = Vector2.Distance(currTouch2, p2);
if (l1 > 2 && l2 > 2)
{
if (GetEnlarge(currTouch1, currTouch2, p1, p2))
{
CameraManager.GetInstance().CameraZoom(true);
}
else
{
CameraManager.GetInstance().CameraZoom(false);
}
currTouch1 = Touch1.position;
currTouch2 = Touch2.position;
}
}
}
}
bool GetEnlarge(Vector2 currp1, Vector2 currp2, Vector2 nP1, Vector2 nP2)//得到是相機縮放是放大 還是縮小
{
float length1 = Mathf.Sqrt((currp1.x - currp2.x) * (currp1.x - currp2.x) + (currp1.y - currp2.y) * (currp1.y - currp2.y));
float length2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));
return (length1 < length2) ? true : false;
}
void MoveCame() //單手移動相機的方法
{
Vector3 p1 = CameraMoveStartPos;
Vector3 P2 = Input.mousePosition;
RaycastHit hit;
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out hit, 1024, 1 << LayerMask.NameToLayer("CameraMoveClick"));
P2 = hit.point;
ray = Camera.main.ScreenPointToRay(CameraMoveStartPos);
Physics.Raycast(ray, out hit, 1024, 1 << LayerMask.NameToLayer("CameraMoveClick"));
p1 = hit.point;
Vector3 cameraMoveSpeed = new Vector3((P2 - p1).x*-1, 0, (P2 - p1).z*-1);
if (cameraMoveSpeed.sqrMagnitude > 0)
{
CameraManager.GetInstance().CameraMove(cameraMoveSpeed.x, 0, cameraMoveSpeed.z);
}
Vector3 moveVec = (Input.mousePosition - CameraMoveStartPos).normalized;
CameraMoveStartPos = Input.mousePosition;
}
2.相機移動 放大縮小
public class CameraManager : MonoBehaviour {
static CameraManager Instance;
private Vector3 moveVector; //相機拖動移動距離
public Vector3 movesuof; //相機縮放距離
private void Awake()
{
Instance = this;
}
public static CameraManager GetInstance()
{
return Instance;
}
public void CameraMove(float px,float py,float pz) //相機移動
{
if(Mathf.Abs(px) < 0.1f && Mathf.Abs(pz) < 0.1f)
{
return;
}
moveVector = Vector3.zero;
moveVector = new Vector3(px, 0, pz);
}
private void LateUpdate()
{
Vector3 tempLookPos = this.transform.position + moveVector;
this.transform.position = Vector3.Lerp(this.transform.position, tempLookPos, 0.5f);
moveVector = Vector3.zero;
UpdateCameraZoom();
}
public void CameraZoom(bool zoom) //相機縮小放大
{
movesuof = Vector3.zero;
if (zoom)
{
movesuof = new Vector3(0, -2, 0);
}
else
{
movesuof = new Vector3(0, 2, 0);
}
}
private void UpdateCameraZoom()
{
Vector3 tempLookPos = this.transform.position + movesuof;
this.transform.position = Vector3.Lerp(this.transform.position, tempLookPos, 0.5f);
movesuof = Vector3.zero;
}