游戏中对策划的配置数据导入处理常用分为1.转xml或josn.2.序列化为ScriptableObject类。第一种方法游戏加载耗时一些,第二种避免了第一种方法加载缺点但内存要占用大一些。不过推荐第二种方法,现在手机不差那几m.并且第二种在unity编辑器中使用方便,对数据的更改直接在编辑器中更改到满意位置。第一种会不断导入配置文件比较繁琐。
分三部分介绍(本文中写在一块的有一千多行代码所有区分开介绍比较简单易懂): 1 xml;2 json; 3 ScriptObject;
Excel: excel 部分是导入的朋友项目中的部分数据,放入路径如图:(项目的同级别目录下方)
Excel 格式如图:第一行为Excel表功能概述 ,第二行为每一列的字段名字 ,第三行为每列的类型划分,第四行为每列的说明概述。
另外的Excel表:
unity编辑器部分:
分为转入的类型 xml json 和Scripts(创建脚本类:创建scriptsObjcet使用)如图1;在点击createScripts创建成功后,点击CreateScriptsObject 编辑器如图:2
1 2
点击选取excel文件夹:
创建数据结果如图:
1.json:
2.xml如图:
3.scriptsObject:
代码:
公用代码(公用列表和枚举和定义类型以及按条件调用创建为xml,josn,scrits脚本的方法):
using System.Collections;
using System.Collections.Generic;
//using UnityEngine;
using UnityEditor;
using System.IO;
using Excel;
using System.Data;
using System.Xml;
using System;
using System.Reflection;
public enum SlectExcelType
{
Xml = 1, Josn = 2, ScriptObject = 3
};
public enum ParamType { Int = 0, String = 1, Float = 2, ListInt = 3, ListString = 4, MyDic = 5, Class };
public class ReadDataEditor : Editor
{
public static SlectExcelType excelType = SlectExcelType.Xml;
public static Dictionary<string, string> FieleNameDic = new Dictionary<string, string>();
public static List<object> allJsondata = new List<object>();
[MenuItem("ReadExcel/Xml")]
static void ReadExcelToXML()
{
excelType = SlectExcelType.Xml;
SelectExcel();
}
[MenuItem("ReadExcel/Josn")]
static void ReadExcelToJosn()
{
excelType = SlectExcelType.Josn;
SelectExcel();
}
[MenuItem("ReadExcel/CreateScripts")]
static void ReadExcelToScriptObject()
{
excelType = SlectExcelType.ScriptObject;
SelectExcel();
}
//选取xml文件或文件夹
private static bool SelectExcel()
{
FieleNameDic.Clear();
DirectoryInfo dir = new DirectoryInfo(UnityEngine.Application.dataPath).Parent;
dir = new DirectoryInfo(dir.FullName + "/game_jobskill");
if (Directory.Exists(dir.FullName) == false)
{
Directory.CreateDirectory(dir.FullName);
UnityEngine.Debug.Log(string.Format("创建{0}目录成功!", dir.FullName));
}
// string filePath = EditorUtility.OpenFilePanel("请选择配置文件", dir.FullName, null);//单独选择一个文件夹
string path = EditorUtility.OpenFolderPanel("", "", "");
string[] files = Directory.GetFiles(path);
for (int i = 0; i < files.Length; i++)
{
string filePath = files[i];
if (filePath.Length == 0)
{
return false;
}
string[] fileNamees = filePath.Split('\\')[1].Split('.');
if (FieleNameDic.ContainsKey(fileNamees[0]))
FieleNameDic.Remove(fileNamees[0]);
FieleNameDic.Add(fileNamees[0], filePath);
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
if (excelType == SlectExcelType.Xml)
{
CreateXml(result, GetPathe(fileNamees[0]), fileNamees[0]);
excelReader.Close();
}
else if (excelType == SlectExcelType.Josn)
{
// TODO添加了所有类型的列表,遍历列表进行创建(判断类别类型名称和文件名相同或者关联,本篇中是在文件名上加了“Data”后缀为类名)
game_jobskillData obj = new game_jobskillData();
city_infoData obj2 = new city_infoData();
allJsondata.Add(obj);
allJsondata.Add(obj2);
for (int j = 0; j < allJsondata.Count; j++)
{
if (fileNamees[0] + "Data" == allJsondata[j].GetType().Name)
CreateJosn(allJsondata[j].GetType(), result, GetPathe(fileNamees[0]));
continue;
}
excelReader.Close();
}
else if (excelType == SlectExcelType.ScriptObject)
{
CreateScriptObject(result, GetPathe(fileNamees[0]), fileNamees[0]);
}
excelReader.Close();
stream.Close();
}
AssetDatabase.Refresh();
string PatheName = UnityEngine.Application.dataPath + @"/Editor/";
// string filePath = null;
CreateObjectStart(PatheName, FieleNameDic);
AssetDatabase.Refresh();
UnityEngine.Debug.Log("导入xml" + dir.Name + "结束");
return true;
}
}
1.josn:
两个excel表类:
[System.Serializable]
public class game_jobskillData
{
/// <summary>
/// 技能编号
/// </summary>
public int id;
/// <summary>
/// 技能名称
/// </summary>
public string name;
/// <summary>
/// 技能图标路径
/// </summary>
public string icon;
/// <summary>
/// 技能开始动画路径
/// </summary>
public string animation;
/// <summary>
/// 消耗的活力
/// </summary>
public int power;
/// <summary>
/// 技能描述
/// </summary>
public string description;
/// <summary>
/// 职业限制
/// </summary>
public int job;
/// <summary>
/// 冷却时间
/// </summary>
public float time;
/// <summary>
/// 技能类型 1_主动技能 2_被动技能
/// </summary>
public string type;
public int jobId;
public int jobType;
public float showTime;
public float startTime;
public float continueTime;
public float releaseTime;
public string skiljob;
public string skillMusic;
public string skillOthers;
}
[System.Serializable]
public class city_infoData
{
public int id;
public float lng;
public float lat;
public string province;
public string city;
public string area;
public string code;
}
创建josn数据的方法
#region//调用转出为josn的方法
/// <summary>
/// 读取一个工作表的数据
/// </summary>
/// <param name="type">要转换的struct或class类型</param>
/// <param name="dataTable">读取的工作表数据</param>
/// <param name="jsonPath">存储路径</param>
private stat