[Godot] Your first 3D game 練習
前一個 2D Game 初步照著教學 step by step 完成了
儘管其中還有許多不明所以的地方
例如一些計算速率的數學問題 不會就是不會
因為幾乎還沒啃過官方文件就直接進入了新手範例教學
整體編輯器、Godot 元件都還有大量未知的部分
嘗試了匯出 Windows、Html5 平台檔案出來執行
也看到 Build 功能中仍有許多水很深的設定需要了解
無論如何,先繼續往下一個 3D 教學前進 ...
教學網址
https://docs.godotengine.org/en/stable/getting_started/first_3d_game/index.html
這次學乖了先切換了一下 en 語系,不幸的是上面明確地寫了這份文件是 outdated,還沒有針對 4.1 版做更新。
沒關係我們還是先照著試試看:
20230813 補充:
後來實作時有比對了一下 en / zh-CN 文件,發現英文版應該還是有更新成 4 版的語法,
可能只是沒有經過完整校對,還是寫了警語在上面,所以後來我就直接看英文版了。
因此這篇筆記主要就不是針對 3 / 4 版之間的差異,而是我個人覺得想記錄的一些要點
Setting up the game area
- 第一步是下載相關 Assets
與《My First 2D Game》不同的是,這份教學 Assets 內包含了一個現成的 Project。
2D 範例則是從自己 New 一個 Proect 開始 - Import Project 直接選 .zip (不需解壓縮),匯入時會提示這是一份 Godot 3 專案
接下來會有一些選項要你決定是否嘗試轉換成 Godot 4 專案、轉換不能反悔要記得備份等警語
Player scene and input actions
Moving the player with code
Vector 的 Normalize
這裡有段程式碼在處理收到玩家移動指令 => 改變角色的位移
其中呼叫了Vector3.normalized()
if Input.is_action_pressed("move_right"): direction.x += 1 // 按右的話 x 軸 +1 if Input.is_action_pressed("move_left"): direction.x -= 1 if Input.is_action_pressed("move_back"): direction.z += 1 // 按下的話 z 軸 +1 if Input.is_action_pressed("move_forward"): direction.z -= 1 if direction != Vector3.ZERO: direction = direction.normalized() $Pivot.look_at(position + direction, Vector3.UP)
並有一段 Tip 說:
In case the player presses, say, both W and D simultaneously, the vector will have a length of about 1.4. But if they press a single key, it will have a length of 1. We want the vector's length to be consistent, and not move faster diagonally. To do so, we can call its normalize() method.
查了一下似乎是遊戲中很常見的移動速率控制 (不論 2D、3D)。
大概意思是當玩家只按了「上」或「右」時,角色往「上」或「右」移動速度都是 1,
但如果玩家同時壓了「上 + 右」,會產生一個往右上約 1.4 的速率,
(想像一個邊長 1 的正方形,中間斜對角線是根號 2,大約是 1.4)結果就是玩家斜向移動的話會比較快,而這可能不是我們要的結果。
因此一般會提供一個 Normalize 方法,讓往任何方向移動的速率都固定是 1像剛剛說的往右上移動,Normalize 後 Vector 大約是 (0.7, 0.7)
- 從 gamedev.net 偷的圖
- 分割 Viewport
- Godot 在 3D View 提供最多分割成 4 個畫面,方便從不同視角觀察世界
- 按畫面右上的 View 選擇,或是快速鍵 Ctrl + (Alt) + 1~4
Designing the mob scene
- 在處理例如 Mob 物件的銷毀 (離開畫面可視範圍後就可以刪除物件、釋放相關記憶體及資源)。為了避免系統在執行垃圾回收時造成畫面卡頓,可以採用所謂 pooling 的方式
具體上是建立一個 array 並預先產生裡面的物件,以及一些 reuse 機制- 但在用 C#、Lua 等有垃圾回收機制的語言才需要,GDScript 處理方式不同不需要
- 詳細以後有機會再研究
- 但在用 C#、Lua 等有垃圾回收機制的語言才需要,GDScript 處理方式不同不需要
Spawning monsters
- 一些 3D View 的操作 Tips
- 可以用鍵盤右邊數字鍵切換視角 (類似 Blender)
- 移動物件時可以按 y 切換 snap 依附模式,讓物件在 Grid 上對齊格線
- ctrl + D 可以複製物件
Jumping and squashing monsters
To be continued ...
留言區
成為第一位留言的人!