Unity编辑器脚本:如何在Script B的Inspector中显示Script A的数据
解决方案
问题根源在于你没有在Script B中声明Script A的引用字段,且编辑器脚本错误地尝试直接查找属于Script A的IntValue属性——而serializedObject对应的是Script B的实例,自然找不到不属于它的字段。以下是修正步骤:
1. 给Script B添加Script A的引用
在Script B中添加一个公共的Script A引用字段,让Unity可以序列化这个关联关系:
public class ScriptB : MonoBehaviour { // 添加Script A的引用,必须设为public或加[SerializeField]才能被序列化 public ScriptA scriptAReference; void Start() { } void Update() { } }
2. 修改编辑器脚本,通过引用访问Script A的字段
编辑器脚本需要先找到Script B中的scriptAReference属性,再通过该属性的路径访问其内部的IntValue:
using UnityEditor; using UnityEngine; [CustomEditor(typeof(ScriptB))] public class MyEditor : Editor { private SerializedProperty scriptARefProperty; private SerializedProperty intValueProperty; private void OnEnable() { // 先找到Script B中的scriptAReference属性 scriptARefProperty = serializedObject.FindProperty("scriptAReference"); // 通过属性路径访问Script A中的IntValue intValueProperty = scriptARefProperty.FindPropertyRelative("IntValue"); } public override void OnInspectorGUI() { serializedObject.Update(); // 绘制Script B的默认Inspector DrawDefaultInspector(); // 当Script A引用不为空时,才显示IntValue字段 if (scriptARefProperty.objectReferenceValue != null) { EditorGUILayout.Space(); EditorGUILayout.LabelField("来自Script A的数据", EditorStyles.boldLabel); EditorGUILayout.PropertyField(intValueProperty); } else { EditorGUILayout.HelpBox("请先指定Script A的引用", MessageType.Warning); } serializedObject.ApplyModifiedProperties(); } }
3. 使用说明
- 将Script A挂载到场景中的某个GameObject上
- 选中挂载了Script B的GameObject,在Inspector面板中拖拽挂载了Script A的对象到
Script A Reference字段 - 此时就能在Script B的Inspector中看到并修改Script A的
IntValue了
Script A的代码无需修改,保持原样即可:
public class ScriptA : MonoBehaviour { public int IntValue; }
内容的提问来源于stack exchange,提问作者talha
相关产品推荐
相关产品推荐

