上次我們完成用Unity 建完一張椅子,還有學習基本變數的應用,那我們就繼續寫更多的腳本,來讓物體有更多的變化~~~
#一般不會用Unity來建模(不會這麼傻啦),模型主要還是要靠其他3D軟體導入 :)
動次~棟次~動動起來~~
準備好你的椅子(Chair)還有地板(Ground),我們開始
新建一個腳本(C# Script),我們命名ChairMoveScript
先新增一個條件式
if (Input.GetKey("w"))
{
this.gameObject.transform.Translate(new Vector3( 1, 0, 0));
}
先測試看看按下 "W" 鍵,是否可以前進
解釋一下這段話意思
// 如果玩家按下 "W" 鍵
// 系統自行尋找 "W" 按鍵
// 讓這個遊戲物體沿著世界坐標系中的 x 軸正方向移動1個單位距離
如果我們把剩下的ASD的移動都把他補上
#這時候,你會發現椅子速度比高鐵還快 :( 🏃🏃🏃🏃🏃
為啥會有這樣情形產生呢?
Ans: 很簡單,上禮拜有說到在Update方法,是每一幀都在判斷,所以一幀跑1個單位,1秒就跑60個單位,所以才會這麼快。
我們需要鎮定劑來緩解他飛快的速度
在 Unity 中,Time.deltaTime
是一個非常重要的屬性,表示兩次幀之間的時間間隔。通常用於計算物體的移動、旋轉、縮放等變換時,以確保這些變換在不同的遊戲環境和不同的設備上都能保持一致的速度和流暢度。
Time.deltaTime
是以秒為單位,表示上一個畫面和當前畫面之間的時間間隔。使用它可以讓你的遊戲在不同的幀率(FPS,Frames Per Second)下都能保持相同的速度,避免遊戲在不同設備上運行時出現速度不一致的情況。
那我們就在new Vector3( 1* Time.deltaTime
, 0, 0)).........用乘以*的方式加上去
速度好像有點慢ㄋㄟ,宣告一個變數來控制速度好ㄌ
新增一個速度(Speed)變數,好讓我們之後可以調整
public float speed = 1.0f;
然後再把速度乘進去new Vector3( 1 * Time.deltaTime * Speed
, 0, 0))
應該就會好很多了~~
不過,我們人移動很少橫向的移動吧,除非你是螃蟹🦀🦀🦀
我們都是用頭/身體轉來換方向啦,所以我們transform.Translate
要更改一下組件
transform.
Rotate
左右控制的 A & D Translate(座標) 改成 Rotate(旋轉)
有變合理了齁~~讚讚👍🏽👍🏽👍🏽👍🏽👍🏽
我們再給椅子一個跳躍往上的力量
if (Input.GetKey("space")) //系統自行尋找 空白鍵按鍵
{
this.gameObject.transform.Translate(new Vector3(0, 1 * Time.deltaTime * Speed, 0));
}
測試看看,好像又怪怪的,沒關係我們來想辦法
再宣告一個變數,要使用這個特殊的變數獨有的性質,去做變化
private Rigidbody rb;
然後再void Start()打上
rb = GetComponent<Rigidbody>();
像這樣
來解釋一下
private Rigidbody rb;
rb = GetComponent<Rigidbody>();
private Rigidbody rb;
定義了一個私有(private)的 Rigidbody 變數,名稱為 rb。這個變數用於儲存從遊戲物件中獲取的 Rigidbody 組件。
rb = GetComponent<Rigidbody>();
。從遊戲物件中獲取 Rigidbody 組件並將其賦值給 rb 變數。通常都在 Start 方法中執行這樣的操作,因為 Start 方法在遊戲物件被啟用時執行一次,可以確保遊戲物件已經初始化完成。
<>內都是裝特殊的變數類型,比如說
<Rigidbody>(模擬物體的物理行為,比如移動、碰撞等)
<Collider>(處理物體的碰撞和觸發事件)
<MeshRenderer>(控制物體的顯示和渲染)
<AudioSource>(播放音效)
上述程式碼(應該)只在 MonoBehaviour 的衍生類中使用,因為 GetComponent
方法是 Unity 引擎提供的 MonoBehaviour 方法之一,用於獲取遊戲物件上的組件。
我們得到了Rigidbody內的就可以用它的功能了
velocity// 改變物體的速度
AddForce// 應用向前的推力
angularVelocity // 改變物體的角速度
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(new Vector2(0, 200));
}
GetKey():當透過你所指定的按鍵被使用者按住時回傳true,是按住,就是長按的意識,例如你想控制角色在你按住方向鍵時移動,那麼就是用GetKey()。
GetKeyDown():當透過你所按下指定名稱的按鍵時的那一幀時回傳true,是那一幀,就一下的事情,不管你按多久,只是在你按下的那一瞬間。
最後我們把上述的東西,用一個自創方法把它包起來,整理起來比較好看一點,之後如果要打包出去,直接呼叫方法名就可以用了,
目前沒有要給其他人或外部使用,我們可以先用private限制他的權限,方法名稱我們先叫BaseMove吧....
BaseMove();................這邊是一個函式用來呼叫方法
private void BaseMove().............這邊寫方法的內容
{
}
這樣就完成簡單的物體移動了!
.
.
.
.
.
.
.
.
.
.
大家可以先把前面的文字註解起來,之後回去可以跟朋友分享打得多辛苦 ><
複習一下註解,有兩種方式,對付一行的或對付一段的~~
對付一行:
// 15445 I'm Gavin.
對付一段:
/* 15445 I'm Gavin. 15445 I'm Gavin. 15445 I'm Gavin.
I'm a student now. I'm a student now. I'm a student now.
Happy every day */
原本是還要宣告一個變數,然後再呼叫變數來使用
EX:
float verticalInput = Input.GetAxis("Vertical"); // 獲取垂直軸的輸入值
Vector3 moveDirection = new Vector3(0, 0, verticalInput); // 創建移動方向向量
不過Unity都幫你想好了,不用宣告可以直接使用。
this.gameObject.transform.Translate(Input.GetAxis("Vertical") * Speed * Time.deltaTime, 0, 0);
this.gameObject.transform.Rotate(0, Input.GetAxis("Horizontal") * 60 * Time.deltaTime, 0);
這樣就完成更簡單的物體移動了!