Unity實現鼠標拖動3D物體
更新時間:2020年10月13日 08:37:52 作者:羅松_ls
這篇文章主要為大家詳細介紹了Unity實現鼠標拖動3D物體,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇博客實現一個小功能,通過鼠標拖動3D物體。我們知道,如果是拖動 UIUG 的控件的話,它是有接口可以使用的。但是3D物體就沒有可直接使用的接口(或者說我沒找到?),就需要我們自己寫代碼。既然如此,那我們就來實現以下這個功能。
首先先創(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>
/// 獲得鼠標的位置和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, Input.mousePosition.y, 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;
}
}
添加此腳本后運行,就能成功看見效果。
今天這個工程比較簡單,就不發(fā)工程了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C#使用TCP協(xié)議實現數據發(fā)送和接受的方法
這篇文章主要介紹了c#使用TCP協(xié)議實現數據發(fā)送和接受,使用TCP協(xié)議實現數據的發(fā)送和接受包括客戶端和服務端兩個部分,本文通過實例代碼介紹的非常詳細,需要的朋友可以參考下2024-04-04

