使用Unity官方提供的免费资源:Default Playables,在Assets Store里搜索就可以了。
Default Playables工具怎么用,也可以参考之前写的一篇:Unity - Timeline 自定义剪辑,轨道,混合轨道,Inspector属性显示(使用Default Playables辅助工具)
关于Timeline的手册(已翻译),与我个人的练习,可以参考:Unity - Timeline 知识汇总
本次实现的一个效果:
下面的图,出自于我之前写的一篇文章:Unity Shader - 实现武器热扭曲拖尾效果
Rigibody的爆炸效果
今天想制作某个爆炸效果。 于是想到了Rigibody对象,真的发现里面有分装一个:Rigibody.AddExplosionForce()方法,使用起来真的很方便。
准备Timeline材料
爆炸粒子
Particle System粒子1,爆炸的长火星:
Particle System粒子2,爆炸短火星:
Timeline轨道中,使用ActivationTrack来控制粒子的启用。
创建轨道AddExplosion脚本信息
使用Default Playables带的工具来快速创建轨道信息:
公开的参数按Rigibody.AddExplosionForce()接口中的参数对应着。
创建好后,在项目中会多出一个文件夹:
目录可以按自己需要的挪一下。
Timeline中使用轨道
添加上AddExoplosion轨道,添加剪辑,设置剪辑的参数:
最后调整一下AddExplosionBehaviour脚本为下面的逻辑:
using System;
using UnityEngine;
using UnityEngine.Playables;
[Serializable]
public class AddExplosionBehaviour : PlayableBehaviour
{
public Transform pos;
public float force;
public float radius;
public float upwardForce;
public ForceMode fm;
public string ingoreLayer;
public string appliedLayer;
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
base.OnBehaviourPlay(playable, info);
LayerMask mask = 0;
// LayerMask mask = 1 << 2 | 0 << 4; 表示开启Layer2并且同时关闭Layer4
if (!string.IsNullOrEmpty(ingoreLayer)) mask |= 0 << LayerMask.NameToLayer(ingoreLayer);
if (!string.IsNullOrEmpty(appliedLayer)) mask |= 1 << LayerMask.NameToLayer(appliedLayer);
var hitInfo = Physics.OverlapSphere(pos.position, radius, mask, QueryTriggerInteraction.UseGlobal);
if (hitInfo.Length > 0)
{
foreach (var item in hitInfo)
{
Rigidbody rb = item.GetComponent<Rigidbody>();
if (rb != null)
{
//Debug.Log($"explosion hit : {item.name}, force:{force}, upwardForce:{upwardForce}, fm:{fm}");
rb.AddExplosionForce(force, pos.position, radius, upwardForce, fm);
}
}
}
}
}
这里需要调整一下脚本:
因为在工具中没有反射出Unity的所有类,只是一部分,反射所有类也不现实,因为太多了,不也方便选择。如下图,没有UnityEngine.ForceMode枚举类型。
所以需要再调整一下AddExplosionBehaviour脚本
删除掉int类型的forceMode,添加一个ForceMode枚举类型的fm。
再调整:
OK,这回在剪辑属性显示就是一个枚举下拉列表了,方便维护。
这样就方便多了。
总结
Timeline的扩展还是相对比较方便,但还是有些不足。
运行时的Timeline,调整剪辑的数据是不生效的,这点很不方便调试。
如我上面的例子中,我想对爆炸剪辑的位置,半径,等信息都在Scene的用OnDrawGizmos处理,但剪辑类没有这类方法,所以调试不方便。
但是可以使用另一种方式来制作,那就是,将爆炸效果再次封装到一个MonoBehaviour下,然后在剪辑公开这个MonoBehaviour,那么这个MonoBehaviour的OnDrawGizmos就可以在Scene视图下绘制想要的数据了。但这样会性能会有点消耗。
如果选中剪辑在Scene可以显示一些Gizmos信息,那么制作技能编辑器,是很方便的,因为需要编辑大量的判定范围信息。
References
- Default Playables工具怎么用,也可以参考之前写的一篇:Unity - Timeline 自定义剪辑,轨道,混合轨道,Inspector属性显示(使用Default Playables辅助工具)
- 关于Timeline的手册(已翻译),与我个人的练习,可以参考:Unity - Timeline 知识汇总