• EditorWindow edit ScriptableObject


     1 using UnityEngine;
     2 
     3 [System.Serializable]
     4 public class Weapon
     5 {
     6     //[SerializeField]
     7     public string weaponName;
     8     //[SerializeField]
     9     public int damage;
    10 
    11     public Weapon(string name, int dmg)
    12     {
    13         weaponName = name;
    14         damage = dmg;
    15     }
    16 }

    我们使用 ScriptableObject 来当做数据库 存储武器信息

     1 using UnityEngine;
     2 using System.Collections;
     3 using System.Collections.Generic;
     4 using System.Linq;
     5 
     6 public class WeaponDatabase : ScriptableObject
     7 {
     8     [SerializeField]
     9     private List<Weapon> database;
    10 
    11     void OnEnable()
    12     {
    13         if (database == null)
    14             database = new List<Weapon>();
    15     }
    16 
    17     public void Add(Weapon weapon)
    18     {
    19         database.Add(weapon);
    20     }
    21 
    22     public void Remove(Weapon weapon)
    23     {
    24         database.Remove(weapon);
    25     }
    26 
    27     public void RemoveAt(int index)
    28     {
    29         database.RemoveAt(index);
    30     }
    31 
    32     public int COUNT
    33     {
    34         get { return database.Count; }
    35     }
    36 
    37     //.ElementAt() requires the System.Linq
    38     public Weapon Weapon(int index)
    39     {
    40         return database.ElementAt(index);
    41     }
    42 
    43     public void SortAlphabeticallyAtoZ()
    44     {
    45         database.Sort((x, y) => string.Compare(x.weaponName, y.weaponName));
    46     }
    47 }

     自定义EditotWindow来操作数据库

      1 using UnityEngine;
      2 using UnityEditor;
      3 using System.IO;
      4 using System.Collections;
      5 using System;
      6 
      7 public class WeaponDatabaseEditor : EditorWindow
      8 {
      9     private enum State
     10     {
     11         BLANK,
     12         EDIT,
     13         ADD
     14     }
     15 
     16     private State state;
     17     private int selectedWeapon;
     18     private string newWeaponName;
     19     private int newWeaponDamage;
     20 
     21     private string PROJECT_PATH = Application.dataPath +  @"/Database";
     22 
     23     private const string DATABASE_PATH = @"Assets/Database/weaponDB.asset";
     24 
     25     private WeaponDatabase weapons;
     26     private Vector2 _scrollPos;
     27 
     28     [MenuItem("BZA/Database/Weapon Database %#w")]
     29     public static void Init()
     30     {
     31         WeaponDatabaseEditor window = EditorWindow.GetWindow<WeaponDatabaseEditor>();
     32         window.minSize = new Vector2(800, 400);
     33         window.Show();
     34     }
     35 
     36     void OnEnable()
     37     {
     38         if (weapons == null)
     39             LoadDatabase();
     40 
     41         state = State.BLANK;
     42     }
     43 
     44     void OnGUI()
     45     {
     46         EditorGUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
     47         DisplayListArea();
     48         DisplayMainArea();
     49         EditorGUILayout.EndHorizontal();
     50     }
     51 
     52     void LoadDatabase()
     53     {
     54         weapons = (WeaponDatabase)AssetDatabase.LoadAssetAtPath(DATABASE_PATH, typeof(WeaponDatabase));
     55 
     56         if (weapons == null)
     57             CreateDatabase();
     58     }
     59 
     60     void CreateDatabase()
     61     {
     62         if (!Directory.Exists(PROJECT_PATH)) Directory.CreateDirectory(PROJECT_PATH);
     63 
     64         weapons = ScriptableObject.CreateInstance<WeaponDatabase>();
     65         AssetDatabase.CreateAsset(weapons, DATABASE_PATH);
     66         AssetDatabase.SaveAssets();
     67         AssetDatabase.Refresh();
     68     }
     69 
     70     void DisplayListArea()
     71     {
     72         EditorGUILayout.BeginVertical(GUILayout.Width(250));
     73         EditorGUILayout.Space();
     74 
     75         _scrollPos = EditorGUILayout.BeginScrollView(_scrollPos, "box", GUILayout.ExpandHeight(true));
     76 
     77         for (int cnt = 0; cnt < weapons.COUNT; cnt++)
     78         {
     79             EditorGUILayout.BeginHorizontal();
     80             if (GUILayout.Button("-", GUILayout.Width(25)))
     81             {
     82                 weapons.RemoveAt(cnt);
     83                 weapons.SortAlphabeticallyAtoZ();
     84                 EditorUtility.SetDirty(weapons);
     85                 state = State.BLANK;
     86                 return;
     87             }
     88 
     89             if (GUILayout.Button(weapons.Weapon(cnt).weaponName, "box", GUILayout.ExpandWidth(true)))
     90             {
     91                 selectedWeapon = cnt;
     92                 state = State.EDIT;
     93             }
     94 
     95             EditorGUILayout.EndHorizontal();
     96         }
     97 
     98         EditorGUILayout.EndScrollView();
     99 
    100         EditorGUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
    101         EditorGUILayout.LabelField("Weapons: " + weapons.COUNT, GUILayout.Width(100));
    102 
    103         if (GUILayout.Button("New Weapon"))
    104             state = State.ADD;
    105 
    106         EditorGUILayout.EndHorizontal();
    107         EditorGUILayout.Space();
    108         EditorGUILayout.EndVertical();
    109     }
    110 
    111     void DisplayMainArea()
    112     {
    113         EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true));
    114         EditorGUILayout.Space();
    115 
    116         switch (state)
    117         {
    118             case State.ADD:
    119                 DisplayAddMainArea();
    120                 break;
    121             case State.EDIT:
    122                 DisplayEditMainArea();
    123                 break;
    124             default:
    125                 DisplayBlankMainArea();
    126                 break;
    127         }
    128 
    129         EditorGUILayout.Space();
    130         EditorGUILayout.EndVertical();
    131     }
    132 
    133     void DisplayBlankMainArea()
    134     {
    135         EditorGUILayout.LabelField(
    136             "There are 3 things that can be displayed here.
    " +
    137             "1) Weapon info for editing
    " +
    138             "2) Black fields for adding a new weapon
    " +
    139             "3) Blank Area",
    140             GUILayout.ExpandHeight(true));
    141     }
    142 
    143     void DisplayEditMainArea()
    144     {
    145         weapons.Weapon(selectedWeapon).weaponName = EditorGUILayout.TextField(new GUIContent("Name: "), weapons.Weapon(selectedWeapon).weaponName);
    146         weapons.Weapon(selectedWeapon).damage = int.Parse(EditorGUILayout.TextField(new GUIContent("Damage: "), weapons.Weapon(selectedWeapon).damage.ToString()));
    147 
    148         EditorGUILayout.Space();
    149 
    150         if (GUILayout.Button("Done", GUILayout.Width(100)))
    151         {
    152             weapons.SortAlphabeticallyAtoZ();
    153             EditorUtility.SetDirty(weapons);
    154             state = State.BLANK;
    155         }
    156     }
    157 
    158     void DisplayAddMainArea()
    159     {
    160         newWeaponName = EditorGUILayout.TextField(new GUIContent("Name: "), newWeaponName);
    161         newWeaponDamage = Convert.ToInt32(EditorGUILayout.TextField(new GUIContent("Damage: "), newWeaponDamage.ToString()));
    162 
    163         EditorGUILayout.Space();
    164 
    165         if (GUILayout.Button("Done", GUILayout.Width(100)))
    166         {
    167             weapons.Add(new Weapon(newWeaponName, newWeaponDamage));
    168             weapons.SortAlphabeticallyAtoZ();
    169 
    170             newWeaponName = string.Empty;
    171             newWeaponDamage = 0;
    172             EditorUtility.SetDirty(weapons);
    173             state = State.BLANK;
    174         }
    175     }
    176 }

    Result

  • 相关阅读:
    java多线程开发容易犯的错误
    个性化推荐系统(九)--- 电商商品个性化推荐系统
    servlet的生命周期
    Servlet的执行过程
    Tomcat发布项目的几种方式
    xml文件解析
    linux执行wget url时提示“无法建立 SSL 连接”
    Linux使用yum install 安装程序时,提示“另外一个程序锁定了 yum;等待它退出……”
    线程状态
    单例模式和多线程
  • 原文地址:https://www.cnblogs.com/chongxin/p/4425953.html
Copyright © 2020-2023  润新知