IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 使用Excel编辑配置文件并导入Unity生成ScriptableObject -> 正文阅读

[游戏开发]使用Excel编辑配置文件并导入Unity生成ScriptableObject

Unity ScripableObject => CSV

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using UnityEditor;
using UnityEngine;

public class CSVExporter : ScriptableWizard
{
	public string _ScriptableObjectClassName = "";

	private string _SaveTo = "";
	public string SaveTo
	{
		get
		{
			return _SaveTo;
		}
		private set
		{
			_SaveTo = value;
		}
	}

	private Type type = null;

	[MenuItem("Tools/Excel Config/Export Excel Template")]
	static void ExportXml()
	{
		ScriptableWizard.DisplayWizard<CSVExporter>("Export Excel Template", "Export", "SelectPath");
	}

	void OnWizardUpdate()
	{
		isValid = false;

		if (_ScriptableObjectClassName == "")
		{
			errorString = "Enter ScriptableObject class name";
			return;
		}

		type = Type.GetType(_ScriptableObjectClassName);
		if (type == null)
		{
			errorString = "Invalid class name!";
			return;
		}

		isValid = true;

		if (SaveTo == "")
		{
			errorString = "Select save path!";
			return;
		}

		errorString = " ";
	}

	void OnWizardCreate()
	{
		ExportCSVMethod(_ScriptableObjectClassName, SaveTo, _ScriptableObjectClassName);
	}

	void OnWizardOtherButton()
	{
		SaveTo = EditorUtility.OpenFolderPanel("SaveTo", "", "") + "/";
		if (SaveTo != "")
		{
			helpString = "SavePath: \"" + SaveTo + "\"";
			return;
		}
	}

	public void ExportCSVMethod(string typeName, string path, string fileName)
	{
		Type type = Type.GetType(typeName);
		//read all allow-type variable by reflection and save as .csv;
		string filePath = path + fileName + ".csv";
		string content = string.Empty;
		using (StreamWriter sw = new StreamWriter(filePath))
		{
			FieldInfo[] fieldInfos = type.GetFields();
			int count = 0;
			foreach (FieldInfo fieldInfo in fieldInfos)
			{
				if (!fieldInfo.IsNotSerialized) 
				{
					if (count > 0) 
					{
						sw.Write(',');
					}
					sw.Write(fieldInfo.Name);
					count++;
				}
			}
		}
	}
}

CSV=>Excel
Excel=>CSV
别忘了改成UTF格式,否则读不了中文!!!

CSV => Unity ScripableObject

using System;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class CSVImporter
{
	[MenuItem("Tools/Excel Config/Import Excel Data")]
	public static void ImportXmlTemplateMethod()
	{
		DirectoryInfo info = new DirectoryInfo("Assets");
		if (!info.Exists) info.Create();
		//choose csv
		string path = EditorUtility.OpenFilePanel("Import Excel Data", "", "csv");
		if (string.IsNullOrEmpty(path))
			return;
		string[] split = path.Split('/');
		string fileName = split[split.Length - 1].Split('.')[0];
		string copyPath = "Assets/" + fileName + ".csv";
		TextAsset text = AssetDatabase.LoadMainAssetAtPath(copyPath) as TextAsset;
		if (text != null)
		{
			AssetDatabase.DeleteAsset(copyPath);
		}
		FileUtil.CopyFileOrDirectory(path, Application.dataPath + "/" + fileName + ".csv");
		AssetDatabase.ImportAsset(copyPath);
		text = AssetDatabase.LoadMainAssetAtPath(copyPath) as TextAsset;
		if (text == null) 
		{
			return;
		}

		//get scriptable object 
		Type dataType = Type.GetType(fileName);
		if (dataType == null)
		{
			AssetDatabase.DeleteAsset(copyPath);
			Debug.Log("Don't hava this name of ScriptableObject:" + fileName);
			return;
		}

		//choose data path
		string importPath = EditorUtility.SaveFilePanel("Save Data Path", Application.dataPath, "data", ".asset");
		if (string.IsNullOrEmpty(importPath))
			return;
		string relativePath = importPath.Split(new string[] { "Assets" }, StringSplitOptions.None)[1];
		string[] divides = relativePath.Split('/');
		string saveFolder = "Assets";
		for (int i = 0; i < divides.Length - 1; i++) 
		{
			saveFolder += divides[i] + "/";
		}

		//get field
		string[] rows = text.text.Split(new string[] { "\n" }, System.StringSplitOptions.RemoveEmptyEntries);
		for (int i = 0; i < rows.Length; i++) 
		{
			rows[i] = rows[i].TrimEnd('\r');
		}
		string[] columns = rows[0].Split(',');
		List<FieldInfo> fieldInfos = new List<FieldInfo>();
		List<bool> multis = new List<bool>();
		foreach (string column in columns)
		{
			string col = column.TrimEnd();
			string fieldName = col.Split('+')[0];
			FieldInfo field = dataType.GetField(fieldName);
			if (field != null)
			{
				fieldInfos.Add(field);

				bool multi = col.Contains("+");
				multis.Add(multi);
			}
			else 
			{
				Debug.Log(fieldName);
			}
		}


		//create data
		for (int i = 1; i < rows.Length; i++)
        {
			if (rows[i] == null)
				continue;
			columns = rows[i].Split(',');
            string assetPath = saveFolder + columns[0] + ".asset";
            ScriptableObject asset = ScriptableObject.CreateInstance(fileName);
            for (int j = 0; j < fieldInfos.Count; j++)
			{
				//Debug.Log(fieldInfos[j].FieldType + ":" + columns[j]);
				object value = StringConvert.ToValue(fieldInfos[j].FieldType, columns[j], multis[j]);
                fieldInfos[j].SetValue(asset, value);
            }
            AssetDatabase.CreateAsset(asset, assetPath);
            AssetDatabase.ImportAsset(assetPath);
			AssetDatabase.Refresh();
        }
        AssetDatabase.DeleteAsset(copyPath);
	}
}

字符串类型转为其他类型:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Object = System.Object;

public class StringConvert
{
    public static Object ToValue(Type type, string s, bool multi)
    {
        object o = null;
        s = ClearEndEmpty(s);
        if (type.IsEnum)
        {
            if (multi)
            {
                int value = 0;
                if (s == "无")
                {
                    value = 0;
                }
                else 
                {
                    string[] currentEnumNames = s.Split('+');
                    for (int i = 0; i < currentEnumNames.Length; i++)
                    {
                        value += (int)Enum.Parse(type, currentEnumNames[i]);
                    }
                    o = value;
                }
                o = value;
            }
            else
            {
                o = Enum.Parse(type, s);
            }
        }
        else if (typeof(string).Equals(type))
        {
            o = s;
        }
        else if (typeof(bool).Equals(type))
        {
            o = s.Equals("1");
        }
        else if (typeof(int).Equals(type))
        {
            int value = 0;
            int.TryParse(s, out value);
            o = value;
        }
        else if (typeof(float).Equals(type))
        {
            float value = 0f;
            float.TryParse(s, out value);
            o = value;
        }

        return o;
    }

    public static string ClearEndEmpty(string s) 
    {
        return s.TrimEnd(new char[] {' ', '\r', '\n' });
    }
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-12 00:22:24  更:2022-01-12 00:24:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:31:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码