概要

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

ランタイムを取得する

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

インポートステートメント

使用されるインポートステートメントは次のとおりです:

import MeshBoneUtil.*;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.utils.JsonValue;
import com.badlogic.gdx.graphics.OrthographicCamera;

読み込みと初期化

default.jsonと呼ばれる、エクスポートされたドラゴンのアニメーションファイルがあるとしましょう。character-dragon.pngと呼ばれる対応するテクスチャアトラスもあると仮定します。 最初にファイルアセットを読み込むことから始めます:

// Load json
JsonValue json_data = CreatureModuleUtils.LoadCreatureJSONData("default.json");

上のコードはJSONデータをディスクからメモリに読み込みます。次に、これらの読み込まれたアセットを利用できる実際のオブジェクトを作成しましょう:

// Create creature
Creature new_creature = new Creature(json_data);

// Create animations
CreatureAnimation new_animation1 = new CreatureAnimation(json_data, "default", new_creature);
CreatureAnimation new_animation2 = new CreatureAnimation(json_data, "second", new_creature);

// Create manager and add in animations
CreatureManager new_creature_manager = new CreatureManager(new_creature);
new_creature_manager.AddAnimation(new_animation1);
new_creature_manager.AddAnimation(new_animation2);

上記の例では、JSONファイルに2つのアニメーションクリップがあります: defaultsecondです。従って、creature_managerオブジェクトから2つのアニメーションを作成して再生できるようにする必要があります。

読み込みが完了したら、アクティブなアニメーションをdefaultに設定して、いくつかの再生プロパティを設定することができます:

new_creature_manager.SetActiveAnimationName("default", false);
new_creature_manager.SetIsPlaying(true);
new_creature_manager.SetShouldLoop(true);

キャラクターアニメーションのレンダリングに必要なオブジェクトを作成します:

    // load shaders
    final String VERTEX = Gdx.files.internal("MeshBoneShader.vert").readString();
    final String FRAGMENT = Gdx.files.internal("MeshBoneShader.frag").readString();
    ShaderProgram program = new ShaderProgram(VERTEX, FRAGMENT);

    Texture new_texture = new Texture(Gdx.files.internal("character-dragon.png"));

    // Create the creature render object
    active_creature_render = new CreatureRenderer(new_creature_manager,
            new_texture,
            program,
            camera);

    // Set a transformation matrix for the creature
    Matrix4 xform = new Matrix4();
    xform.scl(1.5f);
    active_creature_render.SetXform(xform);

キャラクターのアニメーションとレンダリングアップデート

キャラクターを読み込んだら、対応するアップデートコールを呼び出して、アニメーションを更新してキャラクターをレンダリングする必要があります。これは render() コールバックで行われます:

public void render () {
	Gdx.gl.glClearColor(0, 0, 0, 0);
	Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
	batch.begin();
	batch.draw(img, 0, 0);
	batch.end();

	camera.update();
	
	// Update the character and render
	active_creature_manager.Update(Gdx.graphics.getDeltaTime());
	active_creature_render.Flush();
}

完全なコードサンプル

以下は完全なコードレイアウトです。ほとんどのコードは、デフォルトのlibGDXプロジェクトのスターターテンプレートから生成されます。ほとんどの作業を行う create() メソッドに注意してください:

package com.mygdx.game;

import MeshBoneUtil.*;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.utils.JsonValue;
import com.badlogic.gdx.graphics.OrthographicCamera;


public class MyGdxGame extends ApplicationAdapter {
    OrthographicCamera camera;
	SpriteBatch batch;
	Texture img;
    CreatureManager active_creature_manager;
    CreatureRenderer active_creature_render;
	
	@Override
	public void create () {
        camera = new OrthographicCamera( (float)Gdx.graphics.getWidth() * 0.05f,
                                            (float)Gdx.graphics.getHeight() * 0.05f);
        batch = new SpriteBatch();
		img = new Texture("badlogic.jpg");

        System.out.println("Loading json...");
        // Load json
        JsonValue json_data = CreatureModuleUtils.LoadCreatureJSONData("default.json");

        System.out.println("Loading creature...");
        // Create creature
        Creature new_creature = new Creature(json_data);

        System.out.println("Loading animations...");
        // Create animations
        CreatureAnimation new_animation1 = new CreatureAnimation(json_data, "default", new_creature);
        CreatureAnimation new_animation2 = new CreatureAnimation(json_data, "second", new_creature);

        System.out.println("Loading creature manager...");
        // Create manager and add in animations
        CreatureManager new_creature_manager = new CreatureManager(new_creature);
        new_creature_manager.AddAnimation(new_animation1);
        new_creature_manager.AddAnimation(new_animation2);

        new_creature_manager.SetActiveAnimationName("default", false);
        new_creature_manager.SetIsPlaying(true);
        new_creature_manager.SetShouldLoop(true);

        active_creature_manager = new_creature_manager;

        // load shaders
        final String VERTEX = Gdx.files.internal("MeshBoneShader.vert").readString();
        final String FRAGMENT = Gdx.files.internal("MeshBoneShader.frag").readString();
        ShaderProgram program = new ShaderProgram(VERTEX, FRAGMENT);

        Texture new_texture = new Texture(Gdx.files.internal("character-dragon.png"));

        // Create the creature render object
        active_creature_render = new CreatureRenderer(new_creature_manager,
                new_texture,
                program,
                camera);

        // Set a transformation matrix for the creature
        Matrix4 xform = new Matrix4();
        xform.scl(1.5f);
        active_creature_render.SetXform(xform);
    }

