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

如何在Unity Timeline中修改对象公开变量与执行自定义代码

实现方案说明

需求完全可实现,以下是两种通用性最高的落地方式,无需为每个过渡效果制作逐帧动画:

方案1:使用内置Signal轨道(适合单帧触发类逻辑)

这是成本最低的方案,适合在指定时间点触发单次操作,比如停用GameObject、调用无参/单参方法、修改固定值的public变量:

  • 首先在Project窗口右键创建Signal Asset,可按你的业务类型分类命名,比如DestroyObjSignal、SetMoveSpeedSignal
  • 打开目标Timeline,添加Signal Track,在你需要触发逻辑的时间点右键创建Signal Emitter
  • 选中Emitter,在Inspector面板绑定之前创建的Signal Asset,可直接配置要传入的参数(支持bool、int、float、Object等常见类型)
  • 给需要接收逻辑的GameObject挂载Signal Receiver组件,添加对应Signal的响应事件,直接绑定你要调用的脚本公开方法即可,比如直接绑定GameObject.SetActive方法、你自定义角色脚本的公开属性赋值方法、Object.Destroy方法都可以。

方案2:自定义通用Playable轨道(适合持续时间类逻辑)

如果你的逻辑需要在一段时长内生效、或者需要支持权重混合(比如两个Clip的过渡效果),可以自定义通用方法调用轨道,一次编写后续所有逻辑都可以复用:

第一步:编写自定义轨道代码

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

[TrackBindingType(typeof(MonoBehaviour))]
[TrackColor(0.2f, 0.8f, 0.3f)]
public class GenericInvokeTrack : TrackAsset
{
    public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)
    {
        return ScriptPlayable<GenericInvokeMixer>.Create(graph, inputCount);
    }
}

第二步:编写Clip逻辑和混合器代码

using UnityEngine;
using UnityEngine.Playables;

public class GenericInvokeClip : PlayableBehaviour
{
    // 可根据你的需求扩展更多参数类型
    public string targetMethodName;
    public bool boolParameter;
    public int intParameter;
    public float floatParameter;
    public Object objectParameter;
}

public class GenericInvokeMixer : PlayableBehaviour
{
    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
        var targetScript = playerData as MonoBehaviour;
        if (targetScript == null) return;

        int inputCount = playable.GetInputCount();
        for (int i = 0; i < inputCount; i++)
        {
            float weight = playable.GetInputWeight(i);
            if (weight <= 0f) continue;
            
            var input = (ScriptPlayable<GenericInvokeClip>)playable.GetInput(i);
            var clipData = input.GetBehaviour();
            
            if (string.IsNullOrEmpty(clipData.targetMethodName)) continue;
            // 调用目标方法,自动匹配参数类型
            targetScript.SendMessage(clipData.targetMethodName, 
                GetParameter(clipData), 
                SendMessageOptions.DontRequireReceiver);
        }
    }

    private object GetParameter(GenericInvokeClip clip)
    {
        if (clip.objectParameter != null) return clip.objectParameter;
        if (clip.boolParameter) return true;
        if (clip.intParameter != 0) return clip.intParameter;
        if (clip.floatParameter != 0) return clip.floatParameter;
        return null;
    }
}

使用方式

  • 打开Timeline窗口,添加GenericInvokeTrack轨道,将你要控制的角色脚本拖到轨道的绑定栏
  • 右键轨道选择Add Generic Invoke Clip,选中Clip后在Inspector面板填入要调用的方法名、对应参数即可
  • 要修改脚本public变量、停用/删除GameObject,只需要给目标脚本加对应的公开方法即可,示例:
    // 停用对象
    public void DisableSelf() => gameObject.SetActive(false);
    // 修改移动速度
    public void SetMoveSpeed(float speed) => moveSpeed = speed;
    // 删除对象
    public void DestroySelf() => Destroy(gameObject);
    
    所有方法都可以直接在Clip里配置调用,无需额外开发轨道逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:57:04