DragMove

/***

  • 鼠标拖拽对象移动+惯性运动
  • 脚本挂载在要鼠标拖拽对象上
  • 对象需要添加collider组件,Rigidbody组件动态添加
  • 多个对象需要设置不同的标签Tag=“Player”
    *非子萧
    *201706
    */
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

public class DragMove : MonoBehaviour
{
private Vector3 _vec3TargetScreenSpace;// 目标物体的屏幕空间坐标
private Vector3 _vec3TargetWorldSpace;// 目标物体的世界空间坐标
private Transform _trans;// 目标物体的空间变换组件
private Vector3 _vec3MouseScreenSpace;// 鼠标的屏幕空间坐标
private Vector3 _vec3Offset;// 偏移

public bool isInerti = true;//是否具有惯性=是
private Rigidbody _Rigidbody;//刚体组件
public float floInertiForce = 5f;//惯性大小
public float floInertiDrag = 0.5f;//阻力大小
public string srtTag = "Player";//对象的标签

void Awake() { _trans = transform; }

void Start()
{
    StartCoroutine(OnMouseDown());//开始协程,鼠标点击对象,拖动对象移动

    _Rigidbody = gameObject.AddComponent();//对象动态添加刚体组件    
    _Rigidbody.useGravity = false;//对象刚体不使用重力
    _Rigidbody.drag = floInertiDrag;//对象刚体受到阻力
    _trans.tag = srtTag;//设置对象的标签
}
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();
    }
}
void FixedUpdate()
{

if UNITY_EDITOR

    if (Input.GetMouseButton(0))
    {
        float x = Input.GetAxis("Mouse X");//鼠标水平移动的距离
        float y = Input.GetAxis("Mouse Y");//鼠标垂直移动的距离

        //射线检测,鼠标点到对象,对象才可以拖动,才有惯性速度
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            //鼠标点到的对象的tag=="Player"
            if (hit.collider.gameObject.tag == srtTag)
            {
                if (isInerti)//是否具有惯性
                {
                    //鼠标弹起后,物体的获得刚体速度,速度大小为,鼠标滑动的距离*力            
                    _Rigidbody.velocity = new Vector3(x * floInertiForce, y * floInertiForce, 0);
                }
            }
        }
    }

endif

if UNITY_ANDROID

    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
    {
        float x = Input.GetTouch(0).deltaPosition.x;
        float y = Input.GetTouch(0).deltaPosition.y;
        if (Input.GetTouch(0).phase == TouchPhase.Ended)
        {   //射线检测,鼠标点到对象,对象才可以拖动,才有惯性速度
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                //鼠标点到的对象的tag=="Player"
                if (hit.collider.gameObject.tag == srtTag)
                {
                    if (isInerti)//是否具有惯性
                    {
                        //鼠标弹起后,物体的获得刚体速度,速度大小为,鼠标滑动的距离*力            
                        _Rigidbody.velocity = new Vector3(x * floInertiForce, y * floInertiForce, 0);
                    }
                }
            }
        }
    }

endif

}

}

你可能感兴趣的:(DragMove)