資料夾結構 Folder Structure
Unity 專案的檔案結構依照各個專案、開發者的不同而有所歧異,不過最重要的是==保持整個專案的一致性。==
:::success 例如:
Assets
|---Audio
|---Fonts
|---Materials
|---Models
|---Prefabs
|---Resources
|---Prefabs
|---Scenes
|---Scripts
|---MainGame
|---MainUI
|---Sprites
|---Texture
或是
Assets
|---Art
|---Materials
|---Models
|---Sprites
|---Texture
|---Audio
|---Fonts
|---Prefabs
|---Resources
|---Scenes
|---Scripts
|---MainUI
|---MainGame
:::
沒有特別的規定,==不要把各種無關或不同類別的東西混在一起==就好,拜託 🙏
:::info
Unity 有一些特殊的資料夾名稱,他們有特別的意義:
Editor
- 編輯器專用腳本,建置不會打包
Plugins
- 輸出平台專屬 library
- 例如 Android 的 jar/aar 檔會放在
Plugin/Android/
底下
Resources
- 裡面所有的資源可以用
Resources.Load(相對路徑)
讀取出來 - 但請注意裡面所有的資源在建置時都會全部打包,不論是否有被引用。
- 裡面所有的資源可以用
StreamingAssets
- 建置時檔案會原封不動的輸出,可以直接使用檔案讀寫 (除了 Android, WebGL)。 https://docs.unity3d.com/Manual/StreamingAssets.html
{檔案/資料夾名稱}~
/.{檔案/資料夾名稱}
(忽略檔案/資料夾)- 只要檔案/資料夾前面加個
.
、或是後面加個~
,都會被 Unity 給忽略。
- 只要檔案/資料夾前面加個
這些資料夾不論在專案的哪一層,Unity 只要看到這名字都會判定為特殊資料夾。
其餘詳見 https://docs.unity3d.com/Manual/SpecialFolders.html :::
腳本 Scripts
命名習慣 Naming Convention
==檔案命名盡量與其中包含的 class 相同== (MonoBehaviour 則是強制要相同)
而如何取名?看得懂就好,==最好讓別人能看檔案名稱就知道這程式大概是在幹嘛。==
:::success DO
MainUIController.cs
AimCameraToPlayer.cs
BreathSensorConfig.cs
ResultData.cs
DON'T
AAA.cs
Board.cs
Test_EnemyTask.cs
:::
檔案結構 File Structure
:::success Example:
Assets
|---Scripts
|---Api
...
|---Models
|---ResultData.cs
...
|---MainGame
|---MainGameController.cs
|---Player
|---PlayerController.cs
...
|---UI
|---MainGameUI.cs
...
...
|---MainUI
|---MainUiController.cs
...
...
...
:::
程式碼風格與格式 Code Style & Practice
根據微軟發布之 C#語言 guideline
- ==class 與 method name 使用 PascalCase== (所以檔名通常也是)
- ==local variable 跟 parameter 通常使用 camelCase==
其他包含
- 大括號放下面
- indent 空 4 格
而關於命名習慣,Unity 官方提出過 guideline:
- ==一般使用名詞作為變數名稱==
- bool 例外,e.g.
isGameOver
,hasWeapon
- event/action 例外 e.g.
OnClick
,OnSkillActivate
- bool 例外,e.g.
- ==不要使用意義不明或過度簡化的名稱==
- 錯誤範例:
test
,a
,rtt
,msvmtSpeed
- 除非該值是出自數學或是有明確、易理解的意義 e.g.
pi
,playerHp
- 錯誤範例:
- ==public field使用 PascalCase;非 public field 選用 camelCase==
- 非 public 變數為了與區域變數區分有一些變體,例如前加底線
_
、或是使用m_
、m
前綴
- 非 public 變數為了與區域變數區分有一些變體,例如前加底線
:::success
/// <summary>
/// Some info about MyClass bruhbruhbruh
/// </summary>
public class MyClass
{
public static float MyStaticPublicField = 487.63f;
private static double _myStaticPrivateField = 94.87;
public int MyPublicField = 94;
private int _myPrivateField = 87;
protected int _myProtectedField = 63;
protected bool isMyMethodCalled = false;
public UnityEvent OnMyMethodCalled = new UnityEvent();
public void MyMethod(int myParameter)
{
int myLocalVar = 0;
isMyMethodCalled = true;
OnMyMethodCalled.Invoke();
}
}
:::
以上皆非強制,不要讓接手你的 code 的人看到氣鼓鼓大概就沒問題 🥰
撰寫註解 Writing Comments
請看上面綠框中的範例,MyClass
上方有個 summary 的部分,裡面可以記載關於這個 class 裡面的註解。
==所有變數/函式都可以寫 summary==,一般在設定好的編輯器只要打三次 /
會自動產生 <summary></summary>
模板。==滑鼠移到該變數/函式上面就會顯示該註解==。
另外關於程式執行的段落也請==適當撰寫註解,提升程式可讀性==。
:::success Example
:::
版本控制 (git) Version Control
實驗室是使用 git 做版控,有自己的 git server,帳號請洽學長姊協助申請。
關於 git 版控,有些人使用 GUI (e.g. SourceTree),或是比較硬核的人可能直接打指令,當然各家編輯器大多也支援 git,挑個順手的就好。
不論你用什麼,==請務必在 Unity 專案頂層 (有 Assets/
Library/
等等的資料夾) 加上 .gitignore
檔案==,標示哪些東西不需要上傳:
Unity 專案的 .gitignore
:::success ![](https://hackmd.io/_uploads/SyY1SJSW6.png =220x) ![](https://hackmd.io/_uploads/r1AzBJHZ6.png =250x) vscode 加上 .gitignore 前後的差異
請確定路徑,不然很多不需要的東西都會打包上去 :::
Tips
如何跨場景傳參數
- 使用
PlayerPrefs
儲存參數 - 使用
DontDestroyOnLoad
偷渡某個物件過場景 (不過要記得刪除)
如何用 VSCode 開發
:::info 安裝 Unity 時如果沒特別點掉,會連帶幫你安裝 Visual Studio,可以直接用那個就好。 但是如果你跟我一樣比較喜歡 VSCode,就看這吧😉
:::spoiler 點擊展開😉
-
安裝 Unity 套件
-
開啟 Unity > Window > Package Manager,如果有看到 Visual Studio Code Editor,請移除。
-
同樣畫面,請升級 Visual Studio Editor 至 2.0.20 以上版本
-
Unity > Edit > Preferences > External Tools 選擇 External Script Editor 為 VSCode,確認底下有一排小字
Visual Studio Editor v.X.X.XX Enabled
,按底下的 Regenerate project files
:::
God Knows... :musical_note: