Unity實現滑鼠拖動3D物體
阿新 • • 發佈:2020-10-13
這篇部落格實現一個小功能,通過滑鼠拖動3D物體。我們知道,如果是拖動 UIUG 的控制元件的話,它是有介面可以使用的。但是3D物體就沒有可直接使用的介面(或者說我沒找到?),就需要我們自己寫程式碼。既然如此,那我們就來實現以下這個功能。
首先先建立一個這樣的場景
建立兩個 cube 只是為了看清效果。然後給 攝像機新增一個 DragObject 指令碼
using UnityEngine; using System.Collections; public class DragObject : MonoBehaviour { /// <summary> /// 將要拖動的物體 /// </summary> private Transform dragGameObject; /// <summary> /// 獲取射線需要碰撞的層 /// </summary> private LayerMask canDrag; /// <summary> /// 直接從外部定義好層,簡單理解 /// </summary> public LayerMask canDrag2; /// <summary> /// 獲得滑鼠的位置和cube位置差 /// </summary> private Vector3 offset; /// <summary> /// 是否點選到cube /// </summary> private bool isClickCube; /// <summary> /// 目標物件的螢幕座標 /// </summary> private Vector3 targetScreenPoint; // Use this for initialization void Start () { // LayerMask.GetMask("Cube"); 得到 名字為 Cube 的層的 2 進位制 // LayerMask.LayerToName(9); 得到一個 10 進製表示的層 的名字 這裡既第十層 // LayerMask.NameToLayer("Cube"); 得到 名字為 Cube 的層的 10 進位制 //使用位運算,因為 LayerMask (好像)是以2進位制儲存的 Layer 的層是以0開始 canDrag = 1 << LayerMask.NameToLayer("Cube"); } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) { if (CheckGameObject()) { offset = dragGameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,targetScreenPoint.z)); } } if (isClickCube) { //當前滑鼠所在的螢幕座標 Vector3 curScreenPoint = new Vector3(Input.mousePosition.x,targetScreenPoint.z); //把當前滑鼠的螢幕座標轉換成世界座標 Vector3 curWorldPoint = Camera.main.ScreenToWorldPoint(curScreenPoint); dragGameObject.position = curWorldPoint + offset; } if (Input.GetMouseButtonUp(0)) { isClickCube = false; } } /// <summary> /// 檢查是否點選到cbue /// </summary> /// <returns></returns> bool CheckGameObject () { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; if (Physics.Raycast(ray,out hitInfo,100f,canDrag)) { isClickCube = true; //得到射線碰撞到的物體 dragGameObject = hitInfo.collider.gameObject.transform; targetScreenPoint = Camera.main.WorldToScreenPoint(dragGameObject.position); return true; } return false; } }
新增此指令碼後執行,就能成功看見效果。
今天這個工程比較簡單,就不發工程了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。