You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity编辑器代码中如何分配ScriptableObject实例

在自定义节点图编辑器中访问ScriptableObject数据的实现方案

1. 创建包含Color字段的ScriptableObject

创建继承自ScriptableObject的类,添加CreateAssetMenu特性方便快速生成实例:

using UnityEngine;

[CreateAssetMenu(fileName = "ColorData", menuName = "ScriptableObjects/ColorData")]
public class ColorDataSO : ScriptableObject
{
    public Color targetColor;
}

2. 创建SO实例并设置颜色

在Project窗口右键,选择Create > ScriptableObjects > ColorData生成SO实例,选中实例后在Inspector面板中设置targetColor的颜色值。

3. 编辑器脚本中获取SO实例

根据编辑器脚本的类型,有两种常见实现方式:

场景一:自定义EditorWindow中获取

在EditorWindow类中声明[SerializeField]字段,同时在窗口GUI中添加拖拽选择区域:

using UnityEditor;
using UnityEngine;

public class NodeGraphEditorWindow : EditorWindow
{
    [SerializeField] private ColorDataSO colorData;

    [MenuItem("Window/Node Graph Editor")]
    public static void OpenWindow()
    {
        GetWindow<NodeGraphEditorWindow>("Node Graph Editor");
    }

    private void OnGUI()
    {
        // 显示SO选择框,支持拖拽赋值
        colorData = (ColorDataSO)EditorGUILayout.ObjectField("Color Data", colorData, typeof(ColorDataSO), false);
    }
}

场景二:自定义Editor(针对MonoBehavior)中获取

先在目标MonoBehavior中添加SO的序列化字段,再在编辑器脚本中通过target或SerializedProperty获取:

目标MonoBehavior代码:

public class NodeGraphManager : MonoBehaviour
{
    [SerializeField] private ColorDataSO colorData;
}

编辑器脚本代码:

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(NodeGraphManager))]
public class NodeGraphManagerEditor : Editor
{
    private SerializedProperty colorDataProp;

    private void OnEnable()
    {
        colorDataProp = serializedObject.FindProperty("colorData");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        EditorGUILayout.PropertyField(colorDataProp);
        serializedObject.ApplyModifiedProperties();

        // 获取SO实例
        var graphManager = (NodeGraphManager)target;
        ColorDataSO colorData = graphManager.colorData;
    }
}

4. 使用SO实例中的颜色

拿到SO实例后,直接调用其targetColor字段即可用于节点绘制等操作:

// 示例:在EditorWindow中绘制带SO颜色的节点
if (colorData != null)
{
    // 绘制彩色节点矩形
    EditorGUI.DrawRect(new Rect(50, 50, 120, 60), colorData.targetColor);
    // 在矩形上绘制文字
    EditorGUI.LabelField(new Rect(50, 50, 120, 60), "Custom Node", EditorStyles.whiteLabel);
}

内容的提问来源于stack exchange,提问作者IndividualGames

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:31:14