Unity-Timeline初探

Timeline是个好东西,自己一直想感受一下,不过一直拖到现在才算稍微做出了点自己满意的东西,达到了自己满意的效果。
我的想法是 实现一个技能效果(很low的效果,不会美术):首先在主角身边生成一把剑,然后主角把剑T出去,然后爆炸这么一个流程,在没有接触Timeline的时候感觉这一大堆流程要实现,头都大了,不过发现了Timeline这么个好东西,就觉得一切都可以按照时间来实现效果,还是非常方便的,当然实现过程也是东查西看,加上自己又比较笨,做了好几遍。
2018.02.09,记下自己的心得,方便以后忘了来这查。
(效果图太大传不上来….)

首先新建一个Timeline,然后再给这个Timeline配上一个导演– PlayableDirector(这个组件我挂在了一个空物体上,让他当这个技能的导演),然后把创建的Timeline赋给Playable,去掉PlayonAwake,在后面的脚本中控制它去表演。
没有添加东西的Timeline
这时由于没有给Timeline中添加东西,Binding是空的。这个Binding我个人理解为在运行的时候所控制的资源。
然后给这个Timeline添加轨道,
添加了东西的Timeline
我只用到了控制物体有无的Activation轨道,动画Animation轨道和一个虚拟相机轨道(控制离子的Control轨道不清楚咋用,也没有用到另一个Playable)。给每个轨道都添加相应的clip(在右边的窗口上右键 ->add ***Clip),然后调整每个clip的位置,我这次用的是按秒来调整,也可以调成用帧。
轨道菜单
开启了Preview之后调整还是很方便的。轨道不同的颜色就代表了不同的资源,在左边的框框中选中任意一个轨道都可以在Inspector面板中改名字,最好改一下名字,在后面赋值中会用到。可以看到我这个轨道中有三个None,这些就是技能动态生成的武器预制件和动画,粒子。粒子就是个简单的爆破。在相机轨道中也仅仅是一个主相机CM1,一个技能特写CM_QLowPos,特写相机仅仅是做了一个旋转和换了个位置。
设置好的Timeline
到这里基本的设置都OK了,然后就是代码。
首先需要找到这个导演PlayableDirector(需要引入UnityEngine.Playables命名空间),然后需要动态设置这个导演上的Bindings,让这个导演能够动态地控制技能生成的东西。这个函数就是playableDirector.SetGenericBinding:
public void SetGenericBinding(Object key, Object value);
可以看到这两个参数,一个是键值,一个是值,也就是说需要把对应的值绑到对应的键值上,那么这个value就是动态生成的资源,key就是相应轨道的键值,不过这俩都是Object类型。之前提到过,为了区分轨道,都会给轨道起名字,这些名字就可以用作区分轨道的键值。但是String如何转成Object?转换不知道,不过应该可以对应—-利用字典 Dictionary

 bindingDict = new Dictionary<string, PlayableBinding>();
        //给字典中添加键和值
        //由于SetGenericBinding第一个参数为Object因此不能直接用string需要利用字典
        foreach (PlayableBinding pb in qPlayableDirector.playableAsset.outputs)
        {
            if (!bindingDict.ContainsKey(pb.streamName))
            {
                bindingDict.Add(pb.streamName, pb);
            }
        }
   大致意思就是在这个导演的binding中将 名字 和 PlayableBinding资源 做一个对应。
   最后一步就是动态绑定生成的资源了,用SetGenericBinding, 通过字典找到对应的轨道,然后绑定生成的Obj就可以了:playableDirector.SetGenericBinding(轨道Object, 资源Object);
绑定好之后调用Play()就能播放了,如果不要循环,就在相应Timeline的导演物体的PlayableDirector上将wrap mode 变成Hold。
   最后是这个小效果的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;    
public class SaphiArtCtrl : MonoBehaviour
{   public Animator mAnimator;   
    public GameObject swordPerfab;
    public PlayableDirector qPlayableDirector;
    public Transform swordPos;
    private Dictionary<string,PlayableBinding> bindingDict;
    void Start ()
    {   bindingDict = new Dictionary<string, PlayableBinding>();
        foreach (PlayableBinding pb in qPlayableDirector.playableAsset.outputs)
        {
            if (!bindingDict.ContainsKey(pb.streamName))
            {
                bindingDict.Add(pb.streamName, pb);
            }
        }
    }
    void Update()
       {  if (Input.GetButtonDown("RemoteSkillQ"))
          {
                GameObject sword = GameObject.Instantiate(swordPerfab,swordPos);
                sword.transform.position = swordPos.position;
                GameObject sword01 = sword.transform.Find("Sword01").gameObject;
                GameObject explore = sword01.transform.GetChild(0).gameObject;
                Animator swordAnim = sword01.GetComponent<Animator>();
                //动态绑定资源
                qPlayableDirector.SetGenericBinding(bindingDict["SwordActivation"].sourceObject, sword);
                qPlayableDirector.SetGenericBinding(bindingDict["SwordAnimation"].sourceObject, swordAnim);
                qPlayableDirector.SetGenericBinding(bindingDict["ExploreParticle"].sourceObject, explore);
                qPlayableDirector.Play();                           
          }
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值