创建动画轨道和动画片段
PlayableDirector playableDirector;
//需要绑定的人物动画
public Animator game;
// Start is called before the first frame update
void Start()
{
//获取导演动画组件
playableDirector = GetComponent<PlayableDirector>();
CreateAnim();
}
void CreateAnim()
{
TimelineAsset timelineAsset = playableDirector.playableAsset as TimelineAsset;
//创建动画轨道
AnimationTrack animationTrack = timelineAsset.CreateTrack<AnimationTrack>();
//绑定轨道
playableDirector.SetGenericBinding(animationTrack, game);
//创建动画片段
TimelineClip timelineClip = animationTrack.CreateDefaultClip();
//设置开始时间
timelineClip.start = 0;
//设置时常
timelineClip.duration = 10;
//获取动画资源
AnimationPlayableAsset animationPlayable = timelineClip.asset as AnimationPlayableAsset;
//加载动画
animationPlayable.clip = AssetDatabase.LoadAssetAtPath<AnimationClip>("Assets/Player/QR1LuxiyaMd010011/Walk02.anim");
//循环播放
animationPlayable.loop = AnimationPlayableAsset.LoopMode.On;
//开始播放
playableDirector.Play(timelineAsset);
}
修改动画片段
void Chang()
{
//强制转换为TimelineAsset
TimelineAsset timelineAsset = playableDirector.playableAsset as TimelineAsset;
//遍历所有轨道
foreach (var item in timelineAsset.GetOutputTracks())
{
switch (item)
{
case AnimationTrack:
if (item.name == "Animation Track")
{
ChanngAnimationClip(item);
}
break;
case AudioTrack:
ChangAudio(item);
break;
}
}
}
private void ChanngAnimationClip(TrackAsset item)
{
//修改动画
TimelineClip[] timelineClip = item.GetClips() as TimelineClip[];
//获取第一个动画片段
AnimationPlayableAsset animationPlayable = timelineClip[0].asset as AnimationPlayableAsset;
//修改为另一个动画片段
animationPlayable.clip = AssetDatabase.LoadAssetAtPath<AnimationClip>("Assets/Player/Bed03.anim");
//创建一个新的动画片段
TimelineClip timeline = item.CreateDefaultClip();
//设置开始时间
timeline.start = 8;
//设置播放时常
timeline.duration = 10;
//获取片段资源
AnimationPlayableAsset animationPlayable1 = timeline.asset as AnimationPlayableAsset;
//创建完成后加载一个动画片段
animationPlayable1.clip = AssetDatabase.LoadAssetAtPath<AnimationClip>("Assets/Player/Scratch01.anim");
//循环播放
animationPlayable1.loop = AnimationPlayableAsset.LoopMode.On;
//开始播放
// playableDirector.Play();
}
创建虚拟相机
void ChangCam()
{
TimelineAsset timelineAsset = playableDirector.playableAsset as TimelineAsset;
//创建虚拟相机轨道
CinemachineTrack cinemachineTrack = timelineAsset.CreateTrack<CinemachineTrack>();
//创建片段
TimelineClip timelineClip = cinemachineTrack.CreateDefaultClip();
CinemachineShot cinemachineShot = timelineClip.asset as CinemachineShot;
//ExposedReference 是一种泛型类型,可用于创建对 Scene 对象的引用,并在运行时和使用上下文对象解析其实际值。
//资产(如 ScriptableObject 或 PlayableAsset)可以使用它来创建对 Scene 对象的引用。
ExposedReference<CinemachineVirtualCameraBase> exposedReference = new ExposedReference<CinemachineVirtualCameraBase>();
//创建一个空object
GameObject cam = new GameObject("Cam");
//添加虚拟相机
CinemachineVirtualCamera = cam.AddComponent<CinemachineVirtualCamera>();
exposedReference.defaultValue = virtualCameraBase;
cinemachineShot.VirtualCamera = exposedReference;
}