Unity 使用自定义资源(.asset)配置数据
2018-01-19 16:32
274 查看
Unity 使用自定义资源(.asset)配置数据
在游戏开发中,经常会用到一些配置文件保存一些数据,然后项目运行中读取这些配置文件中的数据在游戏中使用。 如:配置血条:根据角色类型(人物、动物、怪物等)配置不同的血条,包括血条大小,血条名或血条预设,血条颜色等一些简单数据。 如:配置子弹:子弹类型(真子弹、假子弹、追踪子弹等),子弹速度,伤害数值,子弹关联的特效等。 诸如此类的配置很多种,可创建一个可序列化的类存储数据,或者创建 XML 、JSON 文件保存数据,创建 Excel 文件,创建 TXT 文件,皆可完成需求,灵活使用这些方法保存配置数据。 在此介绍一下使用可序列化类保存配置,并且将可序列化类保存成Unity的自定义文件(.asset),然后配置自定义文件(.asset)。 优点: 可以保存数据类型多样(int、string、Vector3、GameObject、Transform、Texture等)如关联预设,关联图片等资源数据,而XML、TXT等只能保存(int、string、Vector3 等基本数据类型)。 缺点: 如果配置数据中保存了(GameObject、Texture)等资源数据,当关联的资源被删除时,配置数据将丢失,需要重新将新的资源再次关联到配置数据上。 下面做个简单的子弹配置数据1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 创建一个可序列化的子弹类 Bullet.CS using UnityEngine; using System.Collections; using System; // 子弹类型枚举 public enum BulletType { DirectAttack = 0, // 直接攻击 Phony, // 假子弹 Real, // 真子弹 Track, // 追踪子弹 } /// <summary> /// 可序列化 /// </summary> [Serializable] public class Bullet : ScriptableObject { // Bullet 类直接继承自 ScriptableObject // 子弹类型 public BulletType bulletType = BulletType.DirectAttack; // 子弹速度 public int speed = 10; // 伤害数值 public int damage = 5; // 子弹关联的特效 public GameObject effectObj; }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
创建一个编辑器类,在 菜单栏添加功能按钮,生成自定义资源1
2
using UnityEngine; using System.Collections; using UnityEditor; using System.IO; public class CreateAsset : Editor { // 在菜单栏创建功能项 [MenuItem("CreateAsset/Asset")] static void Create() { // 实例化类 Bullet ScriptableObject bullet = ScriptableObject.CreateInstance<Bullet>(); // 如果实例化 Bullet 类为空,返回 if (!bullet) { Debug.LogWarning("Bullet not found"); return; } // 自定义资源保存路径 string path = Application.dataPath + "/BulletAeeet"; // 如果项目总不包含该路径,创建一个 if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } //将类名 Bullet 转换为字符串 //拼接保存自定义资源(.asset) 路径 path = string.Format("Assets/BulletAeeet/{0}.asset", (typeof(Bullet).ToString())); // 生成自定义资源到指定路径 AssetDatabase.CreateAsset(bullet, path); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
如下
点击
Asset在指定路径生成自定义资源查看生成资源如下
为了省事,下面直接在编辑器类中加一个方法,读取自定义文件修改如下
using UnityEngine; using System.Collections; using UnityEditor; using System.IO; using System; public class CreateAsset : Editor { [MenuItem("CreateAsset/Asset")] static void Create() { // 实例化类 Bullet ScriptableObject bullet = ScriptableObject.CreateInstance<Bullet>(); // 如果实例化 Bullet 类为空,返回 if (!bullet) { Debug.LogWarning("Bullet not found"); return; } // 自定义资源保存路径 string path = Application.dataPath + "/BulletAeeet"; // 如果项目总不包含该路径,创建一个 if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } //将类名 Bullet 转换为字符串 //拼接保存自定义资源(.asset) 路径 path = string.Format("Assets/BulletAeeet/{0}.asset", (typeof(Bullet).ToString())); // 生成自定义资源到指定路径 AssetDatabase.CreateAsset(bullet, path); } [MenuItem("CreateAsset/GetAsset")] static void GetAsset() { //读取 .asset 文件, 直接转换为 类 Bullet Bullet bullet = AssetDatabase.LoadAssetAtPath<Bullet>("Assets/BulletAeeet/Bullet.asset"); // 打印保存的数据 Debug.Log("BulletType :" + Enum.GetName(typeof(BulletType), bullet.bulletType)); Debug.Log("Speed :" + bullet.speed); Debug.Log("damage :" + bullet.damage); if (bullet.effectObj) { Debug.Log("EffectObj :" + bullet.effectObj.name); } } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
打印结果如下
如果想自定义 文件的 Inspector面板,使用编辑器类重写
Bullet.cs的Inspector面板, 代码如下
using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor(typeof(Bullet))] public class BulletInspector : Editor { // 子弹类型 public SerializedProperty bulletType; // 子弹速度 public SerializedProperty speed; // 伤害数值 public SerializedProperty damage; // 子弹关联的特效 public SerializedProperty effectObj; private void OnEnable() { bulletType = serializedObject.FindProperty("bulletType"); speed = serializedObject.FindProperty("speed"); damage = serializedObject.FindProperty("damage"); effectObj = serializedObject.FindProperty("effectObj"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUI.indentLevel = 1; EditorGUILayout.PropertyField(bulletType, new GUIContent("子弹类型")); GUILayout.Space(5); EditorGUILayout.PropertyField(speed, new GUIContent("子弹速度")); GUILayout.Space(5); EditorGUILayout.PropertyField(damage, new GUIContent("伤害数值")); GUILayout.Space(5); EditorGUILayout.PropertyField(effectObj, new GUIContent("特效对象")); GUILayout.Space(10); // 打印数据 if (GUILayout.Button("Debug")) { Debug.Log("bulletType :" + (BulletType)bulletType.enumValueIndex); Debug.Log("speed :" + speed.intValue); Debug.Log("damage :" + damage.intValue); if (effectObj.objectReferenceValue) { Debug.Log("effectObj :" + effectObj.objectReferenceValue); } } if (GUI.changed) { EditorUtility.SetDirty(target); } serializedObject.ApplyModifiedProperties(); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
再看效果,自定义的
到此将序列化类生成自定义文件 (.asset)成功,读取成功,重写Inspector面板结束。
相关文章推荐
- Unity 使用自定义资源(.asset)配置数据
- Unity使用自定义资源(.asset)配置数据
- Unity 使用自定义资源(.asset)配置数据
- 自定义资源(.asset)配置数据[UnityEditor案例]
- 【Unity】安装配置Python使用protobuf转换Excel表格数据并在unit中使用
- Unity 使用自定义资源(.asset) 添加 Assets 菜单按钮二
- Enterprise Library3.1 使用数据访问模块时,调用Microsoft.Practices.EnterpriseLibrary.Data报出源文件与当前应用程序不一致和创建dataconfiguration的配置节处理程序出错
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 使用 Unity(二):配置 Unity 、读取配置信息和获取对象
- Windows下rsync软件配置和使用【数据同步】
- Unity使用独立配置文件的方法
- Unity Application Block 学习笔记之一使用配置文件
- Unity 配置:typeConverter的使用
- Dreamweaver 8 配置站點時无法使用您输入的前缀显示活动数据请查站点配置(http,錯誤401)
- IOC : Unity 配置和使用
- webconfig中配置log4net 数据访问及业务层使用
- ASP.NET - 使用Web.config配置数据
- Unity Application Block-配置文件的使用-示例(附源码下载)
- 使用powershell命令,为exchange 2007用户配置邮箱数据
- Unity 学习笔记(2) -- 配置文件的使用