国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

unity 通過 二維數(shù)組序列化 實現(xiàn)二維數(shù)組在編輯器面板查看和配置數(shù)據(jù)

這篇具有很好參考價值的文章主要介紹了unity 通過 二維數(shù)組序列化 實現(xiàn)二維數(shù)組在編輯器面板查看和配置數(shù)據(jù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

實現(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();
    }
}

面板效果如圖

unity 二維數(shù)組序列化,unity筆記,c#,unity

unity 二維數(shù)組序列化,unity筆記,c#,unity

?附:將數(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();
    }
}

?效果:

unity 二維數(shù)組序列化,unity筆記,c#,unity

?作為變量使用(借助 Editor.CreateEditor 方法):

unity 二維數(shù)組序列化,unity筆記,c#,unity

效果如下:

unity 二維數(shù)組序列化,unity筆記,c#,unity

?

?

到了這里,關于unity 通過 二維數(shù)組序列化 實現(xiàn)二維數(shù)組在編輯器面板查看和配置數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • RabbitMQ 消息對象通過 Jackson 庫消息轉化器 序列化/反序列化 天坑!

    RabbitMQ 消息對象通過 Jackson 庫消息轉化器 序列化/反序列化 天坑!

    目錄 1. 報錯的背景 2. 問題分析 3. 最佳解決辦法 a)使用 RabbitMQ 發(fā)送消息時,發(fā)送消息的類型為 MapString, Object,map 里面我?put 了一個 String, Long 類型,如下圖: b)這里有一個前提:我清楚使用 org.springframework.amqp.rabbit.core.RabbitTemplate 來發(fā)送消息到 RabbitMQ 隊列時,消息的序列

    2024年04月15日
    瀏覽(31)
  • Unity | 序列化(Serialized)和反序列化(NonSerialized)是什么意思

    Unity | 序列化(Serialized)和反序列化(NonSerialized)是什么意思

    一、什么是序列化 官方敘述: 序列化是將對象的狀態(tài)信息轉換為可以存儲或傳輸?shù)男问降倪^程。 人話敘述: 我們平時輸入的代碼,實際上是不能儲存或者傳輸?shù)?,所以我們需要翻譯一下,翻譯成能儲存或者翻譯的文字,這個翻譯的過程叫做序列化。 二、什么要序列化 問題

    2024年02月11日
    瀏覽(28)
  • Unity基于Google Protobuf序列化和反序列化小案例

    Unity基于Google Protobuf序列化和反序列化小案例

    1.協(xié)議定義,簡單實現(xiàn)傳玩家的2D坐標? ? 2.在Unity的Assets目錄下創(chuàng)建一個Plugins文件夾(必須這樣命名),此文件專門存放擴展文件, 再新建文件夾BaseInfolibrary,將Google.Protobuf.dll拖入 ?3.新建一個Test.cs腳本 ?腳本中引入命名空間 代碼改進:通用序列化模板(只用來序列化Message)

    2024年02月15日
    瀏覽(28)
  • Unity序列化

    Unity 的序列化是作用于 C# 類的字段 而非屬性。 序列化規(guī)則 對于需要被序列化的字段,需要遵守一些規(guī)則 訪問修飾符是 public ,或者具有 SerializeField 特性 非 static 非 const 可以被序列化的字段類型 基礎數(shù)據(jù)結構( int , float , double , bool , string 等) 枚舉(32 位 或 以下) 固定大

    2024年02月06日
    瀏覽(16)
  • Unity——腳本與序列化

    數(shù)據(jù)序列化有以下幾個主要的應用場景和目的: 1. 持久化存儲:序列化可以將對象或數(shù)據(jù)結構轉換為字節(jié)序列,使得其可以被存儲在磁盤上或數(shù)據(jù)庫中。通過序列化,我們可以將應用程序中運行時的數(shù)據(jù)持久化保存,以便在后續(xù)運行時重新加載和使用。 2. 數(shù)據(jù)傳輸:序列化

    2024年01月18日
    瀏覽(17)
  • unity中,什么是序列化資源?

    好的,以下是序列化資源(Serialized Asset)的詳細解釋,包括介紹、方法和舉例: 在Unity中,序列化資源是指將Unity場景或預制件中的對象及其屬性保存到磁盤上的文件中,以便在將來將其還原為原始狀態(tài)。序列化資源文件可以包括場景文件(.unity)和預制件文件(.prefab),它

    2024年02月10日
    瀏覽(23)
  • 在Unity中使用Protobuf進行序列化

    在Unity中使用Protobuf進行序列化

    目錄 1.介紹 1.1 什么是Protobuf 1.2 Protobuf和其他數(shù)據(jù)序列化方案對比 2.下載Protobuf 2.1?方案一 使用VS的Nuget包管理器進行安裝(推薦) 2.1.1安裝Protobuff包 2.1.2拷貝.dll文件 2.2 方案二 從Github下載并自己生成.dll 2.2.1 下載Probuff 2.2.2?VS打開解決方案 2.2.3 安裝.NET SDK 2.2.4 生成.dll文件 3

    2024年04月12日
    瀏覽(30)
  • Unity XML3——XML序列化

    Unity XML3——XML序列化

    ? 序列化:把對象轉化為可傳輸?shù)淖止?jié)序列過程稱為序列化,就是把想要存儲的內容轉換為字節(jié)序列用于存儲或傳遞 ??反序列化:把字節(jié)序列還原為對象的過程稱為反序列化,就是把存儲或收到的字節(jié)序列信息解析讀取出來使用 1.準備數(shù)據(jù)結構 2.進行序列化 XmlSerializer:用

    2024年02月15日
    瀏覽(24)
  • 【工具篇】SerializableDictionary字典序列化Unity面板顯示

    目錄 一:導入插件 二:創(chuàng)建目標字典類 三:生成數(shù)據(jù) ?四:自定義配置數(shù)據(jù) Unity本身對字典這種數(shù)據(jù)結構沒有序列

    2024年02月15日
    瀏覽(42)
  • 網(wǎng)絡數(shù)據(jù)通信—ProtoBuf實現(xiàn)序列化和反序列化

    目錄 前言 1.環(huán)境搭建 2. centos下編寫的注意事項 3.約定雙端交互接口 4.約定雙端交互req/resp 5. 客戶端代碼實現(xiàn) 6.服務端代碼實現(xiàn) Protobuf還常用于通訊協(xié)議、服務端數(shù)據(jù)交換場景。那么在這個示例中,我們將實現(xiàn)一個網(wǎng)絡版本的通訊錄,模擬實現(xiàn)客戶端與服務端的交互,通過P

    2024年02月04日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包