触摸屏手势控制镜头旋转与缩放

 //用于绑定参照物对象  
    var target : Transform;  
    //缩放系数  
    var distance = 10.0;  
    //左右滑动移动速度  
    var xSpeed = 250.0;  
    var ySpeed = 120.0;  
    //缩放限制系数  
    var yMinLimit = -20;  
    var yMaxLimit = 80;  
    //摄像头的位置  
    var x = 0.0;  
    var y = 0.0;  
    //记录上一次手机触摸位置判断用户是在左放大还是缩小手势  
    private var oldPosition1 : Vector2;  
    private var oldPosition2 : Vector2;  
 
    //初始化游戏信息设置  
    function Start () {  
        var angles = transform.eulerAngles;  
        x = angles.y;  
        y = angles.x;  
 
        // Make the rigid body not change rotation  
        if (rigidbody)  
            rigidbody.freezeRotation = true;  
    }  
 
    function Update ()  
    {  
        //判断触摸数量为单点触摸  
        if(Input.touchCount == 1)  
        {  
            //触摸类型为移动触摸  
            if(Input.GetTouch(0).phase==TouchPhase.Moved)  
            {  
                //根据触摸点计算X与Y位置  
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02;  
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;  
 
            }  
        }  
 
        //判断触摸数量为多点触摸  
        if(Input.touchCount >1 )  
        {  
            //前两只手指触摸类型都为移动触摸  
            if(Input.GetTouch(0).phase==TouchPhase.Moved??Input.GetTouch(1).phase==TouchPhase.Moved)  
            {  //Unity3D教程手册:www.unitymanual.com
                    //计算出当前两点触摸点的位置  
                    var tempPosition1 = Input.GetTouch(0).position;  
                    var tempPosition2 = Input.GetTouch(1).position;  
                    //函数返回真为放大,返回假为缩小  
                    if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2))  
                    {  
                        //放大系数超过3以后不允许继续放大  
                        //这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改  
                        if(distance > 3)  
                        {  
                            distance -= 0.5;  
                        }  
                    }else  
                    {  
                        //缩小洗漱返回18.5后不允许继续缩小  
                        //这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改  
                        if(distance < 18.5)  
                        {  
                            distance += 0.5;  
                        }  
                    }  
                //备份上一次触摸点的位置,用于对比  
                oldPosition1=tempPosition1;  
                oldPosition2=tempPosition2;  
            }  
        }  
    }  
 
    //函数返回真为放大,返回假为缩小  
    function isEnlarge(oP1 : Vector2,oP2 : Vector2,nP1 : Vector2,nP2 : Vector2) : boolean  
    {  
        //函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势  
        var leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y));  
        var 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;  
        }  
    }  
     //Unity3D教程手册:www.unitymanual.com
    //Update方法一旦调用结束以后进入这里算出重置摄像机的位置  
    function LateUpdate () {  
 
        //target为我们绑定的箱子变量,缩放旋转的参照物  
        if (target) {         
 
            //重置摄像机的位置  
            y = ClampAngle(y, yMinLimit, yMaxLimit);  
            var rotation = Quaternion.Euler(y, x, 0);  
            var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;  
 
            transform.rotation = rotation;  
            transform.position = position;  
        }  
    }  
 
    static function ClampAngle (angle : float, min : float, max : float) {  
        if (angle < -360)  
            angle += 360;  
        if (angle > 360)  
            angle -= 360;  
        return Mathf.Clamp (angle, min, max);  
    }  

 

    using UnityEngine;  
    using System.Collections;  
 
    public class Move : MonoBehaviour {  
    public GameObject target;  
    public float distance = 10.0f;  
 
    public float xSpeed = 250.0f;  
    public float ySpeed = 120.0f;  
    Vector3 tmp;  
    public float yMinLimit = -20;  
    public float yMaxLimit = 80;  
 
    public float x = 0.0f;  
    public float y = 0.0f;  
 
    private Vector2 oldPosition1;  
    private Vector2 oldPosition2;  
 
    void Start (){  
        Vector2 angles= transform.eulerAngles;  
        x = angles.y;  
        y = angles.x;  
 
        // Make the rigid body not change rotation  
        if (rigidbody)  
            rigidbody.freezeRotation = true;  
    }  
    void Update (){  
 
        if(Input.touchCount == 1)  
        {  
 
            if(Input.GetTouch(0).phase==TouchPhase.Moved)  
            {  
 
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;  
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;  
                y=ClampAngle(y,yMinLimit,yMaxLimit);  
 
            }  
        }  
 
 
        if(Input.touchCount >1 )  
        {  
 
            if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved)  
            {  
 
                    Vector3 tempPosition1= Input.GetTouch(0).position;  
                    Vector3 tempPosition2= Input.GetTouch(1).position;  
                    if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2))  
                    {  
                        if(distance > 3)  
                        {  
                            distance -= 0.5f;     
                        }   //Unity3D教程手册:www.unitymanual.com
                    }else  
                    {  
                        if(distance < 18.5f)  
                        {  
                            distance += 0.5f;  
                        }  
                    }  
                oldPosition1=tempPosition1;  
                oldPosition2=tempPosition2;  
            }  
        }  
    }  
 
         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;   
        }  
    }  //Unity3D教程手册:www.unitymanual.com
        public void LateUpdate (){  
        if (target) {         
 
            ClampAngle(y, yMinLimit, yMaxLimit);  
            Quaternion rotation= Quaternion.Euler(y, x, 0);  
 
            tmp.Set(0.0f, 0.0f, (-1)*distance);   
            Vector3 position= rotation * tmp + target.transform.position;  
 
            transform.rotation = rotation;  
            transform.position = position;  
        }  
    }  
        static float ClampAngle ( float angle ,   float min ,   float max  ){  
        if (angle < -360)  
            angle += 360;  
        if (angle > 360)  
            angle -= 360;  
        return Mathf.Clamp (angle, min, max);  
    }  
 
    } 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity是一款功能齐全的游戏引擎,它提供了一系列便捷的工具和模块让程序员开发游戏更加容易。其中包括了触摸屏控制模型旋转缩放的功能。 想要在Unity中实现模型的旋转缩放,我们需要编写一些代码。首先,我们需要定义一个变量来存储触摸屏幕的位置,当用户触摸屏幕时,我们可以利用Input.touchCount语句来查询触摸的数量。然后,我们可以使用Input.GetTouch (int index)语句来获得特定触摸的信息,例如触摸的位置。我们可以使用这些触摸信息来改变模型的旋转缩放。 例如,我们可以定义一个变量来存储我们想要缩放的对象: [SerializeField] private Transform _myObject; 然后,我们可以在Update()的一段代码中来处理触摸和缩放的相关逻辑: void Update(){ if(Input.touchCount == 2){ Touch touchZero = Input.GetTouch(0); Touch touchOne = Input.GetTouch(1); Vector2 touchZeroPreviousPosition = touchZero.position - touchZero.deltaPosition; Vector2 touchOnePreviousPosition = touchOne.position - touchOne.deltaPosition; float previousTouchDeltaMagnitude = (touchZeroPreviousPosition - touchOnePreviousPosition).magnitude; float touchDeltaMagnitude = (touchZero.position - touchOne.position).magnitude; float deltaMagnitudeDiff = previousTouchDeltaMagnitude - touchDeltaMagnitude; _myObject.localScale -= Vector3.one * deltaMagnitudeDiff * 0.01f; } } 这段代码会侦测两个手指是否点击了屏幕,然后读取触摸的位置信息,计算两个触摸点之间的距离差, 用扩展因子(0.01f)乘以这个距离差作为缩放的参数来调整模型的大小。 Unity的触摸控制旋转缩放功能让游戏开发变得更加轻松和快捷,它使程序员能够专注于游戏的设计和娱乐性,而不需要关注底层细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小姑娘很大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值