Unity實現(xiàn)鼠標(biāo)拖動3D物體
這篇博客實現(xiàn)一個小功能,通過鼠標(biāo)拖動3D物體。我們知道,如果是拖動 UIUG 的控件的話,它是有接口可以使用的。但是3D物體就沒有可直接使用的接口(或者說我沒找到?),就需要我們自己寫代碼。既然如此,那我們就來實現(xiàn)以下這個功能。
首先先創(chuàng)建一個這樣的場景
創(chuàng)建兩個 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> /// 獲得鼠標(biāo)的位置和cube位置差 /// </summary> private Vector3 offset; /// <summary> /// 是否點擊到cube /// </summary> private bool isClickCube; /// <summary> /// 目標(biāo)對象的屏幕坐標(biāo) /// </summary> private Vector3 targetScreenPoint; // Use this for initialization void Start () { // LayerMask.GetMask("Cube"); 得到 名字為 Cube 的層的 2 進(jìn)制 // LayerMask.LayerToName(9); 得到一個 10 進(jìn)制表示的層 的名字 這里既第十層 // LayerMask.NameToLayer("Cube"); 得到 名字為 Cube 的層的 10 進(jìn)制 //使用位運算,因為 LayerMask (好像)是以2進(jìn)制存儲的 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) { //當(dāng)前鼠標(biāo)所在的屏幕坐標(biāo) Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreenPoint.z); //把當(dāng)前鼠標(biāo)的屏幕坐標(biāo)轉(zhuǎn)換成世界坐標(biāo) 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; } }
添加此腳本后運行,就能成功看見效果。
今天這個工程比較簡單,就不發(fā)工程了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用TCP協(xié)議實現(xiàn)數(shù)據(jù)發(fā)送和接受的方法
這篇文章主要介紹了c#使用TCP協(xié)議實現(xiàn)數(shù)據(jù)發(fā)送和接受,使用TCP協(xié)議實現(xiàn)數(shù)據(jù)的發(fā)送和接受包括客戶端和服務(wù)端兩個部分,本文通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04Winform實現(xiàn)將網(wǎng)頁生成圖片的方法
這篇文章主要介紹了Winform實現(xiàn)將網(wǎng)頁生成圖片的方法,類似于一般瀏覽器自帶的網(wǎng)頁生成圖片的功能,需要的朋友可以參考下2014-09-09