Unity 动态为AnimationClip 注入事件的小工具类
2017-09-14 10:12
169 查看
需求来源:美术每次改动画,程序都要重新把AnimEvent加入AnimationClip一遍,这不科学。(其实这事情也可以给策划做,但是策划太蠢了。)
于是我写了一个小工具类,可以动态注入Anim事件,只要AnimClip的名字不改,一切都会是那么的美好。
配置图:
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimationEventInjector : MonoBehaviour
{
[System.Serializable]
public class InjectEvent
{
public string TargetClip;
public string FunctionName;
public string stringParam;
public int intParam;
public float floatParam;
[Space]
[Range(0.0f, 1.0f)]
public float InjectPosition;
public UnityEngine.AnimationEvent GetAnimEvent(float total_length)
{
UnityEngine.AnimationEvent AnimEvent = new UnityEngine.AnimationEvent();
AnimEvent.time = total_length * InjectPosition;
AnimEvent.functionName = FunctionName;
AnimEvent.intParameter = intParam;
AnimEvent.stringParameter = stringParam;
AnimEvent.floatParameter = floatParam;
return AnimEvent;
}
}
[SerializeField]
InjectEvent[] inject_events;
Dictionary<string, AnimationClip> clip_index = new Dictionary<string, AnimationClip>();
public void Inject( Animator target_animator )
{
clip_index.Clear();
if (target_animator != null)
{
RuntimeAnimatorController runtime_ctrl = target_animator.runtimeAnimatorController;
AnimationClip[] clips = runtime_ctrl.animationClips;
foreach (var clip in clips)
{
clip_index[clip.name] = clip;
}
foreach (var injectE in inject_events)
{
AnimationClip clip = null;
clip_index.TryGetValue(injectE.TargetClip, out clip);
if (clip != null)
{
clip.AddEvent(injectE.GetAnimEvent( clip.length ));
Debug.Log("Event injected for command " + injectE.stringParam );
}
else
{
Debug.Log( "<color=red> Clip with name "+ injectE.TargetClip + " is not exist! </color>");
}
}
target_animator.Rebind();
}
}
}
注意1:需要手动调用Inject函数进行初始化
注意2:Inject Position 是时间百分比,程序会换算成秒,并且给AnimationEvent.time赋值,我个人认为这样做最方便,但是如果你希望填精确时间可以自己调节一下代码。
于是我写了一个小工具类,可以动态注入Anim事件,只要AnimClip的名字不改,一切都会是那么的美好。
配置图:
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimationEventInjector : MonoBehaviour
{
[System.Serializable]
public class InjectEvent
{
public string TargetClip;
public string FunctionName;
public string stringParam;
public int intParam;
public float floatParam;
[Space]
[Range(0.0f, 1.0f)]
public float InjectPosition;
public UnityEngine.AnimationEvent GetAnimEvent(float total_length)
{
UnityEngine.AnimationEvent AnimEvent = new UnityEngine.AnimationEvent();
AnimEvent.time = total_length * InjectPosition;
AnimEvent.functionName = FunctionName;
AnimEvent.intParameter = intParam;
AnimEvent.stringParameter = stringParam;
AnimEvent.floatParameter = floatParam;
return AnimEvent;
}
}
[SerializeField]
InjectEvent[] inject_events;
Dictionary<string, AnimationClip> clip_index = new Dictionary<string, AnimationClip>();
public void Inject( Animator target_animator )
{
clip_index.Clear();
if (target_animator != null)
{
RuntimeAnimatorController runtime_ctrl = target_animator.runtimeAnimatorController;
AnimationClip[] clips = runtime_ctrl.animationClips;
foreach (var clip in clips)
{
clip_index[clip.name] = clip;
}
foreach (var injectE in inject_events)
{
AnimationClip clip = null;
clip_index.TryGetValue(injectE.TargetClip, out clip);
if (clip != null)
{
clip.AddEvent(injectE.GetAnimEvent( clip.length ));
Debug.Log("Event injected for command " + injectE.stringParam );
}
else
{
Debug.Log( "<color=red> Clip with name "+ injectE.TargetClip + " is not exist! </color>");
}
}
target_animator.Rebind();
}
}
}
注意1:需要手动调用Inject函数进行初始化
注意2:Inject Position 是时间百分比,程序会换算成秒,并且给AnimationEvent.time赋值,我个人认为这样做最方便,但是如果你希望填精确时间可以自己调节一下代码。
相关文章推荐
- Unity中Animator动态添加AnimationClip
- iOS中动态注入JavaScript方法。动态给html标签添加事件
- Unity&网络:利用UDP实现动态监测局域网在线用户及掉线事件。
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序
- unity 动态匹配按钮的点击事件
- Unity UGUI 动态添加Button.OnClick()事件
- Ioc注入框架 注入布局 注入控件 动态代理注入事件
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序
- Unity 游戏物体 EventTrigger 物体动态事件监听
- Unity使用AnimatorOverrudeController动态替换AnimationClip
- 【unity小技巧之三】添加自定义拓展,动态向某个类注入静态函数
- Unity动画系统 动态添加动画事件
- 【Unity】UGUI怎么动态的添加按钮的OnClick点击事件
- android 6.0 动态权限获取工具类
- 动态为事件添加js代码示例
- 运用Unity实现依赖注入[有参构造注入]
- 动态创建的按钮 以及 他们的事件
- 工具类中注入springMVC管理的service
- IE之动态添加DOM节点触发window.resize事件
- Angular 使用tabset 动态加载组件参数注入