首页 > 其他分享 >动态添加Timeline轨道和片段

动态添加Timeline轨道和片段

时间:2024-07-01 21:00:25浏览次数:27  
标签:片段 创建 Timeline gameObject director 添加 asset 轨道 GameObject

上图是利用代码制作的,下图是原来的样子:

如下代码是动态创建各种Timeline轨道的代码:(控制角色碰撞到Cube 触发以下的Timeline动画)

using Cinemachine;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class DTTimeLine : MonoBehaviour
{
    //相机二跟随和看向的对象
    public GameObject enemy;
    //添加TimeLine导演组件
    PlayableDirector director;

    // Start is called before the first frame update
    //[System.Obsolete] 是一个特性(attribute),用于标记方法、属性、类或字段已经过时,
    不推荐使用的注解。
    [System.Obsolete]
    void Start()
    {
        if (GetComponent<PlayableDirector>())
        {
            director = GetComponent<PlayableDirector>();
        }
        else
        {
            director = gameObject.AddComponent<PlayableDirector>();
        }
        //用于创建一个新的时间轴资源(TimelineAsset)实例的方法
        TimelineAsset asset = TimelineAsset.CreateInstance<TimelineAsset>();
        //将创建的时间轴资源(asset)赋值给 PlayableDirector 组件的 playableAsset 属性,
        //从而将时间轴资源与 PlayableDirector 关联起来。
        director.playableAsset = asset;
        //在游戏对象激活时不会自动播放与 PlayableDirector 关联的时间轴
        director.playOnAwake = false;





        //创建动画轨道
        AnimationTrack animationTrack = asset.CreateTrack<AnimationTrack>();
        //animationTrack.trackOffset 用于指定轨道偏移的方式
        //TrackOffset.ApplySceneOffsets 将轨道偏移设置为应用场景偏移
        animationTrack.trackOffset = TrackOffset.ApplySceneOffsets;
        //通过导演组件把动画轨道跟人物绑定
        director.SetGenericBinding(animationTrack, gameObject);
        //给轨道上添加内容
        TimelineClip timelineClip = animationTrack.CreateClip<AnimationPlayableAsset>();
        AnimationPlayableAsset apa = timelineClip.asset as AnimationPlayableAsset;
        apa.clip = Resources.Load<AnimationClip>("Day8/Love01");//填写动画路径
        apa.position = gameObject.transform.position;
        //设置动画开始播放时间
        timelineClip.start =0;
        //设置动画播放时长
        timelineClip.duration = 5;

        //给轨道上添加内容2
        TimelineClip timelineClip1 = animationTrack.CreateClip<AnimationPlayableAsset>();
        AnimationPlayableAsset apa1 = timelineClip1.asset as AnimationPlayableAsset;
        apa1.clip = Resources.Load<AnimationClip>("Day8/Catch03");//填写动画路径
        apa1.position = gameObject.transform.position;
        //设置动画开始播放时间
        timelineClip1.start = 5;
        //设置动画播放时长
        timelineClip1.duration = 10;





        //创建Control轨道
        ControlTrack control = asset.CreateTrack<ControlTrack>("control");
        //创建Control内容
        var timeclip = control.CreateClip<ControlPlayableAsset>();
        var clip = timeclip.asset as ControlPlayableAsset;
        // 创建一个用于容纳粒子系统的空GameObject
        GameObject particleObject = new GameObject("ParticleEffect");
        // 在空GameObject上添加粒子特效组件(例如ParticleSystem)
        ParticleSystem particleSystem = particleObject.AddComponent<ParticleSystem>();
        // 获取粒子系统的Renderer组件
        ParticleSystemRenderer particleRenderer = particleObject.GetComponent<ParticleSystemRenderer>();
        // 创建一个基本的材质球
        Material particleMaterial = new Material(Shader.Find("Standard"));
        //material 赋值
        particleRenderer.material = particleMaterial;
        //重复播放关闭
        particleObject.GetComponent<ParticleSystem>().loop = false;
        // 将粒子特效的Prefab或GameObject赋值给粒子特效组件
        particleSystem.gameObject.GetComponent<ParticleSystem>().Play(); // 播放粒子特效
        // 将粒子系统的GameObject赋值给Control Clip的sourceGameObject
        clip.sourceGameObject.exposedName = "ParticleObject";
        clip.sourceGameObject.defaultValue = particleObject;
        //设置开始时间
        timeclip.start = 0;
        //设置时长
        timeclip.duration = 15;





        //创建声音轨道
        AudioTrack audioTrack = asset.CreateTrack<AudioTrack>();
        //创建声音内容
        TimelineClip timelineClip2 = audioTrack.CreateClip<AudioPlayableAsset>();
        AudioPlayableAsset audio2 = timelineClip2.asset as AudioPlayableAsset;
        //为内容赋值
        audio2.clip = Resources.Load<AudioClip>("Day8/music");
        //设置播放开始时间和时长
        timelineClip2.start = 0;
        timelineClip2.duration = 10;





        //创建Signal事件轨道
        SignalTrack signalTrack = asset.CreateTrack<SignalTrack>();
        //添加组件
        SignalReceiver receiver = gameObject.AddComponent<SignalReceiver>();
        //把组件绑定到轨道上
        director.SetGenericBinding(signalTrack, gameObject);
        //创建事件
        SignalAsset signalAsset = new SignalAsset();
        signalAsset.name = "buff";
        //在轨道上指定时间添加事件(用于在 signalTrack 事件轨道上创建一个 SignalEmitter 标记,
          //并将其放置在时间轴上的时间点 5 处。)
        SignalEmitter signal = signalTrack.CreateMarker<SignalEmitter>(5);
        signal.asset = signalAsset;
        //创建委托绑定事件
        receiver.AddReaction(signal.asset, new UnityEvent());
        //给委托添加监听
        receiver.GetReaction(signalAsset).AddListener(() =>
        {
            print(111);
        });





        //创建虚拟相机轨道
        CinemachineTrack cinemachineTrack = asset.CreateTrack<CinemachineTrack>();
        //绑定控制的摄像机
        director.SetGenericBinding(cinemachineTrack, Camera.main.gameObject.GetComponent<CinemachineBrain>());
        //给轨道上添加内容(跟随主角)
        TimelineClip timelineClip3 = cinemachineTrack.CreateDefaultClip() as TimelineClip;
        CinemachineShot cinemachineShot = timelineClip3.asset as CinemachineShot;
        GameObject go1 = GameObject.Find("Cinemachine");
        //跟随看向
        CinemachineVirtualCamera cinemachineVirtualCamera = go1.GetComponent<CinemachineVirtualCamera>();
        cinemachineShot.VirtualCamera.defaultValue = cinemachineVirtualCamera;
        cinemachineVirtualCamera.LookAt = transform;
        cinemachineVirtualCamera.Follow = transform;
        timelineClip3.start = 0;
        timelineClip3.duration = 5;

        //给轨道上添加内容2(跟随玩家)
        TimelineClip timelineClip4 = cinemachineTrack.CreateDefaultClip() as TimelineClip;
        CinemachineShot cinemachineShot2 = timelineClip4.asset as CinemachineShot;
        GameObject go2 = GameObject.Find("VirtualCamera");
        //跟随看向
        CinemachineVirtualCamera cinemachineVirtualCamera2 = go2.GetComponent<CinemachineVirtualCamera>();
        cinemachineShot2.VirtualCamera.defaultValue = cinemachineVirtualCamera2;
        cinemachineVirtualCamera2.LookAt = enemy.transform;
        cinemachineVirtualCamera2.Follow = enemy.transform;
        timelineClip4.start = 5;
        timelineClip4.duration = 10;
    }

    // Update is called once per frame
    void Update()
    {
        //移动控制主角
        transform.Translate(Vector3.forward * 10 * Time.deltaTime * Input.GetAxis("Vertical"));
        transform.Rotate(Vector3.up * 100 * Time.deltaTime * Input.GetAxis("Horizontal"));
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Cube")
        {
            director.Play();
        }
    }
}

