[Unity實戰]劇情對話(二),unity實戰劇情對話
在上一篇文章中,我們在CommandManager中直接寫入一個個的指令,實際上這樣是很不好的,因為一個遊戲可能會出現很多的劇情動畫,那麼不就是要寫n個類嗎?而且修改起來也不是很好的。所以一個比較好的方法就是寫一個編輯器類。
以下是本人寫的一個編輯器類,功能還不是很完善,例如可以加入"插入命令","從文本中讀取命令"等等等的功能,不過,先將就用了。。
using UnityEngine;using UnityEditor;using System.Collections.Generic;public enum Option{ CommandDestory, CommandDialogue, CommandDialogueModeEnter, CommandDialogueModeExit, CommandGenerate, CommandMove, CommandMusic, CommandPlayAnim, CommandRotate, CommandWait}public class Window : EditorWindow{ List<Option> options = new List<Option>(); List<string[]> strings = new List<string[]>(); List<int[]> ints = new List<int[]>(); List<float[]> floats = new List<float[]>(); List<Vector3[]> vector3s = new List<Vector3[]>(); Vector2 v2 = new Vector2(0, 0);//捲軸參數 [MenuItem("Window/My Window")] static void Init() { EditorWindow.GetWindow(typeof(Window)); } void OnGUI() { if (GUILayout.Button("儲存命令")) { } if (GUILayout.Button("添加命令")) { Option x = Option.CommandDialogueModeEnter; options.Add(x); string[] a = new string[5]; strings.Add(a); int[] b = new int[5]; ints.Add(b); float[] c = new float[5]; floats.Add(c); Vector3[] d = new Vector3[5]; vector3s.Add(d); } if (GUILayout.Button("刪除命令")) { options.RemoveAt(options.Count - 1); strings.RemoveAt(options.Count - 1); ints.RemoveAt(options.Count - 1); floats.RemoveAt(options.Count - 1); vector3s.RemoveAt(options.Count - 1); } v2 = EditorGUILayout.BeginScrollView(v2,false,true,null); for (int i = 0; i < options.Count; i++) { options[i] = (Option)EditorGUILayout.EnumPopup("選項" + i, options[i]); switch (options[i]) { case Option.CommandDestory: strings[i][0] = EditorGUILayout.TextField("物體名字", strings[i][0]); break; case Option.CommandDialogue: strings[i][0] = EditorGUILayout.TextField("xml文本名字", strings[i][0]); ints[i][0] = EditorGUILayout.IntField("開始序號", ints[i][0]); ints[i][1] = EditorGUILayout.IntField("結束序號", ints[i][1]); ints[i][2] = EditorGUILayout.IntField("點擊後執行的步驟數", ints[i][2]); break; case Option.CommandDialogueModeEnter: break; case Option.CommandDialogueModeExit: break; case Option.CommandGenerate: strings[i][0] = EditorGUILayout.TextField("物體名字", strings[i][0]); vector3s[i][0] = EditorGUILayout.Vector3Field("產生位置", vector3s[i][0]); vector3s[i][1] = EditorGUILayout.Vector3Field("產生角度", vector3s[i][1]); break; case Option.CommandMove: strings[i][0] = EditorGUILayout.TextField("物體名字", strings[i][0]); vector3s[i][0] = EditorGUILayout.Vector3Field("終點位置", vector3s[i][0]); floats[i][0] = EditorGUILayout.FloatField("所用時間", floats[i][0]); break; case Option.CommandMusic: strings[i][0] = EditorGUILayout.TextField("音樂名字", strings[i][0]); break; case Option.CommandPlayAnim: strings[i][0] = EditorGUILayout.TextField("物體名字", strings[i][0]); ints[i][0] = EditorGUILayout.IntField("動畫狀態", ints[i][0]); break; case Option.CommandRotate: strings[i][0] = EditorGUILayout.TextField("物體名字", strings[i][0]); vector3s[i][0] = EditorGUILayout.Vector3Field("終點角度", vector3s[i][0]); floats[i][0] = EditorGUILayout.FloatField("所用時間", floats[i][0]); break; case Option.CommandWait: floats[i][0] = EditorGUILayout.FloatField("等待時間", floats[i][0]); break; default: break; } } EditorGUILayout.EndScrollView(); }}