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

猜你喜欢

转载自blog.csdn.net/weixin_42399500/article/details/83307691