概要

このドキュメントでは、Unityランタイムの使用方法について説明します。ランタイムの言語はC#です。書き出したJSONファイルを読み込んでシーンで再生する方法の例を説明します。

チュートリアル動画

Unity

こちらをクリックして、Unityとの統合に関するチュートリアル動画をご覧ください。

Unity

CreatureのUnityランタイムを使用して、Unity内のNormalとAmbient Occlusion MapをUnityのドラゴンキャラクターに統合する方法については、こちらをクリックしてご覧ください。

Unity

こちらをクリックして、Creatureからアニメーション領域順序を書き出したキャラクターを再生する方法をご覧ください。

Unity

こちらをクリックして、CreatureのPlugin for Unityを使用して2D Side-Scrolling Platformerゲームメカニックスを作成する方法をご覧ください。プラットフォームデモ用のサンプルプロジェクトは、こちらからダウンロードできます。

Unreal

こちらをクリックして、CreatureのツールにあるEvent Authoring Editorを使用して、Author Frame Callback Triggersを作成する方法のチュートリアルをご覧ください。書き出したイベントトリガーは、Unityから読み込むことができます。

ランタイムを取得する

ランタイムをCreatureのGame Runtimesウィンドウから直接ダウンロードするか、リポジトリ(こちら)から取得することができます。

フルランタイム vs CreaturePackランタイム(複数キャラクターのために高性能の再生が必要ですか?)

CreaturePack

多くのキャラクターを高性能で再生するために設計されたCreaturePackランタイムと呼ばれる代替の軽量プラグインがあります。もしこれがあなたが求めているものなら、こちらをご覧ください。

Unityオブジェクトを追加する

提供されたランタイムスクリプトに追加した後、GameObjectメニューの下に追加のCreatureメニューが表示されます:

Meshing

使用可能なコンポーネントは次のとおりです:

  • CreatureAsset: このオブジェクトはJSONアニメーションデータの読み込みと管理を行います。

  • CreatureRenderer: このオブジェクトはキャラクターの実際のレンダリングを行います。利用可能なCreatureAssetオブジェクトを指すスロットがあります。

  • CreatureGameController: このオブジェクトは、CreatureRenderオブジェクトの子として追加されます。キャラクター内の各ボーンリジッドコライダーオブジェクトを管理して作成します。アニメーションの下にあるボーンを持つコライダーオブジェクトも移動します。

Unityでキャラクターアニメーションを再生するには、3つのオブジェクトすべて必要となります。

ステップ1: CreatureAssetを追加する

新しいCreatureAssetオブジェクトを追加するには、メインメニューのCreature -> CreatureAssetをクリックします。このオブジェクトには、次のプロパティがあります:

Meshing

この例では、いくつかの忍者アニメーションを含むアニメーションJSONファイルがあるとします。そのファイルはninjaTestと呼ばれています。Creature JSON入力スロットをninjaTestアセットファイルに指定して、JSONファイルを読み込んで管理するためにこのオブジェクトを設定します。ファイルが読み込まれると、使用可能なアニメーションクリップがインスペクタに自動的に表示されます。この場合、ファイルには3つの使用可能なアニメーションがあります: default、runningattackです。

ステップ2: CreatureRendererを追加する

メインメニューのCreature -> CreatureRendererをクリックして新しいCreatureRendererオブジェクトを追加します。このオブジェクトには、次のプロパティがあります:

Meshing

作成したCreatureAssetオブジェクトを参照するように、Creature_asset入力スロットを設定します。これが完了すると、さらにいくつかの属性が表示されます:

  • Local_time_scale: これは再生速度の倍数です。

  • Region offsets z: 各メッシュ領域にどれだけのzオフセットがあるかを定義する値です。z fighting rendering artifactsを経験している場合、これを使ってキャラクターのさまざまなメッシュ領域を"押し出す"ことができます。

  • Counter clockwise: メッシュのレンダリングされた三角形の巻き順を設定します。バックフェイスカリングによってメッシュが表示されない場合、このオプションをチェックして巻き順序に変更して表示させることができます。

  • Animation: 現在アクティブなアニメーションを再生のために設定します。

  • Loop: アニメーションをループさせるかどうか決定します。

このオブジェクトはまだスクリーン上に何も描画していません。キャラクターのテクスチャーアトラスPNGイメージを指し示すMaterialコンポーネントを追加して、キャラクターレンダリングを表示させる必要があります。簡単に始められるMaterialSprites/Default Materialを使用する方法です。

