移动,旋转,缩放

2017-12-20  本文已影响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;
}

}

上一篇下一篇

猜你喜欢

热点阅读