Unity編輯器擴充套件 導表工具(2)(通用版)

2021-09-17 18:18:13 字數 4521 閱讀 7296

以下均為我個人總結的方案,如果有所不足的地方,請多多包涵

首先,需要加入庫檔案aspose.cells 和system.data庫檔案

讀取excel資料的思路是:將表中所有資料作為文字資料讀取,轉成datatable,然後在工具內進行型別轉換。

在讀取之前,要先定好我們需要的excel表中的格式,基於以後希望能通用到多個專案。所以我定義的格式支援雙端,格式如下:

第四行,關鍵key數量,簡單來說,就是索引,是通過多少個關鍵key找到對應唯一的資料。

例如,目前的大型網路遊戲,寵物分成了階級,在階級內又分等級,這時候,就是使用2*2,2個關鍵key來做索引了。

接下來,基於asopse.cells,編寫乙個工具類,用於讀取excel表資訊。

以後可以基於這個工具類,再進行擴充套件,做出將資料匯出為excel表內容等等功能。

public class asposeexceltool 

private static datatable readfromfile(string filename, string title)

if (filename.indexof(".xls") < 0)

tryworksheet ws = null;

if (title != null)

ws = wb.worksheets[title];

if (ws == null)

if (ws == null)

file.close();

var iter = ws.cells.getenumerator();

while (iter.movenext())}}

fixcolumns(ws);

return fixrows(ws.cells.exportdatatableasstring(0, 0, ws.cells.maxdatarow + 1, ws.cells.maxdatacolumn + 1, true));}}

catch (exception e)

return null;

}public static void fixcolumns(worksheet ws)

else}}

public static datatable fixrows(datatable dt)

return dt;}}

現在資料已經都轉換成datatable,接下來就是對資料進行處理。

還記得第一篇章中提到的函式updateclientdata,這就是我處理資料的函式。

/// /// 選中檔案路徑

///

private string curfilepath;

/// /// 選中檔案名字

///

private string curfilename;

/// /// 選中檔案大寫名字

///

private string curnewname;

private string fileinfo; //excel裡面的中文名字

private int keynum = 0; //key數量

private bool neederror = true;

private dictionarydicfilenames; //excel名、excel裡面的中文名字

private dictionarydiccolumnnames; //excel表內每行對應的中文名字

private dictionarydicclientmembers; //客戶端型別對應的屬性名

private dictionarydicclienttypes; //客戶端型別

private dictionarydicservermembers; //服務端型別對應的屬性名

private dictionarydicservertypes; //服務端型別

private listindex; //列數

private dictionary> dicdata;//資料字典

private const int export_type_lua = 1;

private const int export_type_json = 2;

private const int export_type_script = 3;

private const int export_type_asset = 4;

private dictionaryexport_type_string = new dictionary();

void onenable()

private bool updateclientdata(fileinfodata fi,int exporttype, bool show = true)

assetdatabase.refresh();}}

return success;

}

以上就是一些初始化工作,重點部分在exportexceltoclient函式裡。

private const int const_file_info_row_index = 0;       //表名index

private const int const_column_names_row_index = 1; //字段描述index

private const int const_keys_row_index = 2; //關鍵key index

private const int const_client_members_row_index = 3; //客戶端屬性名字index

private const int const_client_types_row_index = 4; //客戶端型別index

private const int const_server_members_row_index = 5; //服務端屬性名字index

private const int const_server_types_row_index = 6; //服務端屬性名字index

private const string const_client_int_type = "int";

private const string const_client_string_type = "string";

private const string const_client_array_type = "array";

private static listclient_type_list = new list()

;private bool exportexceltoclient(fileinfodata fi, bool show, int exporttype)

if (datatable.rows.count < (const_server_types_row_index + 1))

try//因為前六行已經在上面進行了判斷,並且continue之後,跳過了下面的步驟

if (!show && fi.tojson) return true;

dictionarydicrowdata = new dictionary();

for (int j = 0; j < datatable.columns.count; j++)

dicdata[i] = dicrowdata;//哪行,對應那一行的所有列數的資料

}//這裡接下去是資料匯出部分,將在第三篇章放出。

}

以上處理datatable中的資料,之前定義好的excel格式,處理不同行數的資料。

根據不同行數,不同處理如下:

#region 客戶端讀取各個欄位tool

private bool readcolumnnames(datatable datatable)

}return success;

}private bool readclientmembers(datatable datatable,bool show,out bool success)

{string member;

success = true;

listmemberlist = new list();

for (int i= 0;i經過了這些處理之後,定義的格式中的不同行數的資料就已經全部讀取並分類好了。

因我個人小專案只是個單機遊戲,所以服務端的部分暫時沒有編寫。

工具都是慢慢完善的,待以後我完善了也會回頭重新梳理寫過的文章。

接下來就是將資料運用起來,然後匯出我們想要的格式,詳細將在第三篇章闡述。

Unity編輯器擴充套件

unity引擎除了提供大部分通用的功能以外,還為開發者提供了編輯器的擴充套件開發介面,開發者可以編寫編輯器指令碼,打造適合自己的遊戲輔助工具和定製的編輯器。以前指令碼開發中使用的一些api和元件類,都屬於執行時類,unity還提供了編輯器類用於編輯器的擴充套件開發,包括編輯器環境下使用的gui類,編...

Unity擴充套件編輯器三

scene檢視是編輯遊戲模型的地方,其實它還可以進行編輯,如下圖所示,我給scene檢視做了簡單的編輯 scene檢視的擴充套件是基於物件的,意思是你必須在hierarchy檢視中選擇乙個物件才行,hierarchy檢視中選擇不同的物件可以有不同的scene檢視。圖中我麼建立了乙個立方體物件,接著給...

Unity編輯器擴充套件 視窗建立

using unityeditor 展示對話方塊中的屬性 public class playerchange scriptablewizard 建立表和屬性被修改的時候每幀被呼叫 private void onwizardupdate 當物體在選中或未選中狀態發生改變時呼叫 private void...