|
GP10UnityCourse09
ミドルウェア (9)
モデルデータの使用Unityは色々な3Dツールのデータ形式に対応しているが、迷ったときはとりあえずfbx形式でやりとりしておくのが最も無難と言われる。
サンプルデータの中にはモデルデータ(VantanKun.fbx)とテクスチャデータ(VantanKun.png)が入っている。 モデルデータの取り込みデータを取り込むには、Projectビューにドラッグ&ドロップするだけ。
モデルデータを取り込むと、モデルデータが追加されるのと同時に、モデルデータ内に含まれるマテリアルが自動的に作成される。このデータの場合であればVantanKunという名前のマテリアル。 マテリアルと同名のテクスチャが存在する場合は、自動的にそのテクスチャがマテリアルに貼られる。
Projectビューの中で、モデルデータVantanKunは階層を持っているように見える。
モデルデータの中には、階層構造と、メッシュデータと、アニメーションデータが含まれる。VantanKunの場合は、階層構造のトップである"Pelvis"と、メッシュデータである"Cahracter"と、複数のアニメーションデータが見える。 シーンへの追加モデルをシーンに追加するには、モデルデータをSceneビューにドラッグ&ドロップするだけ。
シーンに追加されたモデルは、とりあえずデフォルトのアニメーションが自動再生されるようになっている。
デフォルトアニメーションを変えるには、AnimationコンポーネントにあるAnimationを変更する。
FBXインポート設定の調整アニメーションデータのデフォルトのインポート設定では、アニメーションは1回しか再生されないようになっている。大抵の場合、これはループされるようにしておいた方が使いやすい。
アニメーションの制御単純に再生してみるアニメーションの再生をスクリプトから制御するにはanimationプロパティを使う。
function Start() {
animation.Play("Walk");
yield WaitForSeconds(3.0);
animation.Play("Greet");
}
歩きアニメーションが3秒間再生されて、そのあと挨拶アニメーションに変化する。 インタラクティブに制御してみるとりあえず、キー入力されている間、歩きアニメーションが再生されるようにしてみる。
function Update() {
if (Mathf.Abs(Input.GetAxis("Horizontal")) > 0.5) {
animation.Play("Walk");
} else {
animation.Play("Idle");
}
}Play関数は、アニメーションが既に再生中の場合は何もしないので、こんな感じで毎フレーム呼んでも問題ない。 アニメーションの切り替えを滑らかにするPlayの代わりにCrossFadeを使うと、アニメーションの切り替えが滑らかになる。
function Update() {
if (Mathf.Abs(Input.GetAxis("Horizontal")) > 0.5) {
animation.CrossFade("Walk");
} else {
animation.CrossFade("Idle");
}
}CrossFadeを使うと、古いアニメーションと新しいアニメーションの間でクロスフェーディングが行われる。クロスフェーディングの長さは第2引数で調整可能。デフォルトでは0.3秒に設定されている。
アニメーションの設定調整animationプロパティは、各アニメーションを格納した仮想配列のようにも使える。例えば、アニメーション"Walk"の設定を調整するには、animation["Walk"]のようにする。
function Start() {
animation["Walk"].speed = 2.0;
}
歩きアニメーションの再生スピードが倍になれば成功。 再生スピード以外では、ループのモードを変更するためのプロパティWrapModeが、よく使われる。
function Start() {
animation["Idle"].wrapMode = WrapMode.PingPong;
}
待機アニメーションがピンポン再生されるようになれば成功。 アニメーション・レイヤーUnityのアニメーションシステムにはレイヤーの概念が用意されている。レイヤーを使うと、複数のアニメーションを合成したり、再生中のアニメーションを別のアニメーションで上書きしたりできる。 レイヤー番号レイヤーは番号によって管理される。デフォルトでは0番レイヤーが使用される。レイヤー番号は大きい方が優先される。 アニメーションの合成
function Start() {
animation["Greet"].layer = 1;
animation.Play("Greet");
animation["Greet"].weight = 0.5;
}
上のスクリプトでは、まず挨拶アニメーションのレイヤーを1番に設定している。その次に挨拶アニメーションの再生を開始し、最後にアニメーションの合成率を50%に変更している。 weightの変更はPlayの後に行うのがコツ(Playは常に100%で再生を開始する)。 アニメーションの上書き
if (Input.GetButtonDown("Fire1")) {
animation["Punch"].wrapMode = WrapMode.Once;
animation["Punch"].layer = 2;
animation.CrossFade("Punch", 0.1);
}
上のスクリプトでは、まずパンチアニメーションのループを無し(単発再生)に設定してから、レイヤーを2番に設定している。最後にパンチアニメーションを早めのクロスフェードで再生開始する。 このように挿し込みで再生するアニメーションはレイヤーで上書き再生すると簡単。レイヤーを使わないと、アニメーションを再生し終えてから元のアニメーションを復帰させる処理などを行わなくてはならなく、かなり面倒。 キュー再生複数のアニメーションをキューで繋げて再生予約することができる。
if (Input.GetButtonDown("Fire1")) {
animation["Punch"].wrapMode = WrapMode.Once;
animation["Crouch"].wrapMode = WrapMode.Once;
animation["Punch"].layer = 2;
animation["Crouch"].layer = 2;
animation.CrossFadeQueued("Punch", 0.1);
animation.CrossFadeQueued("Crouch", 0.1);
animation.CrossFadeQueued("Punch", 0.1);
}
パンチ・しゃがみ・パンチの順で再生されれば成功。 CrossFadeQueuedは、現在再生中のアニメーションが終了してから、指定されたアニメーションをクロスフェード再生する。なお、PlayQueuedというのも存在する。 階層構造の参照シーンに配置したVantanKunの下には階層構造(ボーン構造)が存在する。
ちなみに、モデルを作るときに間違えてLeftとRightが逆になってしまっている…… ボーン構造の一番上(Pelvis)にはSkinned Mesh Rendererコンポーネントが存在する。実際にモデルの描画を行っているのは、このコンポーネント。
その更に下には、キャラクターのボーン構造が存在する。ひとつのボーンは、だいたいひとつの関節に対応している。
この階層構造を使えば、任意のボーンの下にパーツやエフェクトを追加することができる。
箱が手に付いて動くようになれば成功。 例えば、頭のボーンにTriggerを付ければ、正確に頭部の当たり判定を行うことができる(ヘッドショット判定など……)。 課題手本と同じものを作成する。 ポイントは以下の通り。
余裕があれば、Jumpボタンでジャンプできるようにしてみる。 来週の授業開始時に回収。 提出ディレクトリ\\G-Server\Public\GP\Unity\Middleware0713 ヒント移動にはTransform.positionを直接いじればいい。こんな感じ。 Transform.position.x += Input.GetAxis("Horizontal") * speed * Time.deltaTime;ジャンプには放物線の数式を使う。 ジャンプから着地した瞬間、着地のインパクトを表現するために、一瞬だけCrouchアニメーションをクロスフェード無しで再生している。 |