ステップ3: CreatureGameControllerを追加する

先ほど作成したCreatureRendererオブジェクトを選択し、Creature -> CreatureGameControllerをクリックして、現在のCreatureRendererオブジェクトの子として新しいCreatureGameControllerオブジェクトを作成します。ヒエラルキービュー内に、次のようなものが取得されているはずです:

Meshing

Creature Game Controllerは、インスペクタで次のようなプロパティを持っています:

Meshing

  • Creature_renderer: あなたのCreatureRendererオブジェクトを参照するようにこれを設定します。

  • Collider Height: 各ボーンコライダーの高さを定義します。ボーンコライダーは運動学的なものなので、物理的なものではなくアニメーションによるものです。

  • Sim Collider Width and Sim Collider Height: メインキャラクターのコライダーの大きさを定義します。このコライダーは、キャラクター全体のために作成され、物理によって駆動されるものです。

このオブジェクトを使用するには、Build Skeleton Objectsをクリックします。オブジェクトは自動的にキャラクターのボーン階層を横断し、キャラクター内のすべてのボーンにキネマティックコライダーを作成します。それに加え、キャラクターを表現する全体的なシムコライダーも作成します。ヒエラルキービューでは、次のようなものが取得されているはずです:

Meshing 各ボーンコライダーがキネマティックである目的は、キャラクターのアニメーションに従うようにするためです。主なシムコライダーはキネマティックではなく、物理的に駆動されます。従って、重力/プレイヤーアクションのような力をシムコライダーを駆動するために適用することができます。シムコライダーモーションは、ゲーム内でキャラクターを動かすことができるのと同時にCreatureRendererオブジェクト全体を動かします。個々のキネマティックボーンコライダーは、他のオブジェクト(着弾、損傷など)との衝突検出に使用できます。

ゲームが実行されていないときは、キャラクターにコライダーがどのように配置されているかを事前に把握できるはずです。ゲームが実際に動いている時、コライダーはボーンと同期します。実行していないときは、ボーンは休憩ポーズに設定されるため、キャラクターの現在のアニメーションポーズと同期しないことがあります:

Meshing

Creature Flat Binary Dataによる読み込み時間の高速化

Creature JSONファイルをCreature Flat Binary Dataフォーマットに変換することで、大規模なキャラクターアセットの読み込み時間を短縮化することができます。

まず、Creature Tools Github Pageに行きます:

1)FlatDataディレクトリに移動します。

2)CreatureFlatDataコンバータープログラムをコンパイルするか、Binディレクトリーからあなたのシステム(MacまたはWindows)のためにバイナリーを取得するだけです。

CreatureFlatDataコンバーターを実行する

これは、書き出したCreature Character JSONファイルを取り込んで、それをバイナリのCreature Flat Dataファイルに変換するコマンドラインプログラムです。Unityがバイナリアセットとして認識できるように、変換された最終出力バイナリファイルの拡張子を .bytes にすることをお勧めします。

CreatureFlatDataコンバーターを実行するには、ターミナル/コマンドプロンプトを読み込みます:

CreatureFlatData <Input JSON File> <Output .bytes File>

UnityでCreature Flat Binaryを使う

CreatureAssetオブジェクト内で:

1)まず、新しいCreature Flat Binaryファイルをあなたのプロジェクトのassetsフォルダに配置します。

2)あなたのCreatureAssetFlat Creature Dataスロットにバイナリファイルをドラッグします。

3)Use Flat Data Assetチェックボックスをオンにします。

上記のすべての手順を完了したら、CreatureのUnityランタイムは新しいCreatureバイナリファイルを読み込むはずです。

ポイントキャッシュによる再生のスピードアップ

ゲーム上でフレームレートの問題が発生している場合や、画面上に多くのキャラクターを配置したい場合、アニメーション上でPoint Cachingを有効にすることができます。

Meshing

CreatureAssetオブジェクト内の各アニメーション上でPoint Cacheの横にチェックを入れ、その特定のアニメーションに対して有効にします。ゲームが読み込まれると、キャッシュの生成に少し時間がかかります。キャッシングされたアニメーションを再生すると、ポーズエンジンを完全にバイパスするので、通常再生の速度の平均2倍から3倍かかります。

Animated Region Ordering

あなたのキャラクターをCreatureから作成した場合、Animated Region Ordering機能を使用して追加のファイルを生成できます。このファイルの拡張子は .mdata です。このファイルをUnityにドラッグし、Unityが Text Asset として見なければならないので JSON に名前を変更します。この新しいアセットを Creature Asset オブジェクトの Creature Meta JSON スロットにドラッグして Region Ordering をアクティブにします。

