Unity5学習の際の覚え書き。

アニメーションクリップとメカニム

現在は「メカニム」という高度なアニメーションシステムに移行しつつある。
メカニムは複雑な動きを作るのに適したものだが、スクリプトからシンプルな動きを操作するような単純なアニメーションは、「アニメーションクリップ」を使う方がはるかに簡単。
アニメーションクリップ作成を完璧にマスターする必要は全然ないが、アニメーションクリップの仕組みや色んな設定の操作方法は知っていると結構役に立つ。

アニメーションクリップの3要素

アニメーションクリップは、「AnimationClip」クラスとして用意されている。
このクラスはアニメーションクリップに関するさまざまな情報を更に別のクラスのオブジェクトとして保持している。

AnimationClip

アニメーションクリップの本体となるもの。
最初にこのオブジェクトを用意しなければならない。

AnimationCurve

アニメーションクリップに設定される、値の変化を示す曲線部分のクラス。
アニメーションクリップでは、アニメーションするゲームオブジェクトの位置や傾きなどの値を設定して、曲線グラフを作って設定するようになっている。
つまり、オブジェクトのプロパティをリアルタイムに変更していくことでアニメーションを実現している。
この「値を変化させていくために使われる曲線グラフ」のクラスが、AnimationCurve。

Keyframe

アニメーションの値の変化を示す曲線グラスでは、いくつかの「キーフレーム」を作成して、それぞれに値を設定する。
例えば、「0秒の地点で0」「1秒後の地点で10」という2つのキーフレームを用意すると、その時間と値で、プロパティ値がなめらかに変化していく。
こんな具合に「○○が経過したとき、プロパティの値を○○にする」ということを指定したのがキーフレーム。

アニメーションクリップ作成の流れ

1.まずAnimationClipインスタンスを作成する

AnimationClip 変数 = new AnimationClip ();

2.AnimationCurveインスタンスを作成する

値の変化に関する曲線のクラスである「AnimationCurve」インスタンスを作成する。
作成にはAnimationCurveクラスのメソッドを使用し、それは2つある。
2.1.直線的な変化の曲線を作る
AnimationCurve 変数 = AnimationCurve.Linear (開始時間, 開始値, 終了時間, 終了値);

※引数はすべてfloat値
2.2.ゆっくり開始しゆっくり終わる曲線を作る
AnimationCurve 変数 = AnimationCurve.EaseInOut  (開始時間, 開始値, 終了時間, 終了値);

※引数はすべてfloat値

上記2つで、「ある値から別の値に、一定の時間をかけて変化する曲線」ができあがる。

3.Keyframeの追加

AnimationCurveにキーフレームを設定したい場合には、ここでKeyframeインスタンスを作って組み込む
3.1.Keyframeインスタンスの作成
Keyframe 変数 = new Keyframe (時間, 値);

※引数に、キーフレームを設定する時間(アニメーションの経過時間)と設定する値を、それぞれfloat値で指定する
3.2.Keyframeを組み込む
AnimationCurveにKeyframeを組み込むには、AddKeyメソッドを使う。
<AnimationCurve> .AddKey (<Keyframe>);

4.完成したAnimationCurveを、AnimationClipに設定

SetCurveメソッドを使って行う。
clip.SetCurve (パスの指定, タイプ, 操作項目名, <AnimationCurve変数>);

パスの指定
アニメーションに関するオブジェクトのパスを指定するためのもの。
なければ空のテキストを指定。
を指定する」と考えればいい。

タイプ
どの種類の値を指定するか示す。
typeofを使い、アニメーションで操作するクラスを指定する。
例えばTransformの値を操作するなら、typeof(Transform)と値を指定する。
「位置や大きさの場合は、全部typeof(Transform)と指定する」と覚えていい。

操作項目名
操作する項目の名前をテキストで指定する。
例えばTransformのx値を操作する場合は、localPosition.xと指定する。
基本的に、位置・方向・大きさに関するものは、Position・Rotation・Scaleではなく、localPosition・localRotation・localScaleという名前を指定すること。

AnimationCurve変数
組み込むAnimationCurveの変数を指定する。

5.その他の設定を行う

AnimationCurveの組み込みが完了したら、最後にAnimationClipの設定などを行う。
5.1.ラップモードの設定
<AnimationClip> .wrapMode = <WrapModeの値>;

WrapModeの値
Once ... 1回だけ再生
Loop ... 繰り返し再生
PingPong ... 行ったり来たりして再生
Default ... あらかじめ設定されたデフォルト値で再生
ClampForever ... 再生したら最後のフレームだけ再生し続ける

"WrapModeの値の指定方法"
「WrapMode.Once」というようにドットを付けて値を記述。

6.完成したAnimationClipをAnimationに組み込む

<Animation> .AddClip (<AnimationClip>, 名前);

7.アニメーションの開始

組み込んだAnimationClipを再生する。
Playなどいくつかのメソッドが用意されている。

アニメーションをCubeに用意する

1.Cubeを作成
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);
	}
}

アニメーションの再生と停止

アニメーションの再生開始
GetComponent<Animation>().Play();
GetComponent<Animation>().Play("アニメーション名");
アニメーションの停止
※エラーが出て動かない
GetComponent<Animation>().Stop();

キーでアニメーションを停止するスクリプト

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";
		}
	}
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

【メニュー編集】
Wiki記法ガイド

リンク

ゲームバー大阪心斎橋

ゲームバー大阪梅田

ゲームバー大阪心斎橋

ダーツ&ダイニングバー大阪梅田

メニュー

Unity


スマホ操作

Unity - GameObject

Unity - 3DCG

メンバーのみ編集できます