	@Override
	public void render () {
        //Gdx.gl20.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());


		Gdx.gl.glClearColor(0, 0, 0, 0);
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
		batch.begin();
		batch.draw(img, 0, 0);
		batch.end();

        camera.update();
        active_creature_manager.Update(Gdx.graphics.getDeltaTime());

        active_creature_render.Flush();
    }

}

カスタム時間/フレーム範囲

現在アクティブなアニメーションのカスタム時間/フレーム範囲を設定できます。再生範囲を10〜20のフレーム範囲に制限したい場合、次の操作を行います:

new_creature_manager.SetUseCustomTimeRane(true);
new_creature_manager.SetCustomTimeRange(10, 20);

アニメーションブレンディング

2つのアニメーションクリップをブレンドするには、次の手順を実行します:

curManager.SetBlending(true);	
curManager.SetBlendingAnimations("default", "pose2");
curManager.SetBlendingFactor(0.5);	 // 0 to 1 blends between the 2 clips

読み込み時間の高速化 + Creature Flat Binary Dataによるメモリ使用量の削減

Creature JSONファイルをCreature Flat Binary Dataフォーマットに変換することで、読み込み時間を短縮し、大きなキャラクターアセットのメモリ使用量を減らすことができます。デバイス上でヒープメモリが不足している場合、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 Converterを実行するには、ターミナル/コマンドプロンプトをロードします:

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

LibGDXでCreature Flat Binaryを使う

読み込みコードは、JSON読み込みコードと非常によく似ています。フラットデータバイナリファイルをロードする方法を示す短いコードスニペットを次に示します:

String baseResourcePath = "C:\\Mydata\\";
String flatFilename = baseResourcePath + "character_raptor_data.bytes";
String pngFilename = baseResourcePath + "character_raptor_img.png";

// Load flat data
CreatureFlatDataJava.rootData flat_data = CreatureModuleUtils.LoadCreatureFlatData(flatFilename);
  
// Create creature
Creature new_creature = new Creature(flat_data);
    
// Create animations
CreatureAnimation new_animation1 = new CreatureAnimation(flat_data.dataAnimation(), "default");

上記のコードは、Creatureフラットデータファイルの読み込み、Creature character objectとそれに対応するアニメーションオブジェクトの作成を示しています。これらのオブジェクトが作成されたら、通常どおりに処理することができます。

ボーンの位置を変更する

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

    // This is an example of how to set a custom override callback function
    // to modify the bones during playback. In this example, we are displacing
    // the bones in the character by a fixed amount in y
    active_creature_manager_2.SetBonesOverrideCallback(
            new CreatureManager.BonesCallback() {
                public void run(HashMap<String, MeshBone> bones_map)
                {
                    for (HashMap.Entry<String, MeshBone> entry : bones_map.entrySet()) {
                        MeshBone cur_bone = entry.getValue();
                        Vector3 cur_start_pt = cur_bone.getWorldStartPt();
                        Vector3 cur_end_pt = cur_bone.getWorldEndPt();

                        cur_start_pt.y += 17.5;
                        cur_end_pt.y += 17.5;

                        cur_bone.setWorldStartPt(cur_start_pt);
                        cur_bone.setWorldEndPt(cur_end_pt);
                    }
                }
            }
    );

キャラクターのインスタンス化とメモリ

キャラクターの複数のコピー(例えば、2体のドラゴン)をインスタンス化する必要がある場合、新しいCreatureオブジェクト、新しいCreatureManagerオブジェクト、および新しいCreatureRendererオブジェクトを作成する必要があります。

作成したアニメーションを、新しく作成したCreatureManagerオブジェクトに次のように追加します:

new_creature_manager_2.AddAnimation(new_animation_1);
new_creature_manager_2.AddAnimation(new_animation_2);

アニメーションに割り当てられたメモリ(最もエクスペンシブなもの)は、標準の場所に保存されます。複数のCreatureManagerオブジェクトは、CreatureAnimationオブジェクトの共有プールからアニメーションを追加します。