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的更多相关文章

  1. Unity ScriptableObject的使用

    ScriptableObject主要实现对象序列化的保存,因为是Unity自己的序列化,所以比xml,json序列化方便很多,但相对可控性也比较差 1.Editor下写入和读取测试: using Un ...

  2. ScriptableObject 对象化的运用

    http://www.cnblogs.com/oldman/articles/2409554.html using UnityEngine; using UnityEditor; using Syst ...

  3. python右键Edit with IDLE

    在windows下试用python,Py文件的右键菜单有个Edit with IDLE,虽然这个ide不是那么功能强大,但是胜在方便.对于脚本语言的一般使用来说是足够了.但是有时候,这个菜单就消失了, ...

  4. Unity EditorWindow知识记录

    1.创建EditorWindow using UnityEditor; using UnityEngine; public class ZZEditorWindow : EditorWindow { ...

  5. 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 ...

  6. eclipse调试(debug)的时候,出现Source not found,Edit Source Lookup Path,一闪而过

    问题描述 使用Eclipse调试代码的时候,打了断点,经常出现Source not found,网上找了半天,大部分提示点击Edit Source Lookup Path,添加被调试的工程,然而往往没 ...

  7. [LeetCode] One Edit Distance 一个编辑距离

    Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance ...

  8. [LeetCode] Edit Distance 编辑距离

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  9. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

随机推荐

  1. 【摘抄】Application.StartupPath和System.Environment.CurrentDirectory的区别

    System.Environment.CurrentDirectory的含义是获取或设置当前工作路径,而Application.StartupPath是获取程序启动路径,表面上看二者没什么区别,但实际 ...

  2. 实战Django:官方实例Part1

    [写在前面] 撰写这个实战系列的Django文章,是很久之前就有的想法,问题是手头实例太少,一旦开讲,恐有"无米下锅"之忧. 随着对Django学习的深入,渐渐有了些心得,把这些心 ...

  3. 009-python基础-数据类型-列表和元组

    一.列表 在python中叫"列表",其他语言中成为"数组" 元素中可以存储字符串.数字甚至变量. 元素索引顺序从0开始. 例如 name_list[0] 就是 ...

  4. python 中 input 和 raw_input 的区别

    input会假设输入的信息是合法的python表达式,例如,输入一个人名,Diesel,input会认为这是一个变量,必须加上引号,比如“Diesel”: 而raw_input会把所有的输入当作原始数 ...

  5. Hive深入浅出

    1.  Hive是什么 1) Hive是什么? 这里引用 Hive wiki 上的介绍: Hive is a data warehouse infrastructure built on top of ...

  6. linux kernel同步机制的思考

    在学习内核同步机制的时候,书中介绍了同步方法:原子操作(atomic).自旋锁(spinlock).信号量(semaphore).互斥锁(mutex).完成变量(completion).大内核(BLK ...

  7. 配置 apt-get cloudera 离线source(Cloudera Manager的源)

    配置 apt-get cloudera 离线source(Cloudera Manager的源) 创建/etc/apt/source.list.d/cloudera-manager.list文件,并在 ...

  8. IOS中的UINavigationController(导航控制器)

    UINavigationController UINavigationControlle:导航控制器,是iOS中最常用的多视图控制器之一,它用来管理多个试图控制器 导航控制器可以认为是管理控制器的控制 ...

  9. 转载:SQL索引一步到位

    原文: http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文 ...

  10. Window VNC远程控制LINUX:VNC详细配置介绍

    Window VNC远程控制LINUX:VNC详细配置介绍 //---------------------------------------vnc linux下的详细配置 1.VNC的启动/停止/重 ...