EditorWindow edit ScriptableObject
using UnityEngine; [System.Serializable]
public class Weapon
{
//[SerializeField]
public string weaponName;
//[SerializeField]
public int damage; public Weapon(string name, int dmg)
{
weaponName = name;
damage = dmg;
}
}
我们使用 ScriptableObject 来当做数据库 存储武器信息
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq; public class WeaponDatabase : ScriptableObject
{
[SerializeField]
private List<Weapon> database; void OnEnable()
{
if (database == null)
database = new List<Weapon>();
} public void Add(Weapon weapon)
{
database.Add(weapon);
} public void Remove(Weapon weapon)
{
database.Remove(weapon);
} public void RemoveAt(int index)
{
database.RemoveAt(index);
} public int COUNT
{
get { return database.Count; }
} //.ElementAt() requires the System.Linq
public Weapon Weapon(int index)
{
return database.ElementAt(index);
} public void SortAlphabeticallyAtoZ()
{
database.Sort((x, y) => string.Compare(x.weaponName, y.weaponName));
}
}
自定义EditotWindow来操作数据库
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections;
using System; public class WeaponDatabaseEditor : EditorWindow
{
private enum State
{
BLANK,
EDIT,
ADD
} private State state;
private int selectedWeapon;
private string newWeaponName;
private int newWeaponDamage; private string PROJECT_PATH = Application.dataPath + @"/Database"; private const string DATABASE_PATH = @"Assets/Database/weaponDB.asset"; private WeaponDatabase weapons;
private Vector2 _scrollPos; [MenuItem("BZA/Database/Weapon Database %#w")]
public static void Init()
{
WeaponDatabaseEditor window = EditorWindow.GetWindow<WeaponDatabaseEditor>();
window.minSize = new Vector2(, );
window.Show();
} void OnEnable()
{
if (weapons == null)
LoadDatabase(); state = State.BLANK;
} void OnGUI()
{
EditorGUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
DisplayListArea();
DisplayMainArea();
EditorGUILayout.EndHorizontal();
} void LoadDatabase()
{
weapons = (WeaponDatabase)AssetDatabase.LoadAssetAtPath(DATABASE_PATH, typeof(WeaponDatabase)); if (weapons == null)
CreateDatabase();
} void CreateDatabase()
{
if (!Directory.Exists(PROJECT_PATH)) Directory.CreateDirectory(PROJECT_PATH); weapons = ScriptableObject.CreateInstance<WeaponDatabase>();
AssetDatabase.CreateAsset(weapons, DATABASE_PATH);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
} void DisplayListArea()
{
EditorGUILayout.BeginVertical(GUILayout.Width());
EditorGUILayout.Space(); _scrollPos = EditorGUILayout.BeginScrollView(_scrollPos, "box", GUILayout.ExpandHeight(true)); for (int cnt = ; cnt < weapons.COUNT; cnt++)
{
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("-", GUILayout.Width()))
{
weapons.RemoveAt(cnt);
weapons.SortAlphabeticallyAtoZ();
EditorUtility.SetDirty(weapons);
state = State.BLANK;
return;
} if (GUILayout.Button(weapons.Weapon(cnt).weaponName, "box", GUILayout.ExpandWidth(true)))
{
selectedWeapon = cnt;
state = State.EDIT;
} EditorGUILayout.EndHorizontal();
} EditorGUILayout.EndScrollView(); EditorGUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
EditorGUILayout.LabelField("Weapons: " + weapons.COUNT, GUILayout.Width()); if (GUILayout.Button("New Weapon"))
state = State.ADD; EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.EndVertical();
} void DisplayMainArea()
{
EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true));
EditorGUILayout.Space(); switch (state)
{
case State.ADD:
DisplayAddMainArea();
break;
case State.EDIT:
DisplayEditMainArea();
break;
default:
DisplayBlankMainArea();
break;
} EditorGUILayout.Space();
EditorGUILayout.EndVertical();
} void DisplayBlankMainArea()
{
EditorGUILayout.LabelField(
"There are 3 things that can be displayed here.\n" +
"1) Weapon info for editing\n" +
"2) Black fields for adding a new weapon\n" +
"3) Blank Area",
GUILayout.ExpandHeight(true));
} void DisplayEditMainArea()
{
weapons.Weapon(selectedWeapon).weaponName = EditorGUILayout.TextField(new GUIContent("Name: "), weapons.Weapon(selectedWeapon).weaponName);
weapons.Weapon(selectedWeapon).damage = int.Parse(EditorGUILayout.TextField(new GUIContent("Damage: "), weapons.Weapon(selectedWeapon).damage.ToString())); EditorGUILayout.Space(); if (GUILayout.Button("Done", GUILayout.Width()))
{
weapons.SortAlphabeticallyAtoZ();
EditorUtility.SetDirty(weapons);
state = State.BLANK;
}
} void DisplayAddMainArea()
{
newWeaponName = EditorGUILayout.TextField(new GUIContent("Name: "), newWeaponName);
newWeaponDamage = Convert.ToInt32(EditorGUILayout.TextField(new GUIContent("Damage: "), newWeaponDamage.ToString())); EditorGUILayout.Space(); if (GUILayout.Button("Done", GUILayout.Width()))
{
weapons.Add(new Weapon(newWeaponName, newWeaponDamage));
weapons.SortAlphabeticallyAtoZ(); newWeaponName = string.Empty;
newWeaponDamage = ;
EditorUtility.SetDirty(weapons);
state = State.BLANK;
}
}
}
Result

