Unity實(shí)現(xiàn)鼠標(biāo)拖動3D物體
這篇博客實(shí)現(xiàn)一個(gè)小功能,通過鼠標(biāo)拖動3D物體。我們知道,如果是拖動 UIUG 的控件的話,它是有接口可以使用的。但是3D物體就沒有可直接使用的接口(或者說我沒找到?),就需要我們自己寫代碼。既然如此,那我們就來實(shí)現(xiàn)以下這個(gè)功能。
首先先創(chuàng)建一個(gè)這樣的場景
創(chuàng)建兩個(gè) cube 只是為了看清效果。然后給 攝像機(jī)添加一個(gè) 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> /// 是否點(diǎn)擊到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); 得到一個(gè) 10 進(jìn)制表示的層 的名字 這里既第十層 // LayerMask.NameToLayer("Cube"); 得到 名字為 Cube 的層的 10 進(jìn)制 //使用位運(yùn)算,因?yà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> /// 檢查是否點(diǎn)擊到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; } }
添加此腳本后運(yùn)行,就能成功看見效果。
今天這個(gè)工程比較簡單,就不發(fā)工程了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- unity實(shí)現(xiàn)鼠標(biāo)經(jīng)過時(shí)ui及物體的變色操作
- Unity 實(shí)現(xiàn)鼠標(biāo)滑過UI時(shí)觸發(fā)動畫的操作
- unity 鼠標(biāo)移入彈出UI的操作
- unity 如何判斷鼠標(biāo)是否在哪個(gè)UI上(兩種方法)
- Unity實(shí)現(xiàn)移動物體到鼠標(biāo)點(diǎn)擊位置
- Unity實(shí)現(xiàn)鼠標(biāo)點(diǎn)2D轉(zhuǎn)3D進(jìn)行旋轉(zhuǎn)
- unity實(shí)現(xiàn)鼠標(biāo)跟隨(ITween)
- unity 鼠標(biāo)懸停事件操作
相關(guān)文章
基于WPF實(shí)現(xiàn)路徑圖標(biāo)控件
這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)路徑圖標(biāo)控件,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的小伙伴可以參考一下2023-07-07C#使用TCP協(xié)議實(shí)現(xiàn)數(shù)據(jù)發(fā)送和接受的方法
這篇文章主要介紹了c#使用TCP協(xié)議實(shí)現(xiàn)數(shù)據(jù)發(fā)送和接受,使用TCP協(xié)議實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接受包括客戶端和服務(wù)端兩個(gè)部分,本文通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04C#實(shí)現(xiàn)合并多個(gè)word文檔的方法
這篇文章主要介紹了C#實(shí)現(xiàn)合并多個(gè)word文檔的方法,是C#針對Word文檔操作的一個(gè)非常重要的技巧,需要的朋友可以參考下2014-09-09Winform實(shí)現(xiàn)將網(wǎng)頁生成圖片的方法
這篇文章主要介紹了Winform實(shí)現(xiàn)將網(wǎng)頁生成圖片的方法,類似于一般瀏覽器自帶的網(wǎng)頁生成圖片的功能,需要的朋友可以參考下2014-09-09