現在は「メカニム」という高度なアニメーションシステムに移行しつつある。
メカニムは複雑な動きを作るのに適したものだが、スクリプトからシンプルな動きを操作するような単純なアニメーションは、「アニメーションクリップ」を使う方がはるかに簡単。
アニメーションクリップ作成を完璧にマスターする必要は全然ないが、アニメーションクリップの仕組みや色んな設定の操作方法は知っていると結構役に立つ。
メカニムは複雑な動きを作るのに適したものだが、スクリプトからシンプルな動きを操作するような単純なアニメーションは、「アニメーションクリップ」を使う方がはるかに簡単。
アニメーションクリップ作成を完璧にマスターする必要は全然ないが、アニメーションクリップの仕組みや色んな設定の操作方法は知っていると結構役に立つ。
アニメーションクリップは、「AnimationClip」クラスとして用意されている。
このクラスはアニメーションクリップに関するさまざまな情報を更に別のクラスのオブジェクトとして保持している。
このクラスはアニメーションクリップに関するさまざまな情報を更に別のクラスのオブジェクトとして保持している。
アニメーションクリップに設定される、値の変化を示す曲線部分のクラス。
アニメーションクリップでは、アニメーションするゲームオブジェクトの位置や傾きなどの値を設定して、曲線グラフを作って設定するようになっている。
つまり、オブジェクトのプロパティをリアルタイムに変更していくことでアニメーションを実現している。
この「値を変化させていくために使われる曲線グラフ」のクラスが、AnimationCurve。
アニメーションクリップでは、アニメーションするゲームオブジェクトの位置や傾きなどの値を設定して、曲線グラフを作って設定するようになっている。
つまり、オブジェクトのプロパティをリアルタイムに変更していくことでアニメーションを実現している。
この「値を変化させていくために使われる曲線グラフ」のクラスが、AnimationCurve。
アニメーションの値の変化を示す曲線グラスでは、いくつかの「キーフレーム」を作成して、それぞれに値を設定する。
例えば、「0秒の地点で0」「1秒後の地点で10」という2つのキーフレームを用意すると、その時間と値で、プロパティ値がなめらかに変化していく。
こんな具合に「○○が経過したとき、プロパティの値を○○にする」ということを指定したのがキーフレーム。
例えば、「0秒の地点で0」「1秒後の地点で10」という2つのキーフレームを用意すると、その時間と値で、プロパティ値がなめらかに変化していく。
こんな具合に「○○が経過したとき、プロパティの値を○○にする」ということを指定したのがキーフレーム。
値の変化に関する曲線のクラスである「AnimationCurve」インスタンスを作成する。
作成にはAnimationCurveクラスのメソッドを使用し、それは2つある。
作成にはAnimationCurveクラスのメソッドを使用し、それは2つある。
AnimationCurve 変数 = AnimationCurve.EaseInOut (開始時間, 開始値, 終了時間, 終了値); ※引数はすべてfloat値
上記2つで、「ある値から別の値に、一定の時間をかけて変化する曲線」ができあがる。
Keyframe 変数 = new Keyframe (時間, 値); ※引数に、キーフレームを設定する時間(アニメーションの経過時間)と設定する値を、それぞれfloat値で指定する
AnimationCurveにKeyframeを組み込むには、AddKeyメソッドを使う。
<AnimationCurve> .AddKey (<Keyframe>);
SetCurveメソッドを使って行う。
パスの指定
アニメーションに関するオブジェクトのパスを指定するためのもの。
なければ空のテキストを指定。
「を指定する」と考えればいい。
タイプ
どの種類の値を指定するか示す。
typeofを使い、アニメーションで操作するクラスを指定する。
例えばTransformの値を操作するなら、typeof(Transform)と値を指定する。
「位置や大きさの場合は、全部typeof(Transform)と指定する」と覚えていい。
操作項目名
操作する項目の名前をテキストで指定する。
例えばTransformのx値を操作する場合は、localPosition.xと指定する。
基本的に、位置・方向・大きさに関するものは、Position・Rotation・Scaleではなく、localPosition・localRotation・localScaleという名前を指定すること。
AnimationCurve変数
組み込むAnimationCurveの変数を指定する。
clip.SetCurve (パスの指定, タイプ, 操作項目名, <AnimationCurve変数>);
パスの指定
アニメーションに関するオブジェクトのパスを指定するためのもの。
なければ空のテキストを指定。
「を指定する」と考えればいい。
タイプ
どの種類の値を指定するか示す。
typeofを使い、アニメーションで操作するクラスを指定する。
例えばTransformの値を操作するなら、typeof(Transform)と値を指定する。
「位置や大きさの場合は、全部typeof(Transform)と指定する」と覚えていい。
操作項目名
操作する項目の名前をテキストで指定する。
例えばTransformのx値を操作する場合は、localPosition.xと指定する。
基本的に、位置・方向・大きさに関するものは、Position・Rotation・Scaleではなく、localPosition・localRotation・localScaleという名前を指定すること。
AnimationCurve変数
組み込むAnimationCurveの変数を指定する。
<AnimationClip> .wrapMode = <WrapModeの値>;
WrapModeの値
Once ... 1回だけ再生
Loop ... 繰り返し再生
PingPong ... 行ったり来たりして再生
Default ... あらかじめ設定されたデフォルト値で再生
ClampForever ... 再生したら最後のフレームだけ再生し続ける
"WrapModeの値の指定方法"
「WrapMode.Once」というようにドットを付けて値を記述。
1.Cubeを作成
2.Cubeを選択し、Component -> Miscellaneous -> Animation、を選択。これでCubeにAnimationコンポーネントが追加される。
2.Cubeを選択し、Component -> Miscellaneous -> Animation、を選択。これでCubeにAnimationコンポーネントが追加される。
※エラーが出て動かない
エラー内容と対策はこれ?
エラー内容と対策はこれ?
public class myscript : MonoBehaviour { void Start () { GameObject.Find ("GUI Text").GetComponent<GUIText>().text = "AnimationClip sample"; AnimationClip clip = new AnimationClip (); AnimationCurve curve = AnimationCurve.Linear (0f, 3f, 3f, 3f); Keyframe key = new Keyframe (1.5f, 7f); curve.AddKey (key); clip.SetCurve ("", typeof(Transform), "localPosition.z", curve); clip.wrapMode = WrapMode.Loop; GetComponent<Animation>().AddClip (clip, "clip1"); GetComponent<Animation>().Play ("clip1"); } void Update () { transform.Rotate (1f, 1f, 1f); } }
using System.Collections; public class myscript : MonoBehaviour { void Start () { GameObject.Find ("GUI Text").GetComponent<GUIText>().text = "AnimationClip sample"; AnimationClip clip = new AnimationClip (); AnimationCurve curve = AnimationCurve.Linear (0f, 3f, 3f, 3f); Keyframe key = new Keyframe (1.5f, 7f); curve.AddKey (key); clip.SetCurve ("", typeof(Transform), "localPosition.z", curve); clip.wrapMode = WrapMode.Loop; GetComponent<Animation>().AddClip (clip, "clip1"); GetComponent<Animation>().Play ("clip1"); } void Update () { transform.Rotate (1f, 1f, 1f); if (Input.GetKeyDown (KeyCode.Space)) { GetComponent<Animation> ().Stop (); GameObject.Find ("GUI Text").GetComponent<GUIText> ().text = "Stopped!!"; } if (Input.GetKeyUp (KeyCode.Space)) { GetComponent<Animation> ().Play ("clip1"); GameObject.Find ("GUI Text").GetComponent<GUIText> ().text = "AnimationClip sample"; } } }
コメントをかく