【unity】编辑模式预览Animator动作,2种实现。其中⼀种
playback模式是C。。。
⼀、环境
Unity 5.5.2 、Cinema Director v1.4.5.4
⼆、问题
美术⽤ Director 做CutScene动画时, 某⼀个⾓⾊动作时间线上,播放多个动作, 预览模式,拖动线的时候,Unity基本会100%Crash
如上图拖到类似位置就会闪退(如果⼀个Track只有⼀个动作 则不会)
有2中Crash:
========== OUTPUTING STACK TRACE ==================
0x000000014073DCB9 (Unity) AnimationClipPlayable::SetClip
0x0000000141650663 (Unity) mecanim::statemachine::StartState
0x0000000141651118 (Unity) mecanim::statemachine::EvaluateStateMachine
0x0000000140740D9D (Unity) AnimatorControllerPlayable::UpdateGraph
0x0000000140684F61 (Unity) Animator::EvaluateController
0x00000001406E12BD (Unity) Animator::UpdateAvatars
0x00000001406E207C (Unity) Animator::UpdateWithDelta
0x000000004F0EF2A5 (Mono JIT Code) (wrapper managed-to-native) UnityEngine.Animator:Update (single)
0x000000004F0F9885 (Mono JIT Code) [C:\work\mmo3d_client\mmo3d\Asts\Cinema Suite\Cinema
Director\System\Runtime\TrackGroups\CharacterTrackGroup.cs:154] CinemaDirector.CharacterTrackGroup:Update ()
0x000000004A527370 (Mono JIT Code) (wrapper delegate-invoke)
UnityEditor.EditorApplication/CallbackFunction:invoke_void__this__ ()
0x000000004A526FA3 (Mono JIT Code)
[C:\buildslave\unity\build\artifacts\generated\common\s:207]
========== OUTPUTING STACK TRACE ==================
0x000000014164E5FC (Unity) mecanim::statemachine::EvaluateState
0x000000014165121E (Unity) mecanim::statemachine::EvaluateStateMachine
0x0000000140740D9D (Unity) AnimatorControllerPlayable::UpdateGraph
0x0000000140684F61 (Unity) Animator::EvaluateController
0x00000001406E12BD (Unity) Animator::UpdateAvatars
0x00000001406E12BD (Unity) Animator::UpdateAvatars
0x00000001406E207C (Unity) Animator::UpdateWithDelta
0x00000000361ECC45 (Mono JIT Code) (wrapper managed-to-native) UnityEngine.Animator:Update (single)
0x000000002F7F06AA (Mono JIT Code) [C:\work\mmo3d_client\mmo3d\Asts\Cinema Suite\Cinema
Director\System\Runtime\TrackGroups\CharacterTrackGroup.cs:175]
CinemaDirector.CharacterTrackGroup:UpdateTrackGroup (single,single)
0x00000000360F6B3A (Mono JIT Code) [C:\work\mmo3d_client\mmo3d\Asts\Cinema Suite\Cinema
Director\System\Runtime\Cutscene.cs:212] CinemaDirector.Cutscene:UpdateCutscene (single)
0x00000000361022BC (Mono JIT Code) [C:\work\mmo3d_client\mmo3d\Asts\Cinema Suite\Cinema
Director\System\Runtime\Cutscene.cs:266] CinemaDirector.Cutscene:ScrubToTime (single)
0x0000000036101E4C (Mono JIT Code) [C:\work\mmo3d_client\mmo3d\Asts\Cinema Suite\Cinema
Director\System\Editor\DirectorWindow.cs:256] DirectorWindow:directorControl_ScrubCutscene
(object,CinemaDirectorArgs)
0x0000000031995D93 (Mono JIT Code) DirectorControl:updateTimelineHeader (UnityEngine.Rect,UnityEngine.Rect) 0x0000000031988094 (Mono JIT Code) DirectorControl:OnGUI (UnityEngine.Rect,CutsceneWrapper)
// Cinema Suite
using CinemaDirector.Helpers;
using System;
using System.Collections.Generic;
using UnityEngine;风婆婆
namespace CinemaDirector
{
/// <summary>
/// The character track group is a type of actor group, specialized for humanoid characters.
/// </summary>
[TrackGroupAttribute("Character Track Group", TimelineTrackGenre.CharacterTrack)]
public class CharacterTrackGroup : ActorTrackGroup, IRevertable, IBakeable
{
/
/ Options for reverting in editor.
[SerializeField]
private RevertMode editorRevertMode = RevertMode.Revert;
// Options for reverting during runtime.
[SerializeField]
private RevertMode runtimeRevertMode = RevertMode.Revert;
// Has a bake been called on this track group?
private bool hasBeenBaked = fal;
/// <summary>
/// Bake the Mecanim preview data.
/// </summary>
public void Bake()
{
if (Actor == null || Application.isPlaying) return;
Animator animator = Actor.GetComponent<Animator>();
if (animator == null)
{ return; }
AnimatorCullingMode cullingData = animator.cullingMode;
animator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
清瘟莲花胶囊List<RevertInfo> revertCache = new List<RevertInfo>();
// Build the cache of revert info.
MonoBehaviour[] mb = this.GetComponentsInChildren<MonoBehaviour>();
for (int i = 0; i < mb.Length; i++)
{
IRevertable revertable = mb[i] as IRevertable;
if (revertable != null)
if (revertable != null)
{
revertCache.AddRange(revertable.CacheState());
}
}
Vector3 position = ansform.localPosition;
Quaternion rotation = ansform.localRotation;
Vector3 scale = ansform.localScale;
/*
float frameRate = 30;
int frameCount = (int)((Cutscene.Duration * frameRate) + 2);
animator.StopPlayback();
animator.StartRecording(frameCount);
*/
ba.SetRunningTime(0);
/*
for (int i = 0; i < frameCount-1; i++)
目的笔画
草莓单词{
TimelineTrack[] tracks = GetTracks();
for (int j = 0; j < tracks.Length; j++)
{
if (!(tracks[j] is DialogueTrack))
{
tracks[j].UpdateTrack(i * (1.0f / frameRate), (1.0f / frameRate));
}
海带炒肉}
animator.Update(1.0f / frameRate);
}
animator.StopRecording();
animator.StartPlayback();
*/
#if UNITY_EDITOR
UnityEditor.AnimationMode.StartAnimationMode();
#endif
hasBeenBaked = true;
// Return the Actor to his initial position.
for (int i = 0; i < revertCache.Count; i++)
{
RevertInfo revertable = revertCache[i];
if (revertable != null)
{
if ((revertable.EditorRevert == RevertMode.Revert && !Application.isPlaying) || (revertable.RuntimeRevert == RevertMode.Revert && Application.isPlaying)) {
revertable.Revert();
}
}
}
animator.cullingMode = cullingData;
ba.Initialize();
}
/// <summary>
/// Cache the Actor Transform.
/// </summary>
/// </summary>
/// <returns>The revert info for the Actor's transform.</returns>
public RevertInfo[] CacheState()
{
RevertInfo[] reverts = new RevertInfo[3];
if (Actor == null) return new RevertInfo[0];
reverts[0] = new RevertInfo(this, ansform, "localPosition", ansform.localPosition); reverts[1] = new RevertInfo(this, ansform, "localRotation", ansform.localRotation); reverts[2] = new RevertInfo(this, ansform, "localScale", ansform.localScale);古风灯笼
return reverts;
}
/// <summary>
/// Initialize the Track Group as normal and initialize the Animator if in Editor Mode.
/// </summary>
public override void Initialize()
{
ba.Initialize();
if (!Application.isPlaying)
{
if (Actor == null) return;
Animator animator = Actor.GetComponent<Animator>();
if (animator == null)
{
return;
}
//animator.StartPlayback();
}
}
/
// <summary>
/// Update the Track Group over time. If in editor mode, play the baked animator data.
/// </summary>
/// <param name="time">The new running time.</param>
/// <param name="deltaTime">the deltaTime since last update.</param>
public override void UpdateTrackGroup(float time, float deltaTime)
{
if (Application.isPlaying)
{
ba.UpdateTrackGroup(time, deltaTime);
}
el
{
TimelineTrack[] tracks = GetTracks();
for (int i = 0; i < tracks.Length; i++)
{
//if (!(tracks[i] is MecanimTrack))
{
tracks[i].UpdateTrack(time, deltaTime);
}
}
/*
if (Actor == null) return;
Animator animator = Actor.GetComponent<Animator>();
if (animator == null)
{
return;
}
if (Actor.gameObject.activeInHierarchy)
{
#if UNITY_5 && !UNITY_5_0 && !UNITY_5_1
if (animator.isInitialized)
animator.playbackTime = time;
#el
#el
// if (animator.)
animator.playbackTime = time;
#endif
animator.Update(0);infml
}
*/
}
}
public override void SetRunningTime(float time)
{
if (Application.isPlaying)
{
TimelineTrack[] tracks = GetTracks();
for (int i = 0; i < tracks.Length; i++)
{
tracks[i].SetTime(time);
}
}
el
{
TimelineTrack[] tracks = GetTracks();
for (int i = 0; i < tracks.Length; i++)
{
//if (!(tracks[i] is MecanimTrack))
{
tracks[i].SetTime(time);
}
}
/*
if (Actor == null) return;五行土生什么
Animator animator = Actor.GetComponent<Animator>(); if (animator == null)
{
return;
}
if (Actor.gameObject.activeInHierarchy)
{
animator.playbackTime = time;
animator.Update(0);
}
*/
}
}
/
// <summary>
/// Stop this track group and stop playback on animator.
/// </summary>
public override void Stop()
{
ba.Stop();
if (!Application.isPlaying)
{
if (hasBeenBaked)
{
hasBeenBaked = fal;
Animator animator = Actor.GetComponent<Animator>(); if (animator == null)
{
return;