前言

更新於 發佈於 閱讀時間約 7 分鐘

前言

這篇文章會講解如何拖曳 3D 物件。我的代碼實現了二個主要的功能就是拖曳和限制拖曳的方式。不廢話直上代碼。

using UnityEngine;

public class Move : MonoBehaviour
{
private Vector3 _offset;
private float _zCoord;

public Type moveType;
public enum Type
{
normal,
XAxis,
YAxis,
ZAxis,
XYPlane,
YZPlane,
ZXPlane
}

private void OnMouseDown()
{
_zCoord = Camera.main.WorldToScreenPoint(transform.position).z;
_offset = transform.position - GetMouseWorldPos();
}
private Vector3 GetMouseWorldPos()
{
Vector3 mousePoint = Input.mousePosition;
mousePoint.z = _zCoord;
return Camera.main.ScreenToWorldPoint(mousePoint);
}
private void OnMouseDrag()
{
Vector3 newPos = new Vector3(0, 0, 0);
switch (moveType)
{
case Type.normal:
newPos = GetMouseWorldPos() + _offset;
break;
case Type.XAxis:
newPos.x = GetMouseWorldPos().x + _offset.x;
newPos.y = transform.position.y;
newPos.z = transform.position.z;
break;
case Type.YAxis:
newPos.x = transform.position.x;
newPos.y = GetMouseWorldPos().y + _offset.y;
newPos.z = transform.position.z;
break;
case Type.ZAxis:
newPos.x = transform.position.x;
newPos.y = transform.position.y;
newPos.z = GetMouseWorldPos().z + _offset.z;
break;
case Type.XYPlane:
newPos.x = GetMouseWorldPos().x + _offset.x;
newPos.y = GetMouseWorldPos().y + _offset.y;
newPos.z = transform.position.z;
break;
case Type.YZPlane:
newPos.x = transform.position.x;
newPos.y = GetMouseWorldPos().y + _offset.y;
newPos.z = GetMouseWorldPos().z + _offset.z;
break;
case Type.ZXPlane:
newPos.x = GetMouseWorldPos().x + _offset.x;
newPos.y = transform.position.y;
newPos.z = GetMouseWorldPos().z + _offset.z;
break;
}
transform.position = newPos;
}
}

講解

代碼最核心是以下幾句:

private void OnMouseDown()
{
_zCoord = Camera.main.WorldToScreenPoint(transform.position).z;
_offset = transform.position - GetMouseWorldPos();
}

private Vector3 GetMouseWorldPos()
{
Vector3 mousePoint = Input.mousePosition;
mousePoint.z = _zCoord;
return Camera.main.ScreenToWorldPoint(mousePoint);
}

private void OnMouseDrag()
{
transform.position = GetMouseWorldPos() + _offset;
}

有很人都不了解 GetMouseWorldPos 的部分,為甚麼要這樣寫。Input.mousePosition 是一個二維座標(x, y ),而我們現在要是三維座標(x, y, z),所以要補一個 Z座標。

  • Camera.main.WorldToScreenPoint(Vector3 Position): 將位置從世界空間轉換為螢幕空間。
  • Camera.main.ScreenToWorldPoint(Vector3 Position): 將一個點從螢幕空間轉換為世界空間,其中世界空間被定義為遊戲層次結構最頂端的座標系。

拖曳

為甚麼要給予一個 offset ,而不能直接是滑鼠的座標呢。以下是直接是滑鼠的座標的結果。

raw-image

可以見到點擊方塊時會有一個少少移動,有小小不自然的感覺。

限制方向

其實做法十分之簡單,就是將物件的 X Y Z分別計算。當只可以橫向移動,就改 y軸 的數值,而其他二兩個值 Y Z 就固定,就完成了!!!

