unity 單手拖動場景,雙手縮放場景一相機

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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章