如何在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,只需要给目标脚本加对应的公开方法即可,示例:
所有方法都可以直接在Clip里配置调用,无需额外开发轨道逻辑。// 停用对象 public void DisableSelf() => gameObject.SetActive(false); // 修改移动速度 public void SetMoveSpeed(float speed) => moveSpeed = speed; // 删除对象 public void DestroySelf() => Destroy(gameObject);
内容的提问来源于stack exchange,提问作者Gabriel Slomka
相关产品推荐
相关产品推荐