カスタムアニメーションフレームのコールバックイベント/Creatureエディタを使用するトリガー

これで、Creature Editor内でイベントを直接作成し、エンジンにエクスポートすることができます。

  1. まず、CreatureでEvent Triggers編集ウィンドウを開きます: UE4

  2. あなたのカスタムイベントに追加します。イベントは、アニメーションの現在の時間/フレームで追加されます: UE4

  3. キャラクターをエクスポートし、 .mdata でシーンにインポートします。これについては、このドキュメントの Animated Region Ordering セクションで説明しています。

イベントコールバックを処理するには、GameControllerを設定する必要があります。GameController自体にはイベントとデリゲートがあります:

public delegate void eventTrigger(string event_name);
public static event eventTrigger OnEventTrigger;

イベント/デリゲートになじみがない場合、Unity公式のドキュメンテーションページから設定方法をお読みください。

カスタムのeventTriggerメソッドをOnEventTriggerイベントに接続することで、あなたのキャラクターの作成したイベントに反応することができます。

圧縮されたエクスポートおよび読み込みを使用してJSONファイルサイズを縮小する

サイズが問題である場合、CreatureAssetオブジェクトを使用すると、圧縮されたJSONアセットをエクスポートして読み込むことができます。圧縮されたJSONアセットを使用するために必要な手順は次のとおりです:

1)CreatureAssetオブジェクトを選択し、Export as Compressed Fileをクリックします。圧縮ファイルをエクスポートするファイル名を選択します。ファイルの拡張子が.bytesであることを確認してください

2)新しいCreatureAssetオブジェクトを作成し、Use Compressed Assetをチェックします。

3)ステップ1)の新しい圧縮アセットを新しいCreatureAssetオブジェクトのCompressed Creature JSONスロットにドラッグします。

この方法によるファイル圧縮サイズは効果的で、10.5MBのファイルはわずか0.8MBに圧縮できます(10倍以上)。大きなCreature JSONアセットがある場合や、ディスク容量が制限されている場合は、このオプションを使用してください。

方法1:ゲームプレイのためのGameControllerのカスタマイズ

CreatureGameControllerオブジェクトを追加するのは、ゲームのキャラクターをカスタマイズできるようにするためです。すべての設定が完了したら、CreatureGameControllerオブジェクトの実際のコードを必要に応じて変更することができます。

忍者キャラクターがユーザーのキーボード入力に反応して動くようにしたいとしましょう。まず、CreatureGameControllerのスクリプティングコードを開きます。 FixedUpdate() メソッドに注意してください:

