實現(xiàn)思路如下:
1、定義一個二維數(shù)組數(shù)據(jù)類
2、獎數(shù)據(jù)類標記為 Serializable? 并實現(xiàn) unity內置的? ISerializationCallbackReceiver接口,接口提供了序列化和反序列化方法,參見官方文檔(文檔中給出了字典的序列化方法):Unity - Scripting API: ISerializationCallbackReceiver
3、使用unity序列化系統(tǒng)可識別的數(shù)據(jù)存儲二維數(shù)組中的數(shù)據(jù),這里使用一維數(shù)組
4、將數(shù)據(jù)類作為變量,重寫主體類的inspector編輯器面板,并提供數(shù)據(jù)操作方法
代碼如下:
數(shù)據(jù)類
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class DataGrid2 : ISerializationCallbackReceiver
{
#region 數(shù)據(jù)類內容
/// <summary>
/// 行名
/// </summary>
[HideInInspector] public List<string> rowNames = new List<string>();
/// <summary>
/// 列名
/// </summary>
[HideInInspector] public List<string> columnNames = new List<string>();
[SerializeField] public string[,] data = new string[0, 0];
#endregion
#region 序列化與反序列化操作
[HideInInspector]
public string[] serializedArray;
public void OnBeforeSerialize()
{
int rows = rowNames.Count;
int cols = columnNames.Count;
serializedArray = new string[rows * cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
serializedArray[i * cols + j] = data[i, j];
}
}
}
public void OnAfterDeserialize()
{
int rows = rowNames.Count;
int cols = columnNames.Count;
data = new string[rows, cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
data[i, j] = serializedArray[i * cols + j];
}
}
}
#endregion
#region 對數(shù)據(jù)內容的操作
public void AddRow()
{
rowNames.Add("RowName");
string[,] newData = new string[rowNames.Count, columnNames.Count];
for (int i = 0; i < rowNames.Count; i++)
{
if (i == rowNames.Count - 1)
{
for (int j = 0; j < columnNames.Count; j++)
{
newData[i, j] = "0";
}
}
else
{
for (int j = 0; j < columnNames.Count; j++)
{
newData[i, j] = data[i, j];
}
}
}
data = newData;
}
public void DeletedRow()
{
rowNames.RemoveAt(rowNames.Count - 1);
string[,] newData = new string[rowNames.Count, columnNames.Count];
for (int i = 0; i < rowNames.Count; i++)
{
for (int j = 0; j < columnNames.Count; j++)
{
newData[i, j] = data[i, j];
}
}
data = newData;
}
public void AddColumn()
{
columnNames.Add("ColumnName");
string[,] newData = new string[rowNames.Count, columnNames.Count];
for (int i = 0; i < rowNames.Count; i++)
{
for (int j = 0; j < columnNames.Count; j++)
{
if (j == columnNames.Count - 1)
newData[i, j] = "0";
else
newData[i, j] = data[i, j];
}
}
data = newData;
}
public void DeletedColumn()
{
columnNames.RemoveAt(columnNames.Count - 1);
string[,] newData = new string[rowNames.Count, columnNames.Count];
for (int i = 0; i < rowNames.Count; i++)
{
for (int j = 0; j < columnNames.Count; j++)
{
newData[i, j] = data[i, j];
}
}
data = newData;
}
public void CleraData()
{
rowNames.Clear();
columnNames.Clear();
data = new string[0, 0];
}
#endregion
}
編輯器重寫
public class TestDataGrid2 : MonoBehaviour
{
public string name = "常規(guī)變量";
public DataGrid2 data = new DataGrid2();
}
?文章來源地址http://www.zghlxwxcb.cn/news/detail-716440.html
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
[CustomEditor(typeof(TestDataGrid2))]
public class TestDataGrid2Editor : Editor
{
GUIStyle green = new GUIStyle(EditorStyles.textArea);
GUIStyle red = new GUIStyle(EditorStyles.textArea);
TestDataGrid2 DG2;
private void Awake()
{
DG2 = (TestDataGrid2)target;
}
float width = 0;
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.LabelField("這是一個二維數(shù)組的配置文件,默認使用 string 類型");
EditorGUILayout.LabelField("data : ");
EditorGUILayout.BeginVertical();
if (GUILayout.Button("清空數(shù)據(jù)"))
{
DG2.data.CleraData();
}
EditorGUILayout.BeginHorizontal();
EditorGUILayout.TextField($"{DG2.data.rowNames.Count}行/{DG2.data.columnNames.Count}列", red);
for (int j = 0; j < DG2.data.columnNames.Count; j++)
{
DG2.data.columnNames[j] = EditorGUILayout.TextField(DG2.data.columnNames[j].ToString(), green);
}
EditorGUILayout.EndHorizontal();
for (int i = 0; i < DG2.data.rowNames.Count; i++)
{
EditorGUILayout.BeginHorizontal();
DG2.data.rowNames[i] = EditorGUILayout.TextField(DG2.data.rowNames[i], green);
for (int j = 0; j < DG2.data.columnNames.Count; j++)
{
DG2.data.data[i, j] = EditorGUILayout.TextField(DG2.data.data[i, j].ToString());
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("++添加尾行++"))
{
DG2.data.AddRow();
}
GUILayout.Space(15);
if (GUILayout.Button("--刪除尾行--"))
{
DG2.data.DeletedRow();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("++添加尾列++"))
{
DG2.data.AddColumn();
}
GUILayout.Space(15);
if (GUILayout.Button("--刪除尾列--"))
{
DG2.data.DeletedColumn();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
serializedObject.ApplyModifiedProperties();
}
}
面板效果如圖
?附:將數(shù)據(jù)類作為持久化數(shù)據(jù)保存,提取編輯器面板類,在作為變量使用時,也作為子面板繪制
數(shù)據(jù)類
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "DataGrid", menuName = "DataGrid", order = 10)]
public class DataGrid : ScriptableObject, ISerializationCallbackReceiver
{
#region 數(shù)據(jù)內容
[HideInInspector] public List<string> rowNames = new List<string>();
[HideInInspector] public List<string> columnNames = new List<string>();
[SerializeField]
public string[,] data = new string[0, 0];
#endregion
#region 序列化和反序列化
[HideInInspector]
public string[] serializedArray;
public void OnBeforeSerialize()
{
int rows = rowNames.Count;
int cols = columnNames.Count;
serializedArray = new string[rows * cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
serializedArray[i * cols + j] = data[i, j];
}
}
}
public void OnAfterDeserialize()
{
int rows = rowNames.Count;
int cols = columnNames.Count;
data = new string[rows, cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
data[i, j] = serializedArray[i * cols + j];
}
}
}
#endregion
#region 數(shù)據(jù)操作
public void AddRow()
{
rowNames.Add("RowName");
string[,] newData = new string[rowNames.Count, columnNames.Count];
for (int i = 0; i < rowNames.Count; i++)
{
if (i == rowNames.Count - 1)
{
for (int j = 0; j < columnNames.Count; j++)
{
newData[i, j] = "0";
}
}
else
{
for (int j = 0; j < columnNames.Count; j++)
{
newData[i, j] = data[i, j];
}
}
}
data = newData;
}
public void DeletedRow()
{
rowNames.RemoveAt(rowNames.Count - 1);
string[,] newData = new string[rowNames.Count, columnNames.Count];
for (int i = 0; i < rowNames.Count; i++)
{
for (int j = 0; j < columnNames.Count; j++)
{
newData[i, j] = data[i, j];
}
}
data = newData;
}
public void AddColumn()
{
columnNames.Add("ColumnName");
string[,] newData = new string[rowNames.Count, columnNames.Count];
for (int i = 0; i < rowNames.Count; i++)
{
for (int j = 0; j < columnNames.Count; j++)
{
if (j == columnNames.Count - 1)
newData[i, j] = "0";
else
newData[i, j] = data[i, j];
}
}
data = newData;
}
public void DeletedColumn()
{
columnNames.RemoveAt(columnNames.Count - 1);
string[,] newData = new string[rowNames.Count, columnNames.Count];
for (int i = 0; i < rowNames.Count; i++)
{
for (int j = 0; j < columnNames.Count; j++)
{
newData[i, j] = data[i, j];
}
}
data = newData;
}
public void CleraData()
{
rowNames.Clear();
columnNames.Clear();
data = new string[0, 0];
}
#endregion
}
?編輯器面板
using DG.Tweening;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(DataGrid))]
public class DataGridEditor : Editor
{
DataGrid grid;
GUIStyle green = new GUIStyle(EditorStyles.textArea);
GUIStyle red = new GUIStyle(EditorStyles.textArea);
private void Awake()
{
grid = (DataGrid)target;
green.normal.textColor= Color.green;
red.normal.textColor= Color.red;
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.LabelField("這是一個二維數(shù)組的配置文件,默認使用 string 類型");
EditorGUILayout.LabelField("data : ");
EditorGUILayout.BeginVertical();
if (GUILayout.Button("清空數(shù)據(jù)"))
{
grid.CleraData();
EditorUtility.SetDirty(grid);
AssetDatabase.SaveAssets();
}
EditorGUILayout.BeginHorizontal();
EditorGUILayout.TextField($"{grid.rowNames.Count}行/{grid.columnNames.Count}列", red);
for (int j = 0; j < grid.columnNames.Count; j++)
{
grid.columnNames[j] = EditorGUILayout.TextField(grid.columnNames[j].ToString(), green);
}
EditorGUILayout.EndHorizontal();
for (int i = 0; i < grid.rowNames.Count; i++)
{
EditorGUILayout.BeginHorizontal();
grid.rowNames[i] = EditorGUILayout.TextField(grid.rowNames[i], green);
for (int j = 0; j < grid.columnNames.Count; j++)
{
grid.data[i, j] = EditorGUILayout.TextField(grid.data[i, j].ToString());
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("++添加尾行++"))
{
grid.AddRow();
EditorUtility.SetDirty(grid);
AssetDatabase.SaveAssets();
}
GUILayout.Space(15);
if (GUILayout.Button("--刪除尾行--"))
{
grid.DeletedRow();
EditorUtility.SetDirty(grid);
AssetDatabase.SaveAssets();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("++添加尾列++"))
{
grid.AddColumn();
EditorUtility.SetDirty(grid);
AssetDatabase.SaveAssets();
}
GUILayout.Space(15);
if (GUILayout.Button("--刪除尾列--"))
{
grid.DeletedColumn();
EditorUtility.SetDirty(grid);
AssetDatabase.SaveAssets();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
if (GUILayout.Button("保存/更新"))
{
EditorUtility.SetDirty(grid);
AssetDatabase.SaveAssets();
}
serializedObject.ApplyModifiedProperties();
}
}
?效果:
?作為變量使用(借助 Editor.CreateEditor 方法):
效果如下:
?文章來源:http://www.zghlxwxcb.cn/news/detail-716440.html
?
到了這里,關于unity 通過 二維數(shù)組序列化 實現(xiàn)二維數(shù)組在編輯器面板查看和配置數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!