Unity 根據csv生成數據類

工具類-AutoCreateScript

用於生成csv文件對應的數據類

csv文件測試數據

生成的數據類

unity Assets下目錄結構

工具類AutoCreateScript代碼如下:

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

public class AutoCreateScript
{
    public static string csv_folder = Application.dataPath + "/Auto/Csv/";  //讀取的CSV目錄
    public static string script_folder = Application.dataPath + "/Auto/Model/";//生成的數據類所在目錄

//數據類模板
    public static string class_template =
@"
using System;
public class #class_name#
{
    //auto
    #class_menbers#
}
";

    /// <summary>
    /// 生成csv目錄下所有csv對應數據類
    /// </summary>
    [MenuItem("Tools/CreateScripts/All")]
    public static void All()
    {
        string[] files = Directory.GetFiles(csv_folder);
        
        if (files.Length < 1)
        {
            Debug.LogError("get files from " + csv_folder + " fail...");
            return;
        }
        
        for (int index = 0; index < files.Length; index++)
        {
            CreateSingleScript(files[index]);
        }
    }

    /// <summary>
    /// 生成csv目錄下選中的csv對應的數據類
    /// </summary>
    [MenuItem("Tools/CreateScripts/Single")]
    public static void Single()
    {
        string[] csv_guids = Selection.assetGUIDs;//選中的csv文件的guid
        if (csv_guids.Length < 1)
        {
            Debug.LogError("select csv count < 1");
            return;
        }
        List<string> csv_paths = new List<string>();
        for (int guids_index = 0;guids_index<csv_guids.Length;guids_index++)
        {
            string csv_path = AssetDatabase.GUIDToAssetPath(csv_guids[guids_index]);//unity 通過guid獲取路徑
            csv_path = Application.dataPath + csv_path.Substring(csv_path.IndexOf("/"));//通過guid獲取的路徑需要處理下 轉成文件系統裏的絕對路徑
            CreateSingleScript(csv_path);
        }
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="file_path"></param>
    private static void CreateSingleScript(string file_path)
    {
        if (string.IsNullOrEmpty(file_path))
        {
            return;
        }

        //忽略.meta
        if (file_path.Substring(file_path.LastIndexOf(".") + 1) == "meta")
        {
            return;
        }

        //跳過非csv文件
        if (file_path.Substring(file_path.LastIndexOf(".") + 1) != "csv")
        {
            Debug.Log(file_path + " 非csv文件");
            return;
        }

        string file_name = file_path.Substring(file_path.LastIndexOf("/") + 1).Split('.')[0];//csv文件名,主要用於生成對應數據類的類名


        StreamReader sr = null;
        try
        {
            sr = File.OpenText(file_path);
        }
        catch
        {
            Debug.LogError("File cannot find ! ");
            return;
        }

        string line = sr.ReadLine();
        if (null == line)
        {
            Debug.Log(file_path + " read fail");
            return;
        }
        line = sr.ReadLine();

        sr.Close();
        sr.Dispose();

        file_name = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(file_name) + "DataAuto";
        string script_path = script_folder + file_name + ".cs";

        if (File.Exists(script_path))
        {
            File.Delete(script_path);
        }


        Debug.Log(file_name);
        string class_content = class_template;

        string memberstring = "";
        string[] column = line.Split(',');
        for (int column_index = 0; column_index < column.Length; column_index++)
        {
            string[] column_detail = column[column_index].Split('|');

            memberstring += "public " + column_detail[1] + " " + column_detail[0] + ";\r\n\t";
        }

        class_content = class_content.Replace("#class_name#", file_name);
        class_content = class_content.Replace("#class_menbers#", memberstring);


        FileStream file = new FileStream(script_path, FileMode.CreateNew);
        StreamWriter fileW = new StreamWriter(file, Encoding.UTF8);
        fileW.Write(class_content);
        fileW.Flush();
        fileW.Close();
        file.Close();


        Debug.Log("create  " + Application.dataPath + "/Auto/Model/" + file_name + ".cs success!");
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章