// Put your gameplay code here
void FixedUpdate() {
	// Call this to make the bone colliders follow the animation in a kinematic fashion
	UpdateGameColliders();
	
	...

UpdateGameColliders() の呼び出しが最初にあることに気づくでしょう。これを呼び出して、ボーンとシムコライダーをキャラクターアニメーションと同期させます。次に、あなた自身のゲームキャラクターのコードを追加することができます:

	// The following code is an example of how you could handle the 
	// control/behaviour of a character using this runtime
	bool left_down = Input.GetKeyDown (KeyCode.A);
	bool right_down = Input.GetKeyDown (KeyCode.D);
	bool left_up = Input.GetKeyUp (KeyCode.A);
	bool right_up = Input.GetKeyUp (KeyCode.D);
	bool attack_down = Input.GetKeyDown (KeyCode.R);
	bool attack_up = Input.GetKeyUp (KeyCode.R);
	var parent_obj = creature_renderer.gameObject;
	Rigidbody2D parent_rbd = parent_obj.GetComponent<Rigidbody2D> ();

	if (is_moving) {
		if(is_moving)
		{
			float move_vel_x = 0;
			if(is_facing_left)
			{
				move_vel_x = -50;
			}
			else {
				move_vel_x = 50;
			}
			parent_rbd.velocity = new UnityEngine.Vector2(move_vel_x, 0);
			creature_renderer.SetActiveAnimation ("running", true);
		}

		if(left_up || right_up) {
			is_moving = false;
			var cur_vel = parent_rbd.velocity;
			cur_vel.x = 0;
			parent_rbd.velocity = cur_vel;
			creature_renderer.SetActiveAnimation ("default");
		}
	} 
	else {
		if (left_down) {
			is_moving = true;
			is_facing_left = true;
		} 
		else if (right_down) {
			is_moving = true;
			is_facing_left = false;
		}

		float facing_angle = 0;
		if(is_facing_left) {
			facing_angle = 180;
		}

		parent_obj.transform.rotation = UnityEngine.Quaternion.AngleAxis(facing_angle, new UnityEngine.Vector3(0, 1, 0));
	}


	if (!is_moving) {
		if(attack_down)
		{
			creature_renderer.SetActiveAnimation ("attack");
		}
		else if(attack_up)
		{
			creature_renderer.SetActiveAnimation ("default");
		}
	} 

上記のコードサンプルを注意深く読んでください。creature_rendererオブジェクトで SetActiveAnimation() を呼び出すことによって、現在アクティブなアニメーションを変更できることがわかります。 parent_obj オブジェクトで rotation 属性を設定することで、キャラクターを反転することもできます。上記の例で、キーボードでキャラクターを制御できるようになります。全体的なシムコライダーは以下から取得されます:

	var parent_obj = creature_renderer.gameObject;
	Rigidbody2D parent_rbd = parent_obj.GetComponent<Rigidbody2D> ();
	

シムコライダーはCreatureRendererオブジェクトの親コンポーネントとして存在するためです。

Aを押すと左に、Dを押すと右に走り、Rを押すと攻撃することができます。それに加えて、キーが押されていない場合、キャラクターはデフォルトのアニメーションを再生します。

方法2:ゲームプレイのためのGameControllerのカスタマイズ

あなたのキャラクターにゲームプレイロジックを追加するためのもう一つのより明解な方法があります。この方法にはCreatureGameControllerオブジェクトが必要となります。

CreatureGameControllerオブジェクトを追加すると、CreatureGameAgentから継承した新しいクラスを派生させる必要があります。Merfolk Gameと呼ばれるあなたのキャラクターを動かすAIを持っている場合、次のようにします:

using System;
using CreatureModule;
using UnityEngine;
using UnityEditor;

public class MerfolkGame : CreatureGameAgent
{
	public MerfolkGame ()
		: base()
	{
	}
	
	public override void updateStep()
	{
		// Shows you how to grab the renderer and relevant parent 
		// objects.
		var creature_renderer = game_controller.creature_renderer;
		var parent_obj = creature_renderer.gameObject;
		Rigidbody2D parent_rbd = parent_obj.GetComponent<Rigidbody2D> ();
	

		base.updateStep ();
		
		// My gameplay code here, do whatever you need to do
		// to control the character
	}
}

それが終わったら、新しい空のゲームオブジェクトを作成し、それをMerfolkGameスクリプトに割り当てます。CreatureGameControllerオブジェクトを選択し、カスタムエージェントの下でMerfolkGameオブジェクトに割り当てます。これを行うと、GameControllerはupdateState()メソッドを呼び出し、実行中にMerfolkGameオブジェクトを使用します。

新しいアニメーションクリップに移行する

新しいアニメーションに移行するには2つの方法があります。 まず、次のようにベースレンダーオブジェクトへの参照を取得する必要があります:

var creature_renderer = game_controller.creature_renderer;

新しいアニメーションクリップへのハードトランジション(インスタントトランジション)を呼び出すには:

creature_renderer.SetActiveAnimation ("NewAnimationName", true);

新しいクリップに徐々にブレンドされていくためには:

creature_renderer.BlendToAnimation("default");

アニメーションクリップのフレーム範囲をカスタマイズする

アニメーションクリップの独自のカスタム開始時間と終了時間を設定できます。CreatureRendererからCreatureManagerのインスタンスを取得します:

var creature_renderer = game_controller.creature_renderer;
var manager = creature_renderer.creature_manager;
var myAnimation = manager.GetAllAnimations()["MyAnimationName"];

// Set my own start and end times
myAnimation.start_time = myCustomStartTime;
myAnimation.end_time = myCustomEndTime;

Unity 5のMecAnimサポート

UnityランタイムはUnity 5のUnityステートマシン(MecAnim)をサポートしています。使用するには、あなたのCreature Asset上で選択してください:

Meshing

Build State Machineをクリックします。これにより、自動的に新しいステートマシンアセットが生成されます。開くと、アセット内のさまざまなアニメーション状態を表すステートが作成されています:

Meshing

これは通常のUnity State Machineアセットですので、定期的に行う方法と同じように接続して状態遷移条件を設定することができます。

状態遷移を設定したら、Creature Game Controllerに戻り、State Machine Assetにドラッグします:

Meshing

これであなたのアニメーションの状態遷移はアクティブになります。

ボーンの位置を変更する

場合によっては、キャラクターのボーンの位置を直接変更する必要があります。例えば、ボーンの位置をラグドール物理のスプリング/ジョイントに接続されたいくつかの剛体に従わせることができます。独自のカスタム要件に合わせてボーンの位置を設定する必要がある場合は、次の操作を行う必要があります。まず、カスタムボーンオーバーライドメソッドを記述します。yのボーンをある量だけ置き換える例を次に示します:

// This demonstrates the ability to override/modify bone positions 

void UpdateBonesToCustomPositions(Dictionary<string, MeshBoneUtil.MeshBone> bones_map)
{
	foreach(KeyValuePair<string, MeshBoneUtil.MeshBone> entry in bones_map)
	{
		var cur_bone = entry.Value;
		// displace each bone upwards by y as an example
		var cur_world_start_pos = cur_bone.getWorldStartPt();
		var cur_world_end_pos = cur_bone.getWorldEndPt();

		float displace_y = -20.0f;
		cur_world_start_pos.Y += displace_y;
		cur_world_end_pos.Y += displace_y;

		cur_bone.setWorldStartPt(cur_world_start_pos);
		cur_bone.setWorldEndPt(cur_world_end_pos);
	}

}

次に、FixedUpdate()コールで、CreatureManagerにカスタムボーン修正コールバックを使用するように指示します:

	// The following code sets an optional bone override callback for modifying bone positions
	CreatureManager cur_manager = creature_renderer.creature_manager;
	cur_manager.bones_override_callback = UpdateBonesToCustomPositions;

ゲームアイテムと領域の切り替え/スワップアウト

ランタイムを使用してキャラクタの特定のメッシュ領域を切り替えたり/スワップアウトすることができます。これは、帽子・靴・武器などのキャラクターアイテムの切り替えを実行する際に便利です。

ゲームアイテム/領域の切り替えを設定する手順:

1)Creature Editorで、スワップしたい領域に対してEnable Image Swapが有効になっていることを確認してください

