Unity實(shí)現(xiàn)鼠標(biāo)拖動(dòng)3D物體
這篇博客實(shí)現(xiàn)一個(gè)小功能,通過(guò)鼠標(biāo)拖動(dòng)3D物體。我們知道,如果是拖動(dòng) UIUG 的控件的話,它是有接口可以使用的。但是3D物體就沒(méi)有可直接使用的接口(或者說(shuō)我沒(méi)找到?),就需要我們自己寫(xiě)代碼。既然如此,那我們就來(lái)實(shí)現(xiàn)以下這個(gè)功能。
首先先創(chuàng)建一個(gè)這樣的場(chǎng)景

創(chuàng)建兩個(gè) cube 只是為了看清效果。然后給 攝像機(jī)添加一個(gè) DragObject 腳本
using UnityEngine;
using System.Collections;
public class DragObject : MonoBehaviour {
/// <summary>
/// 將要拖動(dòng)的物體
/// </summary>
private Transform dragGameObject;
/// <summary>
/// 獲取射線需要碰撞的層
/// </summary>
private LayerMask canDrag;
/// <summary>
/// 直接從外部定義好層,簡(jiǎn)單理解
/// </summary>
public LayerMask canDrag2;
/// <summary>
/// 獲得鼠標(biāo)的位置和cube位置差
/// </summary>
private Vector3 offset;
/// <summary>
/// 是否點(diǎn)擊到cube
/// </summary>
private bool isClickCube;
/// <summary>
/// 目標(biāo)對(duì)象的屏幕坐標(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)制存儲(chǔ)的 Layer 的層是以0開(kāi)始
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)行,就能成功看見(jiàn)效果。
今天這個(gè)工程比較簡(jiǎn)單,就不發(fā)工程了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- unity實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)時(shí)ui及物體的變色操作
- Unity 實(shí)現(xiàn)鼠標(biāo)滑過(guò)UI時(shí)觸發(fā)動(dòng)畫(huà)的操作
- unity 鼠標(biāo)移入彈出UI的操作
- unity 如何判斷鼠標(biāo)是否在哪個(gè)UI上(兩種方法)
- Unity實(shí)現(xiàn)移動(dòng)物體到鼠標(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ì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的小伙伴可以參考一下2023-07-07
C#使用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è)部分,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
C#使用selenium實(shí)現(xiàn)爬蟲(chóng)
這篇文章介紹了C#使用selenium實(shí)現(xiàn)爬蟲(chóng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
C#實(shí)現(xiàn)合并多個(gè)word文檔的方法
這篇文章主要介紹了C#實(shí)現(xiàn)合并多個(gè)word文檔的方法,是C#針對(duì)Word文檔操作的一個(gè)非常重要的技巧,需要的朋友可以參考下2014-09-09
使用JsonConverter處理上傳文件的路徑問(wèn)題
我們上傳一個(gè)文件,把文件保存到服務(wù)器上,會(huì)有一個(gè)明確的物理路徑,由于需要從前端訪問(wèn)這個(gè)文件,還需要web服務(wù)器中的一個(gè)虛擬路徑,我們可以使用JsonConverter 來(lái)自動(dòng)處理一下,這篇文章主要介紹了使用JsonConverter處理上傳文件的路徑,需要的朋友可以參考下2022-12-12
Winform實(shí)現(xiàn)將網(wǎng)頁(yè)生成圖片的方法
這篇文章主要介紹了Winform實(shí)現(xiàn)將網(wǎng)頁(yè)生成圖片的方法,類似于一般瀏覽器自帶的網(wǎng)頁(yè)生成圖片的功能,需要的朋友可以參考下2014-09-09

