unity数据库MySQL插件_unity编辑器xml数据库插件

本文介绍了一个用于Unity的编辑器插件,该插件实现了在Inspector面板上编辑和管理XML数据库数据的功能。通过C#反射解析对象属性,支持数组类型的存储。插件包括读取、创建、更新和删除数据等操作,适用于Unity项目的数据调试。
摘要由CSDN通过智能技术生成

unity编辑器xml数据库插件

注:9月9日更新,其中MyXML.cs中有一句代码写错,查找功能失误,文中已经修改!

注:9月1日更新说明:xml存储结构,因为在用xml之前不知道正规的xml数据结构,所以是自创的结构。虽然也能完成功能,但是据说策划配置时不方便,所以为了统一,不使用节点的方式存储数据,

而是通过添加属性,设置属性的方式来存取数据。

直接上图看的清楚些:

我之前设计的格式:

3e831ee1578279e5100031291043e7ad.png

现在的格式:

ad42cc3c06da929a170380d39d3b9a68.png

关于这部分的代码我会贴在最后。

程序和数据分离的意义我就不多说了,大家自己脑补或者百度。在使用unity开发时,数据的调试是非常频繁和重要的。我们可以制作一个简单的编辑器插件,将数据显示在Inspector面板上,并进行编辑操作。这样测试人员就可以非常方便的管理测试数据了。

需求很简单,具体的效果是,能读取资源内的类,将其属性显示在面板上,可以对此进行增删改查的操作。如下图所示(对象组,相当于数据库所有的表。对象,相当于表的所有记录)。

d69eea74a2b41452d9c833d81d6fb915.png

70761027d47ddabfcaee1e0cdcbeddc0.png

当需要创建一条新记录的时候,先填上主键,然后点击创建按钮。编辑完成后点击插入即可。

1db339d21c80f063d9c7562c15484dbf.png

7eb3744fc471233d574b93e303e984b6.png

xml数据库文件如下图

5e65809732e973a2cbe7a93d1815b4ef.png

要实现这个功能,需要的知识是,C#的反射类,unity的编辑器类,数据库。通过反射,自动解析对象,获取对象的成员变量名和值。Unity编辑器类没什么好说的,就是一些组件方法的使用。考虑到跨平台等问题,我选择xml作为存储数据库。编辑器内运行,存储量不大,所以性能方面的问题也就不说了。

好,接下来说一说设计的事。首先是对象的反射。基本类型的存储没有问题,难点是数组的存取有点变态。我找了很多资料也不能自动创建某一类型的数组。既然不能自动,然后就使用半自动判断了,无非是if else之类的,看看这个属性是不是某一类型的数组。

下面是代码。

using System;

using System.Reflection;

using UnityEngine;

using System.Collections.Generic;

using System.Runtime.InteropServices;

public class ClassAnalyze

{

private string[] cols;

public string[] Cols

{

get { return cols; }

set { cols = value; }

}

private string[] values;

public string[] Values

{

get { return values; }

set { values = value; }

}

public string ClazzName

{

get { return tempClazz.GetType().Name; }

}

private PropertyInfo[] property;

private T tempClazz;

public static System.Object CreateObject(string objName) {

return Assembly.GetExecutingAssembly().CreateInstance(objName);

}

public T GetClazz(string[] values)

{//将数值赋给对象,然后再获取

SetClazz(values);

this.Values = values;

if (tempClazz == null)

{

return default(T);

}

return tempClazz;

}

public void SetClazz(string[] values)

{//将数值赋给对象,然后再获取

if (tempClazz != null && this.Values.Length == values.Length)

{

this.Values = values;

for (int i = 0; i < property.Length; i++)

{

if (tempClazz.GetType().GetProperty(Cols[i]).PropertyType.IsArray)

{

var tempArr = StringToArr(tempClazz.GetType().GetProperty(Cols

[i]).GetValue(tempClazz, null), values[i].Split(new char[] { '|' }));

property[i].SetValue(tempClazz, tempArr, null);

}

else

{

property[i].SetValue(tempClazz, Convert.ChangeType(values[i], property[i].PropertyType), null);

}

}

}

}

private System.Object StringToArr(System.Object arr, string[] values)

{

if (arr is string[])

{

arr = new string[values.Length];

for (int i = 0; i < values.Length; i++)

{

(arr as string[])[i] = values[i];

}

return (string[])arr;

}

else if (arr is int[])

{

arr = new int[values.Length];

for (int i = 0; i < values.Length; i++)

{

(arr as int[])[i] = int.Parse(values[i]);

}

return (int[])arr;

}

else if (arr is Single[])

{

arr = new Single[values.Length];

for (int i = 0; i < values.Length; i++)

{

(arr as Single[])[i] = Single.Parse(values[i]);

}

return (Single[])arr;

}

else if (arr is float[])

{

arr = new float[values.Length];

for (int i = 0; i < values.Length; i++)

{

(arr as float[])[i] = float.Parse(values[i]);

}

return (float[])arr;

}

else if (arr is double[])

{

arr = new double[values.Length];

for (int i = 0; i < values.Length; i++)

{

(arr as double[])[i] = double.Parse(values[i]);

}

return (double[])arr;

}

else if (arr is long[])

{

arr = new long[values.Length];

for (int i = 0; i < values.Length; i++)

{

(arr as long[])[i] = long.Parse(values[i]);

}

return (long[])arr;

}

else if (arr is System.Object[])

{

arr = new System.Object[values.Length];

for (int i = 0; i < values.Length; i++)

{

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值