zoukankan      html  css  js  c++  java
  • Unity 拓展 Inspector 视图下拉菜单与及 HideInInspector 属性的使用

    在场景中有两个对象, 分别添加了以下的 Cube 和 TestHideInInspector 脚本,然后在 Unity 编辑器中把有 Cube 脚本的对象拖动到另一个对象的 TestHideInInspector 脚本组件的 cubePrefab 属性。
    此示例中,Cube 只有一个属性 m_id,在 TestHideInInspector 中扩展了 Inspector 视图,在 Inspector 视图 TestHideInInspector 的下拉菜单中选择 Regenerate 生成 3 个新的 Cube,并且在生成时修改的 m_id 属性。
    生成对象后运行场景,发现所有 Cube 的 m_id 属性都为:0,这是因为 m_id 属性没有序列化,在编辑器模式修改它是不能被保存的。

    想要能被保存则需要序列化:

    // 使用 SerializeField 序列化私有属性
    [SerializeField] private int m_id;
    
    // 公共属性会自动序列化
    public int id;
    
    // 使用 HideInInspector 在 Inspector 视图中隐藏序列化的私有属性
    [HideInInspector, SerializeField] private float m_id;
    
    // 使用 HideInInspector 在 Inspector 视图中隐藏序列化的公共属性
    [HideInInspector] public int id;
    

    使用 ContextMenu 拓展 Inspector 时,必须标记场景已修改,否则创建的对象将不能被保存

    #if UNITY_EDITOR
        [ContextMenu("Regenerate")]
        private void Regenerate () {
            // do something
            
            // 标记场景已修改
            UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(gameObject.scene);
        }
    #endif
    

    Cube.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Cube : MonoBehaviour {
    
        private int m_id;
        
        //[SerializeField] private int m_id;
    
        public void SetId(int value) {
            m_id = value;
        }
    
        private void Start () {
            Debug.Log($"name:{gameObject.name}, id:{m_id}");
        }
    }
    

    TestHideInInspector.cs

    #pragma warning disable 0649
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TestHideInInspector : MonoBehaviour {
    
        [SerializeField] private GameObject m_cubePrefab;
    
    #if UNITY_EDITOR
        [ContextMenu("Regenerate")]
        private void Regenerate () {
            for (int i = 0; i < 3; i++) {
                GameObject newCubeGameObject = Instantiate(m_cubePrefab);
                newCubeGameObject.name = $"New Cube {i}";
    
                Cube cube = newCubeGameObject.GetComponent<Cube>();
                cube.SetId(i);
            }
            
            // 标记场景已修改
            //UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(gameObject.scene);
        }
    #endif
    
    }
    

    原文链接

  • 相关阅读:
    .net验证是否合法邮箱和ip地址的方式
    .net通用类型转换方法
    asp.net中的<%%>的使用
    autofac初识
    .net面试题
    asp.net使用一般处理程序实现文件下载
    asp.net 一般处理程序接收上传文件的问题
    Python学习日记(十八) 序列化模块
    Python学习日记(十七) os模块和sys模块
    Python学习日记(十六) time模块和random模块
  • 原文地址:https://www.cnblogs.com/kingBook/p/14950902.html
Copyright © 2011-2022 走看看