前言:
我们经常用Json、CSV等文件为数据做初始化,我们也可以使用Unity中自带的ScriptableAsset类实现这一流程。
注意:ScriptableAsset不能在编辑器以外进行修改,可以在游戏运行前在Unity中部署数据,运行后的游戏不能使用ScriptableAsset来保存修改后的数据!
正文:
定义并创建资产数据
首先我们定义一个数据类,同时继承ScriptableAsset类,类在定义时,上面加上属性:
[CreateAssetMenu(menuName ="AssetDatas/SkillAsset")]
模拟定义一个技能资产数据:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName ="AssetDatas/SkillAsset")]
public class SkillAsset :ScriptableObject
{
public int nodeID;
public string skillIcon;
public string skillName;
public bool isActive;
public int clickNeedCount;
public int clickCount;
public List<int> nextIDs;
public List<int> beforeIDs;
public Vector3 pos;
}
在Unity中就可以右键Create这个资产数据啦!
解析资产数据
我们可以将所有需要解析的资产数据放到指定文件夹下,进行统一加载:
下面是一个单例的数据管理类,解析如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 数据管理类
/// </summary>
public class DataManager : Singleton<DataManager>
{
/// <summary>
/// 资产原数据管理
/// </summary>
Dictionary<int, SkillAsset> skillAsset_Dic = new Dictionary<int, SkillAsset>();
public Dictionary<int, SkillAsset> SkillAsset_Dic { get => skillAsset_Dic; }
/// <summary>
/// 初始化数据
/// </summary>
public void Init()
{
Load_SkillAssetInfo();
}
/// <summary>
/// 加载资产中的技能数据
/// </summary>
public void Load_SkillAssetInfo()
{
//筛选指定文件夹下所有资产数据的文件路径
string[] filePaths = Directory.GetFiles("Assets/Resources/SkillAssets", "*.asset", SearchOption.AllDirectories);
foreach (var filePath in filePaths)
{
//string fileName = Path.GetFileNameWithoutExtension(filePath);
//Debug.Log(fileName);
//AssetDatabase.LoadAssetAtPath通过文件路径加载资产数据
SkillAsset asset = AssetDatabase.LoadAssetAtPath<SkillAsset>(filePath);
//存入资产原数据管理字典中
skillAsset_Dic.Add(asset.nodeID, asset);
}
}
}