2)また、関心領域のSprite Frame ManagerからA Single Image Swap Knotセットを持っていることを確認してください

3)領域のために入れ替える他のスプライトについては、Sprite Frame Managerを開き、Tag値を書き留めてください:

UE4

タグ値は常にマイナスです。この値は、後でゲームアイテムスワッピングでランタイムに入れる数値です。

アイテムの切り替えを有効にする方法

前の段落のアイテム切り替え設定では、ゲーム内で領域/アイテムの切り替えをトリガーする準備が整いました。このコードは、CreatureGameControllerを変更してFixedUpdate()コールバックを無効にしていることを前提としています。 まず、C#コードのCreatureManagerオブジェクトへの参照を取得します:

CreatureManager cur_manager = creature_renderer.creature_manager;

ターゲット領域を新しいイメージでスワップすることができます:

	cur_manager.target_creature.SetActiveItemSwap(region_name, tagID);

region_nameは関心領域の名前、tagIDは前のセクションから取得したタグを示します。

アンカーポイント

あなたのキャラクターをアニメーション化するときに、同じ起点でそれらを中心に置いていないことが多々あります。アンカーポイントでは、特定のアニメーションクリップのキャラクターの相対的な起点を指定することができます。これにより、必要に応じて異なるキャラクターアニメーションを中心に配置することができます。

1)Creature EditorAnimate -> Set Anchor Pointを実行する

2)キャラクターの周りでRed Spinning Boxをドラッグし、アンカーポイントを設定します:

UE4

3)Unityで:

CreatureManager cur_manager = creature_renderer.creature_manager;
cur_manager.target_creature.anchor_points_active = true;

2行目はアンカーポイントを有効にして、指定したアンカーポイントの中央にキャラクターアニメーションを作成します。

その他の使用上でのヒント

  • 単一のCreatureAssetオブジェクトを参照する複数のCreatureRendererオブジェクトを持つことができます。これはメモリの節約に役立ち、同じ種類のキャラクターの複数のコピーをインスタンス化する際に便利です。

  • 衝突の検出には、個々のボーンコライダーを使用する必要があります。しかし、衝突応答はメインのSim Colliderに適用することができます。そうすることで、個々のボディーパーツできめ細かな衝突検出が可能になりますが、全体的なキャラクターボディーの全体的に安定した衝突応答が得られます。