[Unity] 腳本模板(二)、Script Create Dialog

使用官方的 Script Create Dialog 套件來學習如何建立腳本模板。

Overview

1. 下載官方的 Script Create Dialog 套件
2. 修正 Complile Errors
3. 利用精靈建立 Script
4. 學習模板建立腳本的方法


1. 下載官方的 Script Create Dialog 套件

搜尋 Script Create Dialog
可以找到官方提供的這款免費套件

[Unity] Create Script Dialog

2. 修正 Complile Errors

匯入完套件後可能會遇到以下錯誤訊息:
`UnityEditorInternal.InternalEditorUtility’ does not contain a definition for `AddScriptComponentUnchecked’

[Unity] Create Script Dialog

找到錯誤行,修正為以下程式碼:

private void Create()
{
CreateScript();

if (CanAddComponent())
{
// Need to use reflection to access this now (it is internal)
MethodInfo addScriptMethod = typeof(InternalEditorUtility).GetMethod(
"AddScriptComponentUncheckedUndoable",
BindingFlags.Static | BindingFlags.NonPublic);
addScriptMethod.Invoke(null, new Object[] {m_GameObjectToAddTo,
AssetDatabase.LoadAssetAtPath(TargetPath(), typeof (MonoScript)) as MonoScript});
}

Close();
GUIUtility.ExitGUI();
}
3. 利用精靈建立 Script

順利的話,你現在已經可以點 Assets => Create => Script…
叫出 Create Script Dialog 來快速建立 Script了

[Unity] Create Script Dialog

這個精靈幾乎可以達成你想得到的大部分功能
包含檔名設定、儲存位置、繼承類別、預設函式等…
除了 MonoBehaviour 之外,還支援
ScriptableObject、CustomEditor、EditorWindow
可以說是十分完整!

[Unity] Create Script Dialog

4. 學習模板建立腳本的方法

讓我們來看看這個套件是如何設計腳本模板的
先看看 MonoBehaviour 的模板吧!

BASECLASS=MonoBehaviour
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class $ClassName : MonoBehaviour {

$Functions
}

第一行 BASECLASS=MonoBehaviour
主要是給 EditorWindow 辨識用的
可以在 NewScriptWindow.cs 下的 GetBaseClass 找到

private string GetBaseClass(string templateContent)
{
string firstLine = templateContent.Substring(0, templateContent.IndexOf("\n"));
if (firstLine.Contains("BASECLASS"))
{
string baseClass = firstLine.Substring(10).Trim();
if (baseClass != string.Empty)
return baseClass;
}
return null;
}

另外兩個關鍵字 $ClassName 和 $Functions
則可以在 NewScriptGenerator.cs 下的 ToString() 中找到
其實就是字串取代,但是加了正規表示式的檢查

m_Text = m_ScriptPrescription.m_Template;
m_Writer = new StringWriter ();
m_Writer.NewLine = "\n";

// Make sure all line endings are Unix (Mac OS X) format
m_Text = Regex.Replace (m_Text, @"\r\n?", delegate(Match m) { return "\n"; });

// Class Name
m_Text = m_Text.Replace ("$ClassName", ClassName);
m_Text = m_Text.Replace ("$NicifiedClassName", ObjectNames.NicifyVariableName (ClassName));

3 則留言

發佈留言

AllEscort