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

Unity Spatial自定义C#可视化脚本节点运行异常排查求助

Spatial环境下Unity Visual Scripting自定义节点失效问题排查

问题描述

我通过Unity Visual Scripting创建了一个用于Spatial的自定义C#节点,该节点在Unity编辑器内运行完全正常,但在执行“测试活动场景”将场景部署到Spatial平台后,节点无法正常工作。想确认是遗漏了配置项,还是这类自定义节点本身不支持在Spatial环境运行。

附节点代码:

using Unity.VisualScripting;
using UnityEngine;

public class ShowSceneNew : Unit
{
    [DoNotSerialize] public ControlInput In;

    [DoNotSerialize] public ControlOutput Out;

    [DoNotSerialize] public ValueInput myLevel;

    [DoNotSerialize] public ValueInput myListScene;
    [DoNotSerialize] public ValueInput myListRespawn;
    [DoNotSerialize] public ValueOutput result;
    
    private GameObject resultValue;
    private GameObject respawnValue;
    private GameObject TempValue;

    protected override void Definition()
    {
        In = ControlInput("inputTrigger", (flow) =>
        {
            for (int i = 0; i < flow.GetValue<AotList>(myListScene).Count; i++)
            {
                TempValue = (GameObject) flow.GetValue<AotList>(myListScene)[i];
                TempValue.SetActive(false);

                if (i == flow.GetValue<int>(myLevel))
                {
                    resultValue = (GameObject) flow.GetValue<AotList>(myListScene)[i];
                    TempValue.SetActive(true);
                    respawnValue = (GameObject)flow.GetValue<AotList>(myListRespawn)[i];
                }
            }

            return Out;
        });
        Out = ControlOutput("outputTrigger");

        myLevel = ValueInput<int>("myLevel");
        myListScene = ValueInput<AotList>("myListScene");
        myListRespawn = ValueInput<AotList>("myListRespawn");
        result = ValueOutput<GameObject>("result", (flow) => respawnValue);
        Requirement(myLevel,
            In); //Specifies that we need the myValueA value to be set before the node can run.
        Requirement(myListScene,
            In); //Specifies that we need the myValueB value to be set before the node can run.
        Succession(In,
            Out); //Specifies that the input trigger port's input exits at the output trigger port. Not setting your succession also dims connected nodes, but the execution still completes.
    }
}

问题分析与解决步骤

自定义Visual Scripting节点本身可以在Spatial环境运行,但需要注意以下关键细节:

1. AOT兼容性问题

Spatial基于IL2CPP编译,对AOT提前编译的兼容性要求严格。代码中使用的AotList在IL2CPP环境下可能存在序列化或类型解析问题。

  • 解决:将AotList替换为普通List<GameObject>,修改ValueInput定义:
    myListScene = ValueInput<List<GameObject>>("myListScene");
    myListRespawn = ValueInput<List<GameObject>>("myListRespawn");
    
  • 获取值时直接使用flow.GetValue<List<GameObject>>(myListScene),避免类型转换带来的AOT风险。

2. 节点注册与序列化

自定义节点需要被Visual Scripting系统识别,且类需支持序列化:

  • 给节点类添加[Serializable]特性:
    [Serializable]
    public class ShowSceneNew : Unit
    {
        // 原有代码
    }
    
  • 添加节点注册脚本,确保编辑器和运行时都能识别节点:
    using Unity.VisualScripting;
    
    [InitializeOnLoad]
    public static class RegisterCustomNodes
    {
        static RegisterCustomNodes()
        {
            UnitBase.RegisterUnit<ShowSceneNew>();
        }
    
        [RuntimeInitializeOnLoadMethod]
        static void RegisterAtRuntime()
        {
            UnitBase.RegisterUnit<ShowSceneNew>();
        }
    }
    

3. Spatial平台对象状态限制

Spatial的网络同步机制可能限制直接修改GameObject激活状态:

  • 如果对象无需网络同步,确保其未标记为Spatial网络对象;
  • 如果需要同步,改用Spatial提供的网络同步API修改激活状态,而非直接调用SetActive。

4. IL2CPP代码裁剪防护

IL2CPP可能会裁剪未被直接引用的代码,导致节点逻辑失效:

  • 在项目中添加Linker.xml,保留自定义节点类:
    <linker>
      <assembly fullname="Assembly-CSharp">
        <type fullname="ShowSceneNew" preserve="all"/>
      </assembly>
    </linker>
    

5. 日志调试定位

在节点逻辑中添加日志,确认执行状态和变量值:

In = ControlInput("inputTrigger", (flow) =>
{
    int level = flow.GetValue<int>(myLevel);
    Debug.Log($"ShowSceneNew executing, target level: {level}");
    var sceneList = flow.GetValue<List<GameObject>>(myListScene);
    Debug.Log($"Scene list count: {sceneList.Count}");
    
    // 原有逻辑
    return Out;
});

在Spatial测试场景中查看日志,确认节点是否执行、变量是否正确。

内容的提问来源于stack exchange,提问作者Kévin Méal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:47:05