avatar-img
0會員
7內容數
這裏分享我遊戲開發的記錄,亦會分享開發的小技巧。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
夏葉 的其他內容
緣由 生成一個格子是一件十分之簡單的事,但我不知道為甚麼每一次重新寫的時候,都會忘記如何寫。所以我在這裏記錄一下。 代碼 public float num; public GameObject currentGameObject; void Update() { if(Input.G
這篇文章深入探討如何利用 Lerp 來實現物體的移動,並介紹透過 Slerp 來獲得更流暢的移動效果。以簡化移動的實現過程。文章將比較 Update 和 IEnumerator 兩種方案,並指導讀者如何設定速度、加速度及移動時間,提供全面的學習資源以助於更佳理解,尤其是對於遊戲開發者。
從個連結中下載這個資料夾 https://github.com/h8man/NavMeshPlus 打開剛下載的資料夾,然後將一個名 NavMeshComponents 的資料夾放入你的 Unity 中。 創建一個 Square,作為平面,新增一個名為 Navigation Modifier 的
Text Mesh Pro 是 Unity 內自置的 UI 文字系統。如果你已經用了 Unity 很多年的人會好奇,它和 Text 有甚麼的分別。總括來講 Text Mesh Pro 更加的靈活和可以做更多不同的變化。 Sprite Asset Sprite Asset 以簡單來說是 emoji
緣由 生成一個格子是一件十分之簡單的事,但我不知道為甚麼每一次重新寫的時候,都會忘記如何寫。所以我在這裏記錄一下。 代碼 public float num; public GameObject currentGameObject; void Update() { if(Input.G
這篇文章深入探討如何利用 Lerp 來實現物體的移動,並介紹透過 Slerp 來獲得更流暢的移動效果。以簡化移動的實現過程。文章將比較 Update 和 IEnumerator 兩種方案,並指導讀者如何設定速度、加速度及移動時間,提供全面的學習資源以助於更佳理解,尤其是對於遊戲開發者。
從個連結中下載這個資料夾 https://github.com/h8man/NavMeshPlus 打開剛下載的資料夾,然後將一個名 NavMeshComponents 的資料夾放入你的 Unity 中。 創建一個 Square,作為平面,新增一個名為 Navigation Modifier 的
Text Mesh Pro 是 Unity 內自置的 UI 文字系統。如果你已經用了 Unity 很多年的人會好奇,它和 Text 有甚麼的分別。總括來講 Text Mesh Pro 更加的靈活和可以做更多不同的變化。 Sprite Asset Sprite Asset 以簡單來說是 emoji
你可能也想看
Google News 追蹤
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
到目前為止,我們所模擬的萬有引力,是一個物體吸引另一個物體,或者是一個物體吸引多個物體。然而,在真實世界中,每個物體都會互相吸引,所以在這一節中,就來把模擬的情境,擴展成多個物體互相吸引。
Thumbnail
模擬世界是我們寫程式造出來的,我們就是模擬世界的主宰,所以各種作用力要長什麼樣子、要怎麼個作用法,都由我們決定。不過,如果希望這些作用力看起來像真實世界的作用力一樣,那在寫程式的時候,套用這些作用力在真實世界中的物理公式,會是比較省時省力的做法。
到目前為止,為了簡化問題,我們都假設物體的質量是1。接下來,我們將移除這個假設,然後將完全符合牛頓第二運動定律的apply_force()方法,整合到Mover這個類別中。
這一節談的是牛頓的三大運動定律,以及力對於物體運動狀態的影響。
介紹以物件導向的方式,以向量來實作物體運動的模擬程式。
介紹如何在模擬物體運動時,引入加速度這個物理量。
Thumbnail
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
使用向量來處理問題有很多好處,其中一個好處,就是可以減少變數的數量。在這節中,會用一個簡單的例子來介紹,使用向量跟不使用向量,對變數的數量會有什麼樣的影響。
這一章介紹向量(vector)這個在物理、工程等領域非常重要的數學工具,以及如何用它來模擬一些物理現象。
Thumbnail
曾經對一個數學不好,但是喜歡玩電玩的親友小孩說,你現在討厭的正數,負數的代數計算,就是電玩裡頭的人物,可以左右上下移動,發射子彈,跳躍的基礎。 我舉微軟c語言寫遊戲的例子,(+,0)是向右,(-,0)是向左,(0,+)是向上,(0,-)是向下,(0,+)是向上,而跳躍旋轉則是三角函
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
到目前為止,我們所模擬的萬有引力,是一個物體吸引另一個物體,或者是一個物體吸引多個物體。然而,在真實世界中,每個物體都會互相吸引,所以在這一節中,就來把模擬的情境,擴展成多個物體互相吸引。
Thumbnail
模擬世界是我們寫程式造出來的,我們就是模擬世界的主宰,所以各種作用力要長什麼樣子、要怎麼個作用法,都由我們決定。不過,如果希望這些作用力看起來像真實世界的作用力一樣,那在寫程式的時候,套用這些作用力在真實世界中的物理公式,會是比較省時省力的做法。
到目前為止,為了簡化問題,我們都假設物體的質量是1。接下來,我們將移除這個假設,然後將完全符合牛頓第二運動定律的apply_force()方法,整合到Mover這個類別中。
這一節談的是牛頓的三大運動定律,以及力對於物體運動狀態的影響。
介紹以物件導向的方式,以向量來實作物體運動的模擬程式。
介紹如何在模擬物體運動時,引入加速度這個物理量。
Thumbnail
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
使用向量來處理問題有很多好處,其中一個好處,就是可以減少變數的數量。在這節中,會用一個簡單的例子來介紹,使用向量跟不使用向量,對變數的數量會有什麼樣的影響。
這一章介紹向量(vector)這個在物理、工程等領域非常重要的數學工具,以及如何用它來模擬一些物理現象。
Thumbnail
曾經對一個數學不好,但是喜歡玩電玩的親友小孩說,你現在討厭的正數,負數的代數計算,就是電玩裡頭的人物,可以左右上下移動,發射子彈,跳躍的基礎。 我舉微軟c語言寫遊戲的例子,(+,0)是向右,(-,0)是向左,(0,+)是向上,(0,-)是向下,(0,+)是向上,而跳躍旋轉則是三角函