1. 程式人生 > >unity 觸屏程式碼(二)相機運動

unity 觸屏程式碼(二)相機運動

public Transform target;//主相機要圍繞其旋轉的物體
    public float distance = 3.0f;//主相機與目標物體之間的距離

    [HideInInspector]
    public float eulerAngles_x;
    [HideInInspector]
    public float eulerAngles_y;

    public float distanceMax = 10;//主相機與目標物體之間的最大距離
    public float distanceMin = 1;//主相機與目標物體之間的最小距離
    public float xSpeed = 5.0f;//主相機水平方向旋轉速度
    public float ySpeed = 5.0f;//主相機縱向旋轉速度
    public int yMaxLimit = 360;//最大y(單位是角度)
    public int yMinLimit = -360;//最小y(單位是角度)


    //放大縮小系數
    private float scal;
    public float scaleSpeed = 0.2f;

    //滾輪相關
    public LayerMask CollisionLayerMask;

    //觸碰兩點
    private Vector2 oldPosition1 = new Vector2(0, 0);
    private Vector2 oldPosition2 = new Vector2(0, 0);

    private float XX, YY;


    void Start()
    {
        Vector3 eulerAngles = this.transform.eulerAngles;//當前物體的尤拉角
        this.eulerAngles_x = eulerAngles.y;
        this.eulerAngles_y = eulerAngles.x;
    }


    void Update()
    {

        OneAndTwo();

    }

    /// <summary>
    /// 手指觸屏判斷
    /// </summary>
    public void OneAndTwo()
    {

        Vector3 eulerAngles = this.transform.eulerAngles;//當前物體的尤拉角
        this.eulerAngles_x = eulerAngles.y;
        this.eulerAngles_y = eulerAngles.x;

        //一根手指觸碰,旋轉
        if (Input.touchCount == 1)
        {
            //print("一隻手指觸屏!");

            if (Input.touches[0].phase == TouchPhase.Began)
            {
                //記錄手指剛觸碰的位置
                XX = Input.touches[0].position.x;
                YY = Input.touches[0].position.y;

            }

            if (Input.touches[0].phase == TouchPhase.Moved) //手指在螢幕上移動
            {

                this.eulerAngles_x += (Input.touches[0].position.x - XX) * Time.deltaTime * this.xSpeed;
                this.eulerAngles_y -= (Input.touches[0].position.y - YY) * Time.deltaTime * this.ySpeed;
                this.eulerAngles_y = ClampAngle(this.eulerAngles_y, (float)this.yMinLimit, (float)this.yMaxLimit);

                XX = Input.touches[0].position.x;
                YY = Input.touches[0].position.y;

            }

        }


        //兩根手指觸碰,放大縮小
        if (Input.touchCount == 2)
        {

            if (Input.touches[0].phase == TouchPhase.Began || Input.GetTouch(1).phase == TouchPhase.Began)
            {
                //記錄手指剛觸碰的位置
                oldPosition1 = Input.GetTouch(0).position;
                oldPosition2 = Input.GetTouch(1).position;
            }


            // 前兩隻手指觸控型別都為移動觸控
            if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
            {
                // print("兩隻手指觸屏!");
                //記錄出當前兩點觸控點的位置
                var tempPosition1 = Input.GetTouch(0).position;
                var tempPosition2 = Input.GetTouch(1).position;

                // 函式返回真為放大,返回假為縮小
                if (isEnlarge(oldPosition1, oldPosition2, tempPosition1, tempPosition2))
                {
                    scal = -0.1f;
                }
                else
                {
                    scal = 0.1f;
                }
                // 備份上一次觸控點的位置,用於對比
                oldPosition1 = tempPosition1;
                oldPosition2 = tempPosition2;

            }
            else
            {
                scal = 0;
            }

        }
        else
        {
            scal = 0;
        }

        Quaternion quaternion = Quaternion.Euler(this.eulerAngles_y, this.eulerAngles_x, (float)0);

        this.distance = Mathf.Clamp(this.distance - (scal * scaleSpeed), (float)this.distanceMin, (float)this.distanceMax);

        //從目標物體處,到當前指令碼所依附的物件(主相機)發射一個射線,如果中間有物體阻隔,則更改this.distance(這樣做的目的是為了不被擋住)
        RaycastHit hitInfo = new RaycastHit();
        if (Physics.Linecast(this.target.position, this.transform.position, out hitInfo, this.CollisionLayerMask))
        {
            this.distance = hitInfo.distance - 0.05f;
        }
        Vector3 vector = ((Vector3)(quaternion * new Vector3(0, 0, -this.distance))) + this.target.position;

        //更改主相機的旋轉角度和位置
        this.transform.rotation = quaternion;
        this.transform.position = vector;

    }


    //把角度限制到給定範圍內
    public float ClampAngle(float angle, float min, float max)
    {
        while (angle < -360)
        {
            angle += 360;
        }
        while (angle > 360)
        {
            angle -= 360;
        }

        return Mathf.Clamp(angle, min, max);
    }
    // 函式返回真為放大,返回假為縮小
    public bool isEnlarge(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2)
    {
        // 函式傳入上一次觸控兩點的位置與本次觸控兩點的位置計算出使用者的手勢
        float leng1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));
        float leng2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));

        if (leng1 > leng2)
        {
            // 放大手勢
            return true;
        }
        else
        {
            // 縮小手勢
            return false;
        }
    }