在遊戲定義好開發規格後,會有一些部分相似、重複的程式碼,如果每次都要經由手動進行增加,那會是非常沒效率且枯燥乏味的,使用 Scripts 自動產出的方式,將會提升開發效率,更集中快速的製作遊戲。
本系列其他文章
使用環境 與 版本
- Window 7
- Unity 5.2.4
實作原理
1.透過一個純文字版型,裡面標註KEY,如下
1 2 3 4 5 6 7 8 |
using UnityEngine; using System.Collections; [System.Serializable] public class $ClassName { $MemberFields } |
2.使用取代版型中KEY的方式,將內容寫入
實作
1.首先建立資料夾,用於存放相關資料,如下
- Editor:自動產出控制程式
- GenerateFile:放置產出的Script
- Templates:純文字版型
2.建立純文字版型(TableClass.txt),並將檔案放入 Templates 資料夾
1 2 3 4 5 6 7 8 |
using UnityEngine; using System.Collections; [System.Serializable] public class $ClassName { $MemberFields } |
3.建立控制程式(AutoGenerate.cs),並將檔案放入 Editor 資料夾
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using UnityEngine; using System.Collections; using System.IO; using UnityEditor; using System.Text; public class AutoGenerate { static string[] NAME = new string[] { "PlayerData", "EnemyData", "FriendData" }; [MenuItem("AutoGenerate/Generate")] public static void Generate() { for (int i = 0; i < NAME.Length; i++) Generate(NAME[i]); } static void Generate(string name) { TextAsset textAsset = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/AutoScripts/Templates/TableClass.txt"); string template = textAsset.ToString(); StringBuilder sb = new StringBuilder(); sb.Append("public int hp { get; set; }" + "\n"); sb.Append("public int mp { get; set; }" + "\n"); sb.Append("public int attack { get; set; }"); template = template.Replace("$ClassName", name); template = template.Replace("$MemberFields", sb.ToString()); using (var writer = new StreamWriter("Assets/AutoScripts/GenerateFile/" + name + ".cs")) { writer.Write(template); writer.Close(); } AssetDatabase.Refresh(); } } |
Line 9:宣告要實作的類別名稱
Line 11:實作 unity menu
Line 12~16:呼叫建立方法
Line 20:讀取版型
Line 24~27:實作 Script 內容 (這裡為了方便教學,每個實作內容都一樣,實際可以根據不同需求彈性定義)
Line 29~30:取代版型中的Key
Line 32~36:寫入並建立檔案
4.點選選單執行方法
Unity Menu Item → AutoGenerate → Generate
5.最後在 GenerateFile 資料夾就會看到我們建立出來的 Script 了
2016/07/27 補充
Unity 官方已經有製作一個方便 Script 產出的 Editor,可以選擇不同 Script 版型、設定名稱、實作方法…等等
Create Script Dialog
需求版本:Unity 3.4.2 或 更高版本
後記
使用自動建立 Script 的方式,讓我們快速建立重複、相似的 Script,不只可以使用在自動建立 Script,也可以應用在 Shader、Txt、報表檔案等等…,應用相當廣,懶人專屬!!
歡迎轉載,並註明出處 !
很特別的 Case,
若 hp, mp, attack 屬性,
那三個類別 PlayerData, EnemyData, FriendData 都有實做的話,
有考慮過用 Override 或是 Composition 方式來實做嗎?
若有的話,最後為什麼不考慮這樣做?
https://gist.github.com/twsiyuan/6ce1d1d8fb0e4a6bf591d79805e74eed
實務上通常不希望出現的重複程式碼(Duplicate code),
這樣的複製程式碼有點奇怪,
後續維護有可能是一個小麻煩,
例如遊戲企劃說要加入 sp 新屬性,
雖說這範例改三份程式碼 PlayerData, EnemyData, FriendData 感覺還好…,
但遊戲程式越大,總是有要還債的一天嘛
我自己實用過的例子:
如果現在要一次建立十個 Script 去繼承同一個類別
並實作裡面的某某方法
再根據規範實作裡變的變數(每個類別的變數不一)
這個自動化產出
是用在要執行很多次的情況下
當然~彈性的部分就要依據需求下去改
並不是每個程式碼內容都一樣
更彈性的應用方式
可以使用一個編輯器
設定要增加的變數、方法、名稱、繼承的類別等等….
設定完成後產出 Script
感謝回覆
文章內是為了方便教學
所以實作內容一樣