美文网首页
移动,旋转,缩放

移动,旋转,缩放

作者: 萧非子 | 来源:发表于2017-12-20 09:46 被阅读21次

    //任意拖动
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class Drag : MonoBehaviour {
    private Vector3 _vec3TargetScreenSpace;// 目标物体的屏幕空间坐标

    private Vector3 _vec3TargetWorldSpace;// 目标物体的世界空间坐标
    
    private Transform _trans;// 目标物体的空间变换组件
    
    private Vector3 _vec3MouseScreenSpace;// 鼠标的屏幕空间坐标
    
    private Vector3 _vec3Offset;// 偏移
    
    void Awake() { _trans = transform; }
    
    IEnumerator OnMouseDown()
    
    {
    
        // 把目标物体的世界空间坐标转换到它自身的屏幕空间坐标
    
        _vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);
    
        // 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标)
    
        _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
    
        // 计算目标物体与鼠标物体在世界空间中的偏移量
    
        _vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);
    
        // 鼠标左键按下
    
        while (Input.GetMouseButton(0))
    
        {
    
            // 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标)
    
            _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
    
            // 把鼠标的屏幕空间坐标转换到世界空间坐标(Z值使用目标物体的屏幕空间坐标),加上偏移量,以此作为目标物体的世界空间坐标
    
            _vec3TargetWorldSpace = Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace) + _vec3Offset;
    
            // 更新目标物体的世界空间坐标
    
            _trans.position = _vec3TargetWorldSpace;
    
            // 等待固定更新
    
            yield return new WaitForFixedUpdate();
    
        }
    
    }
    

    }

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class DragRotate : MonoBehaviour
    {
        private bool onDrag = false; //是否被拖拽//
        public float speed = 6f; //旋转速度//
        private float tempSpeed;  //阻尼速度//
        private float axisX;//鼠标沿水平方向移动的增量//
        private float axisY;  //鼠标沿竖直方向移动的增量//
        private float cXY;  //鼠标移动的距离//
        void OnMouseDown()//接受鼠标按下的事件//
        { 
            axisX = 0f;
            axisY = 0f;
        }
        void OnMouseDrag() //鼠标拖拽时的操作//
        {
            onDrag = true;
            axisX = -Input.GetAxis("Mouse X");  //获得鼠标增量//
            axisY = Input.GetAxis("Mouse Y");
            cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY); //计算鼠标移动的长度//
            if (cXY == 0f)
            {
                cXY = 1f;
            }
        }
        float Rigid()//计算阻尼速度//
        {
            if (onDrag)
            {
                tempSpeed = speed;
            }
            else
            {
                if (tempSpeed > 0)
                {
                    tempSpeed -= speed * 2 * Time.deltaTime / cXY; //通过除以鼠标移动长度实现拖拽越长速度减缓越慢//
                }
                else
                {
                    tempSpeed = 0;
                }
            }
            return tempSpeed;
        }
        void Update()
        {
            transform.Rotate(new Vector3(axisY, axisX, 0) * Rigid(), Space.World);
            if (!Input.GetMouseButton(0))
            {
                onDrag = false;
            }
        }
    }
    

    using UnityEngine;
    using System.Collections;

    public class Scale : MonoBehaviour
    {
    private Touch oldTouch1; //上次触摸点1(手指1)
    private Touch oldTouch2; //上次触摸点2(手指2)

    void Start()
    {
    
    }
    void Update()
    {
        //没有触摸  主线程 ,另起线程 归零
        if (Input.touchCount <= 0)
        {
            return;
        }
    
        //多点触摸, 放大缩小  
        Touch newTouch1 = Input.GetTouch(0);
        Touch newTouch2 = Input.GetTouch(1);
    
        //第2点刚开始接触屏幕, 只记录,不做处理  
        if (newTouch2.phase == TouchPhase.Began)
        {
            oldTouch2 = newTouch2;
            oldTouch1 = newTouch1;
            return;
        }
    
        //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型  
        float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
        float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
    
        //两个距离之差,为正表示放大手势, 为负表示缩小手势  
        float offset = newDistance - oldDistance;
    
        //放大因子, 一个像素按 0.01倍来算(100可调整)  
        float scaleFactor = offset / 100f;
        Vector3 localScale = transform.localScale;
        Vector3 scale = new Vector3(localScale.x + scaleFactor,
                localScale.y + scaleFactor,
                localScale.z + scaleFactor);
    
        //最小缩放到 0.3 倍  
        if (scale.x > 0.3f && scale.y > 0.3f && scale.z > 0.3f)
        {
            transform.localScale = scale;
        }
    
        //记住最新的触摸点,下次使用  
        oldTouch1 = newTouch1;
        oldTouch2 = newTouch2;
    }
    

    }

    相关文章

      网友评论

          本文标题:移动,旋转,缩放

          本文链接:https://www.haomeiwen.com/subject/wqgwwxtx.html