Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Animatorでアニメーションを再生する
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Animations;
using UnityEngine.Timeline;
[RequireComponent (typeof(Animator))]
public class SimpleAnimator : MonoBehaviour
{
PlayableGraph graph;
AnimationMixerPlayable mixer;
AnimationClipPlayable prePlayable, currentPlayable;
Coroutine coroutinePlayAnimation;
public List<AnimationClip> clipList;
void Awake ()
{
graph = GetComponent<Animator> ().playableGraph;
}
void Start ()
{
mixer = AnimationMixerPlayable.Create (graph, 2, true);
var output = graph.GetOutput (0);
output.SetSourcePlayable (mixer);
if (clipList.Count != 0) {
currentPlayable = AnimationClipPlayable.Create (graph, clipList [0]);
mixer.ConnectInput (0, currentPlayable, 0);
mixer.SetInputWeight (0, 1);
graph.Play ();
}
}
public void CrossFade (string animation, float fadeLength)
{
CrossFade (clipList.Find ((c) => c.name == animation), fadeLength);
}
public void CrossFade (string animation)
{
CrossFade (animation, 0.3f);
}
public void CrossFade (AnimationClip clip)
{
CrossFade (clip, 0.3f);
}
public void CrossFade (AnimationClip clip, float fadeLength)
{
if( coroutinePlayAnimation != null)
StopCoroutine (coroutinePlayAnimation);
coroutinePlayAnimation = StartCoroutine (PlayAnimation (clip, fadeLength));
}
public void Play (string clipName)
{
Play (clipList.Find ((c) => c.name == clipName));
}
public void Play (AnimationClip newAnimation)
{
if (currentPlayable.IsValid ())
currentPlayable.Destroy ();
DisconnectPlayables ();
currentPlayable = AnimationClipPlayable.Create (graph, newAnimation);
mixer.ConnectInput (0, currentPlayable, 0);
mixer.SetInputWeight (1, 0);
mixer.SetInputWeight (0, 1);
}
void DisconnectPlayables ()
{
graph.Disconnect (mixer, 0);
graph.Disconnect (mixer, 1);
if (prePlayable.IsValid ())
prePlayable.Destroy ();
}
IEnumerator PlayAnimation (AnimationClip newAnimation, float transitionTime)
{
DisconnectPlayables ();
prePlayable = currentPlayable;
currentPlayable = AnimationClipPlayable.Create (graph, newAnimation);
mixer.ConnectInput (1, prePlayable, 0);
mixer.ConnectInput (0, currentPlayable, 0);
// 指定時間でアニメーションをブレンド
float waitTime = Time.timeSinceLevelLoad + transitionTime;
yield return new WaitWhile (() => {
var diff = waitTime - Time.timeSinceLevelLoad;
if (diff <= 0) {
mixer.SetInputWeight (1, 0);
mixer.SetInputWeight (0, 1);
return false;
} else {
var rate = Mathf.Clamp01 (diff / transitionTime);
mixer.SetInputWeight (1, rate);
mixer.SetInputWeight (0, 1 - rate);
return true;
}
});
coroutinePlayAnimation = null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment