Unity3D鼠标&Touch拖拽控制节点绕任意轴旋转的实现

这个拖拽最明显的一个优点就是有阻尼的效果
阻尼(damping)是指摇荡系统或振动系统受到阻滞使能量随时间而耗散的物理现象

using UnityEngine;
using System.Collections;

public class RotationScript : MonoBehaviour
{
    private bool onDrag = false; //是否被拖拽//
    public float speed = 6f; //旋转速度// 
    private float tempSpeed; //阻尼速度// 
    private float axisX; //鼠标沿水平方向移动的增量// 
    private float axisY; //鼠标沿竖直方向移动的增量// 
    private float cXY; //鼠标移动的距离//


    void OnMouseDown(){ //接受鼠标按下的事件// 
        print("OnMouseDown");
        axisX =0f;
        axisY =0f;
    }

    void OnMouseDrag () //鼠标拖拽时的操作// 
    {
        print("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)//速度大于0
            {
                tempSpeed -= speed*2 * Time.deltaTime / cXY; //通过除以鼠标移动长度实现拖拽越长速度减缓越慢// 
            }
            else {
                tempSpeed = 0;
            }
        }
        return tempSpeed;
    }
    void Update () {
        gameObject.transform.Rotate (new Vector3 (axisY, axisX, 0) * Rigid (), Space.World);//全方位旋转

        //gameObject.transform.Rotate(new Vector3(gameObject.transform.rotation.x, axisX, 0) * Rigid(), Space.World);//只围绕y轴旋转
        if (!Input.GetMouseButton (0)) {
            onDrag = false;
        }

        **********************************下方的判断是为了实现--点击屏幕任意位置都可对物体进行拖拽--的效果**************************
        //else if (Input.GetMouseButtonDown(0))//点击鼠标左键时
        //{
        //    axisX = 0f;
        //    axisY = 0f;
        //}
        //else if (Input.GetMouseButton(0))//持续按住鼠标左键时
        //{            
        //    MouseMove();
        //}
    }

    public void MouseMove()//拖拽
    {
        onDrag = true;
        axisX = -Input.GetAxis("Mouse X"); //获得鼠标增量// 
        axisY = Input.GetAxis("Mouse Y");
        cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY); //计算鼠标移动的长度// 
        if (cXY == 0f)
        {
            cXY = 1f;
        }
    }
}

鸣谢~原文网址:https://wenku.baidu.com/view/d4ea6a1c4431b90d6c85c7fb.html

放在移动设备上时并没有mouse事件,脚本经过修改后Touch也可以做这样的操作

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

public class TouchScreen : MonoBehaviour
{
    private bool onDrag = false; //是否被拖拽//
    public float speed = 0.06f; //旋转速度// 
    private float tempSpeed; //阻尼速度// 
    private float axisX; //鼠标沿水平方向移动的增量// 
    private float axisY; //鼠标沿竖直方向移动的增量// 
    private float cXY; //鼠标移动的距离//
    public float RigidDiedSpeed = 80;//速度衰减速率 //取值越大,阻尼越大

 
    float Rigid() //计算阻尼速度// 
    {
        if (onDrag)//在拖拽中
        {
            tempSpeed = speed;//速度恒定
        }
        else
        {//松开了
            if (tempSpeed > 0)//速度大于0
            {
                tempSpeed -= speed * RigidDiedSpeed * Time.deltaTime / cXY; //通过除以鼠标移动长度实现拖拽越长速度减缓越慢// 
            }
            else
            {
                tempSpeed = 0;
            }
        }
        return tempSpeed;
    }
    void Update()
    {
        //gameObject.transform.Rotate(new Vector3(axisY, axisX, 0) * Rigid(), Space.World);//全方位旋转

        gameObject.transform.Rotate(new Vector3(gameObject.transform.rotation.x, axisX, 0) * Rigid(), Space.World);//只围绕y轴旋转
        if (Input.touchCount == 0)
        {
            onDrag = false;
        }
        else if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
        {
            TouchMove();
        }
    }

    public void TouchMove()//拖拽
    {
        onDrag = true;
        Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
        axisX = -touchDeltaPosition.x; //获得鼠标增量// 
        axisY = touchDeltaPosition.y;
        cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY); //计算鼠标移动的长度// 
        if (cXY == 0f)
        {
            cXY = 1f;
        }
    }
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值