BeginChangeCheck() và EditorGUI - bắn cá săn thưởng

Mục lục

Lưu Giá Trị Tùy Chỉnh Inspector trong Unity

LƯU Ý: “Trước Unity 5.3, phương pháp này từng là cách chính để đánh dấu các đối tượng là ‘bẩn’. Từ phiên bản 5.3 trở đi, với sự xuất hiện của tính năng Multi-Scene Editing, hàm này không nên tiếp tục được sử dụng để sửa đổi các đối tượng trong cảnh. Thay vào đó, bạn cần sử dụng Undo.RecordObject trước khi thay đổi đối tượng. Điều này sẽ đánh dấu cảnh của đối tượng là ‘bẩn’ và cung cấp mục undo trong trình biên tập.”

Sau khi xem qua tài liệu của Undo.RecordObject, tôi nhận thấy rằng có một điểm khó khăn là phải sử dụng cả EditorGUI.BeginChangeCheck() và EditorGUI.EndChangeCheck() theo cặp. Đối với các Custom Editor kế thừa, điều này có thể gây rắc rối. Do đó, tôi đã tạo ra một Helper Code bằng cách bọc mã nguồn thành một khối (Code Block) sử dụng Action.

Mã Nguồn Helper

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.SceneManagement;

namespace FinGameWorksEditor.Helper
{
    public static class FGWEditorUtility
    {   
        /// <summary>
        /// Hàm trợ giúp để sử dụng Undo trong Custom Inspector
        /// </summary>
        /// <param name="guiCode">Khối mã để viết nội dung liên quan đến giao diện</param>
        /// <param name="targetCode">Khối mã để cập nhật biến mục tiêu</param>
        /// <param name="target">Đối tượng MonoBehaviour mục tiêu</param>
        public static void RecordUndoBlock(Action guiCode, Action targetCode, UnityEngine.Object target)
        {
            EditorGUI.BeginChangeCheck();
            guiCode();
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Thay Đổi");
                targetCode();
            }
        }
    }
}
#endif

Ví Dụ Sử Dụng

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.SceneManagement;
using FinGameWorks.Helper;
#if UNITY_EDITOR
using UnityEditor;
using FinGameWorksEditor;
using FinGameWorksEditor.Helper;
using FinGameWorks.Controller.SceneManagement;

namespace FinGameWorksEditor.Controller.SceneManagement
{
    [CustomEditor(typeof(FGWSceneLoader), true)]
    public class FGWSceneLoaderEditor : FGWMonobehaviorEditorBase
    {
        public List<string> scenesInBuild
        {
            get
            {
                if (_scenesInBuild == null)
                {
                    _scenesInBuild = FGWSceneHelper.getAllSceneNameInBuild();
                }
                return FGWSceneHelper.getAllSceneNameInBuild();
            }
        }
        private List<string> _scenesInBuild;
        public FGWSceneLoader loader
        {
            get { return (FGWSceneLoader)target; }
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            bool loadSceneOnStart = false;
            int sceneIndexToLoad = 0;

            FGWEditorUtility.RecordUndoBlock(() =>
            {
                GUILayout.Label("Tham Số", EditorStyles.boldLabel);
                loadSceneOnStart = EditorGUILayout.Toggle("Tải Cảnh Khi Bắt Đầu", loader.loadSceneOnStart);
                sceneIndexToLoad = EditorGUILayout.Popup("Cảnh Để Thiết Lập", loader.sceneIndexToLoad, scenesInBuild.ToArray());

                GUILayout.Label("Hành Động", [ban ca 3d online](/post/did-i-adequately-answer-your-condescending-question/)  EditorStyles.boldLabel);
                if (GUILayout.Button("Làm Mới Danh Sách Cảnh"))
                {
                    _scenesInBuild = null;
                    foreach (var item in scenesInBuild)
                    {
                        Debug.Log(item);
                    }
                }
            },
            () =>
            {
                loader.loadSceneOnStart = loadSceneOnStart;
                loader.sceneIndexToLoad = sceneIndexToLoad;
            }, loader);
        }
    }
}

#endif

namespace FinGameWorks.Controller.SceneManagement
{
    public class FGWSceneLoader : MonoBehaviour
    {
        public bool loadSceneOnStart;
        public int sceneIndexToLoad;

        void Start()
        {
            if (loadSceneOnStart)
            {
                SceneManager.LoadScene(sceneIndexToLoad);
            }
        }

        void Update() [bắn cá máy xèng online](/post/moneymaketheworldgoround/) 
        {
        }
    }
}