Unity使用自定义资源(.asset)配置数据
本文原创版权归 强哥的私房菜 所有,此处为转载,如有再转,请于篇首位置标明原创作者及出处,以示尊重!
作者:强哥的私房菜
原文:http://blog.csdn.net/liqiangeastsun/article/details/50510615
在游戏开发中,经常会用到一些配置文件保存一些数据,然后项目运行中读取这些配置文件中的数据在游戏中使用。
如:配置血条:根据角色类型(人物、动物、怪物等)配置不同的血条,包括血条大小,血条名或血条预设,血条颜色等一些简单数据。
如:配置子弹:子弹类型(真子弹、假子弹、追踪子弹等),子弹速度,伤害数值,子弹关联的特效等。
诸如此类的配置很多种,可创建一个可序列化的类存储数据,或者创建 XML 、JSON 文件保存数据,创建 Excel 文件,创建 TXT 文件,皆可完成需求,灵活使用这些方法保存配置数据。
在此介绍一下使用可序列化类保存配置,并且将可序列化类保存成Unity的自定义文件(.asset),然后配置自定义文件(.asset)。
优点:
可以保存数据类型多样(int、string、Vector3、GameObject、Transform、Texture等)如关联预设,关联图片等资源数据,而XML、TXT等只能保存(int、string、Vector3 等基本数据类型)。
缺点:
如果配置数据中保存了(GameObject、Texture)等资源数据,当关联的资源被删除时,配置数据将丢失,需要重新将新的资源再次关联到配置数据上。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面做个简单的子弹配置数据:
- // 创建一个可序列化的子弹类 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;
- }
创建一个编辑器类,在 菜单栏添加功能按钮,生成自定义资源:
- 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);
- }
- }
如下:
点击 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);
- }
- }
- }
打印结果如下:
如果想自定义 文件的 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();
- }
- }
再看效果,自定义的:
到此将序列化类生成自定义文件 (.asset)成功,读取成功,重写Inspector面板结束。
Unity使用自定义资源(.asset)配置数据相关推荐
- unity 引用prefab_十九:Unity 配置数据(序列化)的重构
今天看到 @Funny David 的文章从Odin插件聊基于元数据的编辑器实现,这篇文章非常好. 最后评论部分有朋友提到一个配置的麻烦点,故有感而发,说一点我的思路和处理方法: 当我们在使用unit ...
- 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )
文章目录 一.开启资源压缩 二.启用严格模式的资源引用检查 三.自定义保留/移除资源配置 四.资源压缩效果 五.完整配置 1.keep.xml 配置 2.build.gradle 构建脚本 六.参考资 ...
- 数据科学 IPython 笔记本 8.14 自定义 Matplotlib:配置和样式表
8.14 自定义 Matplotlib:配置和样式表 原文:Customizing Matplotlib: Configurations and Stylesheets 译者:飞龙 协议:CC BY- ...
- Unity3D自定义资源配置文件
http://blog.csdn.net/candycat1992/article/details/52181814 写在前面 我竟然最近两天才知道Unity中ScriptableObject的存在- ...
- Unity游戏运行资源的制作与下载
我们的游戏制作完发布出去提供给玩家,为了给玩家带来更好的游戏体验,要做各种的优化以及设计,首先,游戏资源的加载就是一个非常重要的方面(尤其是网页游戏).由于我们的游戏资源比较大,不能一下全部加载出来, ...
- azure 配置vpn_ASP.NET和Azure中配置中的私有配置数据和连接字符串的最佳做法
azure 配置vpn A reader emailed asking how to avoid accidentally checking in passwords and other sensit ...
- Unity 3D 导入资源包 || Unity 3D 导出资源包
项目中的一些资源具有复用性,只需要将资源导出,就能够重复使用. 导出资源包 执行 Assets → Select Dependencies 菜单命令,选中与导出资源相关的内容.接着执行 Assets→ ...
- Multipart自定义资源限制文件大小限制设计——aop切面怎么才能切入Multipart的文件大小拦截?
Multipart自定义资源限制文件大小限制设计--aop切面怎么才能切入Multipart的文件大小拦截? author:陈镇坤27 创建时间:2022年1月23日 创作不易,转载请注明来源 摘要: ...
- aws cloudformation 理解自定义资源的使用
资料 AWS::CloudFormation::CustomResource cfn-response module 自定义资源的逻辑 cloudformation只能对aws service进行部署 ...
最新文章
- 嵌入式Linux入门经典笔记
- 咱们来聊聊快速失败和安全失败
- linux卸载桌面Ubuntu,Ubuntu安装卸载KDE桌面之折腾记
- winform下的未捕捉的异常处理
- 12c RMAN新特性之Recover Table
- python爬取小说项目概述_Python实战项目网络爬虫 之 爬取小说吧小说正文
- js php 中文乱码怎么解决_php中文乱码怎么解决
- Django:django.db.utils.OperationalError: (1050, “Table ‘malicious_software_db‘ already exists“)
- [2018.07.12 T2] B君的第二题
- 使用mybatis生成UUID
- Excel如何快速提取红色字体文本
- 粒子群算法(PSO)光伏发电 MPPT实现多峰值寻优,阴影遮蔽光伏发电算法 使用s函数编写粒子群算法,阴影遮蔽,实现多峰值寻优
- 超详细的程序员未来职业发展路线
- Windows图标-Icon文件格式分析
- Unity跑酷游戏的无尽关卡是如何生成的?
- Android Studio Build Output控制台输出乱码解决
- CCleaner 4.07中文版下载 绿色精简
- ARMv7-M4处理器系列文章-2 编程模型
- GPS模块——基于Arduino
- 私服服务器显示关闭怎么办,《魔兽世界》私服关闭
热门文章
- mob sdk vue 短信验证_如何快速集成短信验证码API[图文教程]
- 直接学python3_新手应该学python2还是python3?
- sql2012找不到到服务器,SQL Server无法连接到服务器怎么办
- 浙大计算机基础知识2,[精选资料]14年浙大远程计算机基础2Windows知识题高起专 作业题2答案...
- 利用函数求两个数的最大值
- wangeditor中添加超链接校验
- CSS清除浏览器input缓存黄色背景
- mysql之查询前几条或者中间某几行数据
- mysql之多表联合查询并输入数据来自哪张表
- 32 开漏输出 高电平_关于各种IO输出类型详解