using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Playables; using UnityEngine.Timeline; namespace Thousandto.Launcher.ExternalLibs { [Serializable] public class TimelineAssetData { //路径 public string Path; [NonSerialized] private PlayableDirector _playableDirector = null; //PlayableAsset资源 public PlayableAsset RefPlayableAsset = null; //AnimClip资源 public AnimationClip[] RefAnimClipArray = null; //AudioClip资源 public AudioClip[] RefAudioClipArray = null; #region //运行时执行 //卸载 public void Unload() { if (RefAnimClipArray != null) { var cnt = RefAnimClipArray.Length; for (int i = 0; i < cnt; i++) { Resources.UnloadAsset(RefAnimClipArray[i]); } } if (RefPlayableAsset != null) { Resources.UnloadAsset(RefPlayableAsset); } if (RefAudioClipArray != null) { var cnt = RefAudioClipArray.Length; for (int i = 0; i < cnt; i++) { Resources.UnloadAsset(RefAudioClipArray[i]); } } if (_playableDirector) { UnityEngine.Object.Destroy(_playableDirector); } } //设置PlayableDirector public void ToPlayableDirector(Transform trans) { _playableDirector = trans.GetComponent(); } #endregion #region//编辑器时执行--打包之前数据准备用 //从Animation中获取信息 public bool FromPlayableDirector(PlayableDirector playableDirector) { if (playableDirector != null) { playableDirector.playOnAwake = false; HashSet animationClips = new HashSet(); HashSet audioClips = new HashSet(); //收集Timeline资源 RefPlayableAsset = playableDirector.playableAsset; if (RefPlayableAsset != null) { if (RefPlayableAsset.outputs != null) { foreach (var item in RefPlayableAsset.outputs) { var _animationTrack = item.sourceObject as AnimationTrack; if (_animationTrack) { var clips = _animationTrack.GetClips(); if (clips != null) { foreach (var clipsItem in clips) { var _animationClip = clipsItem.animationClip; if (_animationClip && !animationClips.Contains(_animationClip)) { animationClips.Add(_animationClip); } } } } var _audioTrack = item.sourceObject as AudioTrack; if (_audioTrack) { var clips = _audioTrack.GetClips(); if (clips != null) { foreach (var clipsItem in clips) { var _audioClip = clipsItem.asset as AudioPlayableAsset; if (_audioClip) { if(_audioClip.clip && !audioClips.Contains(_audioClip.clip)) { audioClips.Add(_audioClip.clip); } } } } } } } } RefAnimClipArray = null; RefAudioClipArray = null; var animClipCount = animationClips.Count; if (animClipCount > 0) { RefAnimClipArray = new AnimationClip[animClipCount]; int index = 0; foreach (var item in animationClips) { RefAnimClipArray[index++] = item; } } var audioClipCount = audioClips.Count; if (audioClipCount > 0) { RefAudioClipArray = new AudioClip[audioClipCount]; int index = 0; foreach (var item in audioClips) { RefAudioClipArray[index++] = item; } } return true; } return false; } #endregion } }