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