拖拽物體腳本

需求

鼠標按下選擇某個物體,拖拽,鬆開後停止拖拽

實現代碼

    using System.Collections;
    using UnityEngine;

    public class DragObject : 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();
            }
        }
    }

使用方法

直接把該腳本添加到對應物體即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章