EditorWindow edit ScriptableObject的更多相关文章
- Unity ScriptableObject的使用
ScriptableObject主要实现对象序列化的保存,因为是Unity自己的序列化,所以比xml,json序列化方便很多,但相对可控性也比较差 1.Editor下写入和读取测试: using Un ...
- ScriptableObject 对象化的运用
http://www.cnblogs.com/oldman/articles/2409554.html using UnityEngine; using UnityEditor; using Syst ...
- python右键Edit with IDLE
在windows下试用python,Py文件的右键菜单有个Edit with IDLE,虽然这个ide不是那么功能强大,但是胜在方便.对于脚本语言的一般使用来说是足够了.但是有时候,这个菜单就消失了, ...
- Unity EditorWindow知识记录
1.创建EditorWindow using UnityEditor; using UnityEngine; public class ZZEditorWindow : EditorWindow { ...
- PhpStorm和WAMP配置调试参数,问题描述Error. Interpreter is not specified or invalid. Press “Fix” to edit your project configuration.
PhpStorm和WAMP配置调试参数 问题描述: Error. Interpreter is not specified or invalid. Press “Fix” to edit your p ...
- eclipse调试(debug)的时候,出现Source not found,Edit Source Lookup Path,一闪而过
问题描述 使用Eclipse调试代码的时候,打了断点,经常出现Source not found,网上找了半天,大部分提示点击Edit Source Lookup Path,添加被调试的工程,然而往往没 ...
- [LeetCode] One Edit Distance 一个编辑距离
Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance ...
- [LeetCode] Edit Distance 编辑距离
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...
- ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)
在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...
随机推荐
- wpf做的可扩展记事本
记得有个winform利用反射做的可扩展笔记本,闲来无事,便用wpf也搞了个可扩展记事本,可用接口动态扩展功能,较简单,以便参考: 目录结构如下: MainWindow.xaml为主功能界面,Func ...
- 避免url传值字符串sjstr过长,使用from表单【隐藏域】post提交
1.普通的url传值<html--------------- <!-- 隐藏域post提交url --> <form id="urlPost" action ...
- golang没有条件表达式?:
详见The Go Programming Language Specification中Expressions一章中未提及此表达式, 故其不支持. 再强调一次, GO不支持条件表达式 conditio ...
- [译]rabbitmq 2.1 Consumers and producers (not an economics lesson)
我对rabbitmq学习还不深入,这些翻译仅仅做资料保存,希望不要误导大家. For now, all you need to know is that producers create messag ...
- 3-附1 ->和*的区别
问题: c++ .和 ->有什么区别? 还有什么是继承什么是派生?-------------------------------------------------------------- 比 ...
- 31.DDR2问题3_waring?
Warning: (vlog-2275) 'ddr2_controller' already exists and will be overwritte. 出现这个waring,是因为xxx_bb.v ...
- iOS 进阶 第十七天(0420)
0420 凡是继承了UIResponder的类都可以做响应者 响应事件的传递是由底到高来传递,响应者链条是由高到底来响应 相应事件的传递(由底到高 找到正在和用户触摸交互的view) 准则:事件由父控 ...
- jQuery4ajax
1.jQuery对ajax编程的支持 (1)load方法: 作用:将服务器返回的数据直接添加到符合要求的dom节点之上. 用法:load(url,[data]); url:请求地址,比如"p ...
- SQLite函数详解之二
sqlite3支持的数据类型: NULL.INTEGER.REAL.TEXT.BLOB 但是,sqlite3也支持如下的数据类型 smallint 16位整数 integer ...
- Ztree的初步使用--checkbox--指定目录下搜索子节点
这里记录一下zTree的check的使用 首先 <%@ Page Language="C#" AutoEventWireup="true" CodeBeh ...