Unity Timeline - 自定义的轨道:添加爆炸交互逻辑轨道

141 篇文章 35 订阅

使用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,那么这个MonoBehaviourOnDrawGizmos就可以在Scene视图下绘制想要的数据了。但这样会性能会有点消耗。

如果选中剪辑在Scene可以显示一些Gizmos信息,那么制作技能编辑器,是很方便的,因为需要编辑大量的判定范围信息。

References

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值