using Cinemachine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class TimeLinePut : MonoBehaviour
{
public PlayableDirector playableDirector;
public TimelineAsset timelineAsset; //TimeLin资产
Animator animator; //动画播放器
public AnimationClip animationClip; //动画文件
public AnimationClip animationClip2; //动画文件2
public CinemachineBrain cinemachineBrain; //相机组件
public CinemachineVirtualCamera virtualCamera; //虚拟相机
public CinemachineVirtualCamera virtualCamera2; //虚拟相机
public GameObject game;
void Start()
{
foreach (var item in playableDirector.playableAsset.outputs)
{
(playableDirector.playableAsset as TimelineAsset).DeleteTrack(item.sourceObject as TrackAsset);
}
animator = GameObject.Find("Player(Clone)").GetComponent<Animator>();
//创建动画轨道
AnimationTrack animationTrack = timelineAsset.CreateTrack<AnimationTrack>();
playableDirector.SetGenericBinding(animationTrack, animator);
//创建相机轨道
CinemachineTrack cinemachineTrack = timelineAsset.CreateTrack<CinemachineTrack>();
playableDirector.SetGenericBinding(cinemachineTrack, cinemachineBrain);
//创建Control轨道
ControlTrack controlTrack = timelineAsset.CreateTrack<ControlTrack>();
playableDirector.SetGenericBinding(controlTrack, null);
foreach (var item in playableDirector.playableAsset.outputs)
{
TrackAsset track = item.sourceObject as TrackAsset;
if (track != null)
{
//判断是否为Animator类型
if (playableDirector.GetGenericBinding(item.sourceObject) is Animator)
{
CreatAnimatorClip(track, 0, 5, this.animationClip);
CreatAnimatorClip(track, 4, 5, this.animationClip2);
}
//判断是否为CinemachineBrain类型
else if (playableDirector.GetGenericBinding(item.sourceObject) is CinemachineBrain)
{
CrearCameClip(track, 0, 5, this.virtualCamera);
CrearCameClip(track, 4, 5, this.virtualCamera2);
}
else if(playableDirector.GetGenericBinding(item.sourceObject) is null)
{
AddContoleCilp(track,0,5,game);
}
}
}
playableDirector.Play();
}
/// <summary>
/// control的Clip添加
/// </summary>
/// <param name="track"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="gameObject"></param>
private void AddContoleCilp(TrackAsset track, float startTime, float endTime, GameObject gameObject)
{
//创建存储数据
var timeClip = track.CreateClip<ControlPlayableAsset>();
//转为自己需要的类型
var clip = timeClip.asset as ControlPlayableAsset;
//赋值
clip.sourceGameObject.defaultValue = gameObject;
//设置开始播放时间,总的播放时长,Clip的名
timeClip.start = startTime;
timeClip.duration = endTime;
timeClip.displayName = gameObject.name;
}
/// <summary>
/// 相机轨道的文件添加
/// </summary>
/// <param name="track"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="virtualCamera"></param>
private void CrearCameClip(TrackAsset track, float startTime, float endTime, CinemachineVirtualCamera virtualCamera)
{
//创建存储数据
var timeClip = track.CreateDefaultClip();
//转为自己需要的类型
var clip = timeClip.asset as CinemachineShot;
var came = new ExposedReference<CinemachineVirtualCameraBase> { defaultValue = virtualCamera };
//赋值
if (clip != null) { clip.VirtualCamera = came; }
timeClip.start = startTime;
timeClip.duration = endTime;
timeClip.displayName = virtualCamera.name;
}
/// <summary>
/// 动画轨道的文件添加
/// </summary>
/// <param name="track"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="animationClip"></param>
private void CreatAnimatorClip(TrackAsset track, float startTime, float endTime, AnimationClip animationClip)
{
var timeClip = track.CreateClip<AnimationPlayableAsset>();
var clip = timeClip.asset as AnimationPlayableAsset;
if (clip != null) { clip.clip = animationClip; }
timeClip.start = startTime;
timeClip.duration = endTime;
clip.loop = AnimationPlayableAsset.LoopMode.On;
timeClip.displayName = animationClip.name;
}
}
06-22
2536
04-29
3945
07-13