天天看點

[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();
    }
}
           
[Unity實戰]劇情對話(二)

繼續閱讀