标签:片段,创建,Timeline,gameObject,director,添加,asset,轨道,GameObject
From: https://blog.csdn.net/djrjnfjdjejb/article/details/140109391

相关文章

  • 【苍穹外卖】P18通过前端页面添加员工,传过来的值为空
    漏掉了注解@RequestBodypublicResultsave(@RequestBodyEmployeeDTOemployeeDTO){//把漏掉的@RequestBody加上log.info("新增员工:{}",employeeDTO);employeeService.save(employeeDTO);returnResult.success();}重新启动项目......
  • win11添加开机自启动
    方法1win+R打开运行,输入shell:startup会打开一个文件夹将想要启动的程序快捷方式放进文件夹在设置里面搜索“启动”,可以看到开机启动项,确认已经打开。以上,针对不用管理员权限启动的程序,有效。方法2下面看需要管理员权限的:按Win+R,输入regedit,打开注册表编辑......
  • Python武器库 - 科研中常用的python图像操作 - 图像添加文字
    应用场景:在科研中,有时需要在生成结果中标注文字作为说明,或者添加文字在一行图片的开头作为标题(这个效果通常需要配合在一行图片的开头添加一张空(纯黑)图片,在该图片中添加文字作为标题,使用python-opencv来创建一张纯色图片的操作,详情见我的另一篇随笔https://www.cnblogs.com......
  • 微服务服务添加数据源、认证授权、日志记录,安全处理
    为了增强SpringBoot后端服务的功能,我们可以添加数据库支持、认证授权、日志记录和安全处理。以下是如何集成这些功能的基本步骤。数据库集成添加依赖:在pom.xml或build.gradle中添加数据库驱动和SpringDataJPA的依赖。配置数据库:在src/main/resources/applicat......
  • 布隆过滤器添加数据怎么办,删除数据怎么办
    布隆过滤器(BloomFilter)是一种空间效率极高的概率型数据结构,用于检测一个元素是否在一个集合中。它之所以高效,是因为它使用位数组和多个随机的哈希函数来表示一个集合,而非存储元素本身。然而,布隆过滤器的这种设计也带来了一些固有的限制和特性:内存消耗布隆过滤器的内存消耗取决......
  • 视频添加字幕
    frommoviepy.editorimportVideoFileClip,TextClip,CompositeVideoClipfromconfigs.settingsimportPROJECT_PATHdefadd_subtitle(video_config,video_path,out_path):#加载视频文件video=VideoFileClip(video_path)all_time=0for......
  • Nacos未授权添加用户漏洞
    影响范围:Nacos<=2.0.0-ALPHA.1漏洞复现:检测漏洞是否存在POC:/nacos/v1/auth/users?pageNo=1&pageSize=4接下来可以尝试创建用户,useragent写成Nacos-ServerPOC:POST/nacos/v1/auth/usersHTTP/1.1Host:ipCache-Control:max-age=0Upgrade-Insecure-Requests:1Use......
  • cesium 添加 Echarts 图层(空气质量点图)
    cesium添加Echarts图层(下面附有源码)1、实现思路1、在scene上面新增一个canvas画布2、通坐标转换,将经纬度坐标转为屏幕坐标来实现3、将ecarts中每个series数组中元素都加coordinateSystem:‘cesiumEcharts’2、示例代码<!DOCTYPEhtml><htmllang="en"><hea......
  • 中台框架模块开发实践-代码生成器的添加及使用
    前言之前已经分享过几篇关于中台项目框架的文章,相关介绍就不再赘述所谓工欲善其事必先利其器,一个项目拥有一个代码生成器是很有必要的,能够大大的节省时间,减少手误,提供开发效率(ps:特别小团队搞微服务但是没有代码生成器,简直要了老命)本文将分享如何在中台框架项目Admin.Core......
  • 【YOLOv10改进实战】**【6】YOLOv10添加注意力机制 【手把手教学】【经典模块随心选】
    【YOLOv10改进实战】**【6】YOLOv10添加【CBAM】【SE】【CA】【ECA】注意力机制【手把手教学】【经典模块随心选】......