spine-godotランタイム ドキュメント
ライセンスについて
Spineランタイムをアプリケーションに組み込む前に、必ずSpine Runtimes Licenseを確認してください。
はじめに
インストール方法
spine-godotランタイムはC++のカスタムモジュールとして実装されています。このため、GodotエディタのカスタムビルドとGodotエクスポートテンプレートが必要です。当社では最新のGodot 3.5ブランチおよびGodot 4.xブランチに対して、ビルド済みのエディタおよびエクスポートテンプレート・バイナリを提供します。
注意: エディタビルドはすべて64-bitサポートが必要です。Windows、Linux、macOS用のエクスポートテンプレートも64-bitのサポートが必要です。iOSデバイス用のエクスポートテンプレートは64-bit ARMデバイスのみをサポートしています。
上記のリンクから、お使いのOSに対応したGodotエディタと、Godotエクスポートテンプレートをダウンロードしてください。
Windows または Linux の場合は、.zip
ファイルを解凍後、解凍された実行ファイルをお好きな場所に置くことができます。macOSの場合は、.zip
ファイルを解凍後、 Godot.app
を /Applications/
フォルダに配置してください。既存のGodotインストールがある場合は、Godot.app
パッケージの名前を変更することができます。
エクスポートテンプレートの .tpz
ファイルをインストールするには、Godotエディタを開き、Editor > Manage export templates ...
を選択してください。 Install from file
をクリックして、上記のリンクからダウンロードした .tzp
ファイルを選択します。これで通常通り、Windows、Linux、macOS、iOS、Android、およびWeb用にプロジェクトをエクスポートできるようになります。また、Godotのワンクリック・デプロイ機能を使えば、Godotエディタ内からAndroidやWeb向けに直接デプロイすることも可能です。
サンプル
spine-godotランタイムには、各機能を紹介しているさまざまなサンプルが付属しています。サンプルを確認したり再生するには:
- 上の「インストール」セクションのリンクから、お使いのOS用のビルド済みGodotエディタをダウンロードします。
- spine-runtimesのGitリポジトリをクローンします。Gitを使いたくない場合は、最新のバージョンをZIPでダウンロードして解凍してください。
- Godotエディタを開き、
Import
をクリックし、spine-runtimes/spine-godot/example/project.godot
ファイルを選択します。
以下のような例があります:
01-helloworld
:SpineSprite
ノードを使用して、Spineスケルトンを表示し、アニメーションさせる方法を紹介しています。02-animation-state-listener
:SpineSprite
のアニメーションのステートの変化をシグナルで受信する方法を紹介しています。03-mix-and-match
: 他のスキンを組み合わせてカスタムスキンを作成し、mix-and-matchアバターを作成する方法を紹介しています。04-simple-input
: 入力イベントに反応してアニメーションを再生する方法を紹介しています。05-mouse-following
:SpineSprite
スケルトンのボーンを手動でマウスやタッチイベントに追従させる方法を紹介しています。06-bone-following
:SpineSprite
上のSpineBoneNode
を使用して、子ノードがスケルトンのボーンに追従するようにする方法を紹介しています。07-slot-node
:SpineSlotNode
を使用して子ノードをスケルトンのスロットに従わせ、SpineSprite
の描画順序に子ノードを正しく挿入する方法を紹介しています。08-animation-player
: GodotのAnimationPlayer
ユーザーインターフェースを使って、SpineAnimationTrack
ノードを使用してカットシーンを作成する方法を紹介しています。09-custom-material
:SpineSlotNode
を介して、SpineSprite
全体および個々のスロットにカスタムマテリアルを適用する方法を紹介しています。10-2d-lighting
: Godotの2Dライティングシステムに対応するために、SpineSprite
と組み合わせて法線マップ(ノーマルマップ)を使用する方法を紹介しています。11-bone-node
:SpineBoneNode
インスタンスを使用して、Godotの物理演算によってSpineSprite
ボーンを動作させる方法を紹介しています。
注意: Godot 3.x と 4.x の GDScript の間には非互換性があるため、Godot 4.0 用には別の
example-v4
プロジェクトフォルダを提供しています。example-v4
プロジェクトは最新のGodot 4.0.xリリースで保存されていますが、Godot 4.1.xでも開くことができます。
Godotエディタとエクスポートテンプレートをソースからコンパイルする
異なるバージョンのGodotを使いたい、他のカスタムC++モジュールがある、あるいはspine-godotランタイムで作業したいなどの理由で、Godotエディタとエクスポートテンプレートを自分でコンパイルする必要がある場合のために、そのプロセスを容易にするシェルスクリプトを提供しています。
注意: この作業を行う前に、Godotによる公式の指示に従い、すべてのビルド依存ファイルがインストールされていることを確認してください。
Godot 3.5.x
Godotエディタバイナリをビルドするには、まずspine-runtimesリポジトリをクローンします。Spine Runtimesをクローンしたディレクトリ内で、Bashシェル(WindowsではGit Bashを使用)で以下を実行します。:
./build/setup.sh 3.5-stable false
./build/build.sh release_debug
setup.sh
の最初の引数は、GodotエディタをビルドしたいGodotリポジトリのブランチまたはコミットハッシュになります。第2引数には、開発用にエディタをコンパイルするかどうかを指定します。有効な値はtrue
およびfalse
です。trueに設定すると、LIVEPP
環境変数をLive++のインストールディレクトリに設定した場合、Windows上のLive++のサポートが追加され、コンパイルを高速化するために多くのモジュールが無効になります。
build.sh
の最初の引数は、生成されるバイナリの最適化レベルを指定します。サポートされている値は、完全なデバッグが可能になる代わりに最適化されていないため遅くなることがあるdebug
と、一般的にGodotエディタのリリースビルドに使用されるrelease_debug
です。
出来上がったGodotエディタバイナリは、spine-godot/godot/bin
に保存されます。
特定のプラットフォーム用のエクスポートテンプレートをビルドするには、Bashシェル(WindowsではGit Bashを使用)で以下を実行します:
./build/setup.sh 3.5-stable false
./build/build-templates.sh windows
setup.sh
の最初の引数は、GodotエディタをビルドしたいGodotリポジトリのブランチまたはコミットハッシュです。第2引数は必ずfalse
でなければなりません。
built-templates.sh
の最初の引数は、テンプレートをコンパイルするためのプラットフォームです。有効な値は、windows
、linux
、macos
、web
、android
、ios
です。macOSとiOSのエクスポートテンプレートは、macOSが動作しているマシンでのみビルドできることに注意してください。詳しくはGodotによる公式の説明を参照してください。
出来上がったGodotエクスポートテンプレートバイナリは、spine-godot/godot/bin
に保存されます。
Godot 4.x
Godotエディタバイナリをビルドするには、まずspine-runtimesリポジトリをクローンします。Spine Runtimesをクローンしたディレクトリ内で、Bashシェル(WindowsではGit Bashを使用)で以下を実行します。:
./build/setup.sh 4.1-stable false
./build/build-v4.sh
setup.sh
の最初の引数は、GodotエディタをビルドしたいGodotリポジトリのブランチまたはコミットハッシュになります。第2引数には、開発用にエディタをコンパイルするかどうかを指定します。有効な値はtrue
およびfalse
です。trueに設定すると、LIVEPP
環境変数をLive++のインストールディレクトリに設定した場合、Windows上のLive++のサポートが追加され、コンパイルを高速化するために多くのモジュールが無効になります。
出来上がったGodotエディタバイナリは、spine-godot/godot/bin
に保存されます。
特定のプラットフォーム用のエクスポートテンプレートをビルドするには、Bashシェル(WindowsではGit Bashを使用)で以下を実行します:
./build/setup.sh 4.1-stable false
./build/build-templates-v4.sh windows
setup.sh
の最初の引数は、GodotエディタをビルドしたいGodotリポジトリのブランチまたはコミットハッシュです。第2引数は必ずfalse
でなければなりません。
built-templates-v4.sh
の最初の引数は、テンプレートをコンパイルするためのプラットフォームです。有効な値は、windows
、linux
、macos
、web
、android
、ios
です。macOSとiOSのエクスポートテンプレートは、macOSが動作しているマシンでのみビルドできることに注意してください。詳しくはGodotによる公式の説明を参照してください。
出来上がったGodotエクスポートテンプレートバイナリは、spine-godot/godot/bin
に保存されます。
Godot 4.x with C# support
注意: C#対応のGodot 4.xは現在、Windows、Linux、およびmacOSでのみ動作します。上流のGodotリリースがモバイルとウェブに対応し次第、spine-godotランタイムもそれに追随する予定です。
C#対応のGodotエディタバイナリをビルドするには、まずspine-runtimesリポジトリをクローンします。Godotのドキュメントに従って、C#の追加要件がインストールされていることを確認してください。そしてSpine Runtimesをクローンしたディレクトリ内で、Bashシェル(WindowsではGit Bashを使用)で以下を実行します。:
./build/setup.sh 4.1-stable false true
./build/build-v4.sh true
setup.sh
の最初の引数は、GodotエディタをビルドしたいGodotリポジトリのブランチまたはコミットハッシュになります。第2引数には、開発用にエディタをコンパイルするかどうかを指定します。有効な値は true
および false
です。trueに設定すると、LIVEPP
環境変数をLive++のインストールディレクトリに設定した場合、Windows上のLive++のサポートが追加され、コンパイルを高速化するために多くのモジュールが無効になります。第3引数はオプションで、C#をサポートしてビルドするかどうかを指定します。有効な値は true
および false
です。この場合、C#サポートを有効にするためにtrueが設定されています。
build-v4.sh
の引数はオプションで、C#をサポートしてビルドするかどうかを指定します。有効な値は true
および false
です。この場合、C#サポートを有効にするためにtrueが設定されています。
出来上がったGodotエディタバイナリは、spine-godot/godot/bin
に保存されます。さらに、spine-godot/godot/bin
ディレクトリ内に GodotSharp
フォルダが保存されます。これにはspine-godotランタイムAPIを含む、Godot API用のすべてのC#バインディングアセンブリが含まれています。新しいプロジェクトを作成するときは、NuGet経由でこれらを結びつける必要があります。詳しくは、後述のC#プロジェクトのセットアップセクションをご覧ください。
特定のプラットフォーム用のエクスポートテンプレートをビルドするには、Bashシェル(WindowsではGit Bashを使用)で以下を実行します:
./build/setup.sh 4.1-stable false
./build/build-templates-v4.sh windows
setup.sh
の最初の引数は、GodotエディタをビルドしたいGodotリポジトリのブランチまたはコミットハッシュです。第2引数は必ずfalse
でなければなりません。
built-templates-v4.sh
の最初の引数は、テンプレートをコンパイルするためのプラットフォームです。有効な値は、windows
、linux
、macos
、web
、android
、ios
です。macOSとiOSのエクスポートテンプレートは、macOSが動作しているマシンでのみビルドできることに注意してください。詳しくはGodotによる公式の説明を参照してください。
出来上がったGodotエクスポートテンプレートバイナリは、spine-godot/godot/bin
に保存されます。
GitHub Actions経由でGodotエディターとエクスポートテンプレートをビルドする
Spine Runtimesリポジトリには、.github/workflows/spine-godot.yml
、.github/workflows/spine-godot-v4.yml
、.github/workflows/spine-godot-v4-all.yml
というGitHubワークフローが含まれていて、Godot 3.5.x、Godot 4.0.x、Godot 4.1.x用の各GitHubアクションを使って、すべてのGodotエディタとエクスポートテンプレートのバイナリをビルドすることができます。GitHubワークフローを使うには以下の手順に従ってください:
- Spine Runtimesリポジトリをクローンします
- クローンしたリポジトリで、GitHubワークフローを有効にします
spine-godot
、spine-godot-v4
、spine-godot-v4-all
ワークフローのいずれかを手動で起動します。
出来上がったバイナリは、ワークフローが正常に実行されると、成果物として添付されます。
spine-godot-v4-all
は、Godot 4.0、4.1、C#対応の4.1をビルドします。spine-godot-v4
ワークフローを使用すると、C#サポートの有無にかかわらず、特定のGodot 4.x バージョンのみをビルドします。このワークフローを手動で起動する場合は、Godotリポジトリのタグ(例:4.1-stable
)とGodotのバージョン(例:4.1.stable
)とC#サポートを含めるか否か (mono
チェックボックスにチェックを入れる/外す)を指定する必要があります。
C#プロジェクトのセットアップ
C#対応のGodotエディタバイナリを使用する場合、新しいGodotプロジェクトをセットアップする際に、追加のステップを踏む必要があります。
まず、上のインストールセクションでダウンロードしたC#対応のGodotエディタバイナリを使用してGodotプロジェクトを作成します。
次に、Godotを閉じて、ご自身のプロジェクトフォルダを開いてください。ルートディレクトリに godot-nuget
という新しいフォルダを作成します。
ダウンロードしたGodotエディタのZIPファイルから、Godot C# アセンブリをそのフォルダにコピーします。以下がコピーする必要のあるファイルです:
GodotSharpEditor.<version>.snupkg
Godot.NET.Sdk.<version>.nupkg
Godot.SourceGenerators.<version>.nupkg
GodotSharp.<version>.nupkg
GodotSharp.<version>.snupkg
GodotSharpEditor.<version>.nupkg
<version>
の部分にはダウンロードしたGodotのバージョンに応じたバージョン番号が入ります。例: 4.1.1
GodotエディタのZIPをダウンロードして解凍すると、以下のフォルダ内に上記のファイルがあります:
- Windows:
godot-editor-windows-mono.zip\GodotSharp\Tools\
- Linux:
godot-editor-linux-mono.zip/GodotSharp/Tools/
- macOS:
Godot.app/Contents/Resources/GodotSharp/Tools
、またはFinder上でGodot.appファイルを右クリックして、Show Package Contents(パッケージの内容を表示)
を選択することでContents/Resources/GodotSharp/Tools/
へナビゲートできます。
最後に、プロジェクトのルートディレクトリに以下の内容でnuget.configという新しいファイルを作成します:
<packageSources>
<!-- package source is additive -->
<add key="godot-nuget" value="./godot-nuget" />
</packageSources>
</configuration>
これは godot-nuget
ディレクトリを NuGet パッケージのパッケージソースとして設定します。これにより、NuGetパッケージレジストリから公式のGodot C#アセンブリを取得する代わりに、spine-godotランタイム用のC#バインディングが含まれているgodot-nuget
ディレクトリのアセンブリが使用されるようになります。
これで再びGodotでプロジェクトを開くと、GDScriptの代わりに、Godotおよびspine-godotのC# APIを使用することができます!
詳しくはGodot C#の公式ドキュメントをご覧ください。
spine-godotランタイムのアップデート
ご自身のプロジェクトのspine-godotランタイムをアップデートする前に、Spineエディターとランタイムのバージョン管理に関するガイドを参照してください。
最新のspine-godotランタイムへアップデートする準備ができたら:
- 上の
インストール
セクションから、使用するSpineランタイムとエディタのバージョンに対応した最新のビルド済みGodotエディタバイナリをダウンロードしてください。 - 同じく上の
インストール
セクションから、使用するSpineランタイムとエディタのバージョンに対応した最新のビルド済みGodotエクスポートテンプレートバイナリをダウンロードしてください。 - Godotエディタを開いて、
Editor > Manage export templates ...
と進み、Install from file
をクリックして、先ほどダウンロードした.tzp
ファイルを選択してエクスポートテンプレートをインストールします。 - Spineのメジャーバージョンを別のバージョンに切り替える場合は、SpineのエディターバージョンとSpineランタイムのバージョンを一致させてSpineプロジェクトを再エクスポートし、Godotプロジェクトで古いエクスポートファイルを置き換えます。Godot内でご自身のGodotプロジェクトを開くことで、更新されたファイルの再インポートを行うことができます。
- GodotでC#を使用している場合は、上記のように、エディタのダウンロードに含まれる
GodotSharp
ディレクトリから、プロジェクトのgodot-nuget/
ディレクトリに新しいアセンブリをコピーしてください。
あるいは、Spineに対応しているGodotエディタとエクスポートテンプレートを上記のようにコンパイルし、必要に応じてステップ4を実行することもできます。
spine-godotを使用する
spine-godotランタイムはGodotのためのカスタムC++モジュールで、Spineで作成されたアニメーションのロード、再生、操作をサポートします。spine-godotランタイムはC++で書かれており、汎用spine-cppランタイムをベースにしています。spine-godotランタイムは spine-cppのクラスと関数をラップして、GDScriptに公開しています。また、spine-cppのAPIのほとんどを公開することに加え、spine-godotランタイムはSpineスケルトンを簡単に表示し、インタラクトするためのGodotノードも提供します。
Spineランタイムのアーキテクチャの詳細については、Spineランタイムガイドをご覧ください。
アセットのマネージメント
Godot用にエクスポートする
以下の実行方法については、Spineユーザーガイド内で紹介されています :
スケルトンのデータとテクスチャアトラスをエクスポートすると、以下のファイルが得られます:
skeleton-name.spine-json
またはskeleton-name.skel
: これはスケルトンとアニメーションのデータを含んでいます。skeleton-name.atlas
: これはテクスチャアトラスの情報を含んでいます。- 1つまたは複数の
.png
ファイル: これはテクスチャアトラスの各ページで、スケルトンが使用するイメージを含んでいます。
注意: JSONエクスポートよりもバイナリ形式でのスケルトンエクスポートの方がサイズが小さく、読み込みが速いので、基本的にはそちらを選択したほうが良いでしょう。どうしてもJSONを使いたい場合は、ファイルの拡張子が
.json
ではなく.spine-json
になっていることを確認してください。既存のプロジェクトでまだ.json
エクスポート ファイルを使用している場合は、こちらの Pythonスクリプトを使用して、新しい拡張子.spine-json
に変換することができます。
spine-godotランタイムは、これらのファイルを特別なGodotリソースタイプにインポートすることができます。
注意: spine-godotランタイムは現在、Godot側の技術的な制限により、乗算済みアルファ(pre-multiplied alpha)を使用してエクスポートされたアトラスをサポートしていません。Godotはデフォルトで、事前乗算されていないテクスチャ画像に対してブリード処理を行います。これは通常、乗算済みアルファを使用することで修正されるアーティファクトを回避するのに十分なものです。
Godotへのインポート
- GodotプロジェクトをGodotエディタで開きます。
.skel/.spine-json
、.atlas
、.png
の各ファイルを任意のフォルダにドラッグしてください。
すると、アセットインポーターが、.skel
または .spine-json
スケルトンファイルごとに SpineSkeletonFileResource
を、.atlas
ごとに SpineAtlasAssetResource
を、.png
ファイルごとにGodotテクスチャリソースを作成します。
注意:
SpineAtlasResource
のインポート設定では、各アトラスページに使用する法線マップ(ノーマルマップ)画像の接頭辞を指定することもできます。デフォルトの接頭辞はn
です。法線マップはオプションですが、2Dライティングのサポートに必要です。
ソースファイルのインポートが完了したら、SpineSkeletonFileResource
と SpineAtlasResource
を組み合わせて、SpineSprite
で使用するSpineSkeletonDataResource
を作成することができます。
Godotエディタのファイルシステムパネルで、Spineアセットを配置したフォルダを右クリックし、New Resource...
を選択します。ポップアップダイアログで、SpineSkeletonDataResource
を選択し、Create
をクリックして、リソースに名前を付け、Save
をクリックします。
新しく作成したリソースをダブルクリックして、インスペクタパネルに表示されるようにします。先にインポートしたアトラスリソースとスケルトンファイルリソースをスケルトンに割り当てます。スケルトンデータリソースにはアニメーションのミックスタイムも保存されており、インスペクタで変更できます。
注意: 特定のスケルトンファイルとアトラスの組み合わせのためのスケルトンデータリソースは、その組み合わせを表示するすべての
SpineSprite
のインスタンスで共有される必要があります。ゲームに読み込まれるデータ量が重複してしまうので、スケルトンデータをSpineSprite
のインラインリソースとして定義しないでください。
Spineアセットの更新
開発中にスケルトンデータやテクスチャアトラスファイルを更新したい時は、単純にSpineエディターから再エクスポートを行なって、Godotプロジェクト内の既存のファイルを置き換えるだけで簡単にこれらのソースファイル(.spine-json
、.skel
、.atlas
、.png
)ファイルを更新できます。
Godotエディタはこれらのソースファイルへの変更を検出し、それに応じてアセットを再インポートし、その過程でこれらのアセットを参照している他のリソースを更新します。もしGodotエディタがソースファイルの変更を認識できない場合、Godotエディタ内のファイルのインポート設定パネルで強制的に再インポートすることができます。
ノード
spine-godotランタイムは、Spineからエクスポートされたスケルトンを表示したり、アニメーションさせたり、変更を加えるためのノード群を提供します。
SpineSpriteノード
SpineSprite
ノードはSkeletonDataResource
に格納されたスケルトンデータとアトラスを表示するノードです。このノードでは、スケルトンをアニメーションさせることができるAnimation stateを公開しています。SpineAnimationState
は、SpineSprite.get_animation_state()
で取得することができます。また、このノードは SpineSprite.get_skeleton()
でスケルトンインスタンス (SpineSkeleton
) を取得し、ボーンやスロット、アタッチメント、スキン、コンストレイントなどのプロパティを取得することができます。
SpineSpriteの作成
SpineSprite
ノードを作成するには、シーンパネルの +
ボタンをクリックし、 SpineSprite
を選択します。次に、SpineSprite
ノードが表示する SkeletonDataResource
を、上の画像のようにインスペクタの対応するプロパティに割り当てます。
Godotエディタのビューポートで各種ツールやキーボードショートカットを使って SpineSprite
ノードを自由に変形させることができます。 SpineSprite
のエディタ内のバウンディングボックス(境界)は、Spineエディターの設定モードでのスケルトンのバウンディングボックスに一致します。
ボーン、スロット、アタッチメントを確認する
SpineSprite
に SkeletonDataResource
を割り当てると、スケルトンのボーン、スロット、アタッチメントを確認することができます。
エディタビューポートで SpineSprite
を選択し、Debug
プロパティセクションで確認したいスケルトンコンポーネントにチェックを入れてください。
また、エディタビューポートで各パーツにマウスを乗せると、そのパーツ名が表示されます。
アニメーションのプレビュー
Preview
プロパティセクションでは、エディタビューポートですぐに再生されるアニメーションを設定することができます。
Preview Frame
をチェックすると、現在の Preview Time
におけるアニメーションフレームが表示されます。また、Preview Time
スライダでアニメーションをスクラブすることができます。
カスタムマテリアル設定
Materials
プロパティセクションでは、サポートされているSpineのブレンドモードごとにカスタムマテリアルを設定することができます。設定したマテリアルは、SpineSprite
のすべてのスロットとそのアタッチメントに適用されます。
単一のスロットにマテリアルを設定したい場合は SpineSlotNode
を使用することができます。これは SpineSprite
に設定されているカスタムマテリアルを上書きします。
詳しくはサンプルプロジェクト内の example/09-custom-material
シーンをご覧ください。
Update Mode設定
デフォルトでは SpineSprite
は毎フレーム、可能な限り高速にその基礎データを更新します。この挙動を変更するには、Update Mode
プロパティを変更します。
デフォルトは Process
モードで、これはフレームレートに依存します。Physics
モードは一定の間隔(デフォルトでは1秒間に60回)で SpineSprite
を更新し、Godotの物理エンジン関連のコードに有用です。Manual
モードは自動更新を全て無効にします。このモードでは、 _process(delta)
や _physics_process(delta)
をオーバーライドするときに SpineSprite.update_skeleton()
を呼び出して手動で SpineSprite
を更新する必要があります。このモードでは SpineSprite
がいつ更新されるかを完全にコントロールすることができます。
詳しくはGodotの公式ドキュメントの「Idle and Physics Processing」を参照してください。
SpineSprite
をアニメーションさせるには
SpineSprite
をアニメーションさせるには、GDScriptまたはC#を使ってコードで行います。以下では、GDScriptを使用したコード例を示しますが、 これはspine-godotのC# APIにも直接対応しています。GDScriptからC#へのAPIのマッピング方法の詳細については、GodotのC#ドキュメントを参照してください。
SpineSprite
は get_animation_state()
経由で SpineAnimationState
を公開しています。より詳細な情報、特にアニメーショントラックとアニメーションのキューイングについてはSpineランタイムガイドの「アニメーションの適用」を参照してください。
SpineSprite
のトラック0に特定のアニメーションを設定するには、以下のように SpineAnimationState.set_animation()
を呼び出します。:
func _ready():
var animation_state = get_animation_state()
animation_state.set_animation("walk", true, 0)
最初のパラメータはアニメーションの名前で、2つ目のパラメータはアニメーションをループするか否かを指定し、最後のパラメータはそのアニメーションが再生されるアニメーショントラックを指定します。
アニメーションのキューイングも、以下のようにAnimationStateメソッドで行います:
func _ready():
var animation_state = get_animation_state()
animation_state.set_animation("idle", true, 0)
animation_state.add_animation("walk", 0.5, true, 0)
add_animation()
の最初のパラメータはアニメーションの名前です。2つ目のパラメータはディレイを秒で指定します。このディレイの後にこのアニメーションがそのトラックの前のアニメーションを置き換えます。3つ目のパラメータはアニメーションをループするか否かを指定し、最後のパラメータはそのアニメーションが再生されるアニメーショントラックを指定します。
アニメーションステートのトラックにアニメーションを設定(set)または追加(add)すると、SpineTrackEntry
が返されます。これを利用して特定のアニメーションの再生のプロパティをさらに変更することができます。例えば、TrackEntryを以下のように設定することでそのアニメーションを逆再生することができます。:
track_entry.set_reverse(true)
注意:
SpineTrackEntry
インスタンスは、使用中の関数以外では保持しないでください。TrackEntryは内部で再利用されるため、それが表すアニメーションが完了すると無効になります。
以下のように set_empty_animation()
または add_empty_animation()
を使用してアニメーショントラックに空のアニメーションを設定したりキューに入れることで、スケルトンをスムーズにセットアップポーズに戻すことができます:
animation_state.add_empty_animation(0, 0.5, 0.5)
set_empty_animation()
の最初のパラメータはトラックを指定します。2つ目のパラメータは前のアニメーションをミックスアウトして「空(empty)」アニメーションをミックスインするのに使われるミックスデュレーションを秒単位で指定します。
add_empty_animation()
の最初のパラメータはトラックを指定します。2つ目のパラメータは前のアニメーションをミックスアウトして「空(empty)」アニメーションをミックスインするのに使われるミックスデュレーションを秒単位で指定します。3つ目のパラメータはディレイを秒単位で指定します。このディレイの後にミキシングによって前のアニメーションを「空(empty)」アニメーションに置き換えます。
単一のトラック上のすべてのアニメーションを直ちに消去するには、 clear_track(track_id)
を使用します。全てのトラックを一度に消去するには、clear_tracks()
を使用します。この場合、スケルトンが最後にとったポーズがそのまま残されます。
スケルトンのポーズをセットアップポーズにリセットするには、SpineSprite.get_skeleton().set_to_setup_pose()
を使います。これはボーンとスロットの両方をセットアップポーズの設定にリセットします。スロットだけをセットアップポーズの設定に戻したい時は、 SpineSprite.get_skeleton().set_slots_to_setup_pose()
を使用してください。
シグナル
SpineSprite
は、ライフサイクルを通してイベントに反応するために、複数のシグナルを公開しています。
アニメーションステートの変化に反応するために、以下のシグナルに接続することができます:
animation_started
: アニメーションが開始された時に発信されます。animation_interrupted
: アニメーションのトラックがクリアされたか、または新しいアニメーションが設定されたなどにより中断された時に発信されます。animation_completed
: トラック上のアニメーションが1ループを完了するごとに発信されます。animation_ended
: アニメーションが二度と適用されない時に発信されます。animation_disposed
: アニメーションのTrackEntryが破棄された時に発信されます。animation_event
: ユーザーが定義したイベントが発生した時に発信されます。
アニメーションステートのイベントに加えて、SpineSprite
はより高度なライフサイクルのためのシグナルも公開しています:
before_animation_state_update
: アニメーションステートが現在のデルタタイムで更新される前に発信されます。before_animation_state_apply
: アニメーションステートがスケルトンのポーズに適用される前に発信されます。before_world_transforms_change
: スケルトンのボーンのワールドトランスフォームが更新される前に発信されます。world_transforms_changed
: スケルトンのボーンのワールドトランスフォームが更新された後に発信されます。
これらのシグナルは、ボーンや他のスケルトンコンポーネントを手動で更新したいときに便利です。しかし一般的には、代わりに SpineBoneNode
や SpineSlotNode
を使用することをお勧めします。それらは、マウスカーソルの位置に基づいてボーンを配置するような使用例の99%をカバーしながらも、そのような手動更新の複雑さを軽減してくれるからです。
詳しくはサンプルプロジェクト内の example/02-animation-state-listeners
シーンをご覧ください。
スキンの組み合わせ
髪や目、パンツ、イヤリングやバッグなどのアクセサリーを組み合わせて、自分だけのアバターを作ることができるアプリケーションやゲームはよくあります。Spineでは、スキンを組み合わせることでこれを実現することができます。
他のスキンからカスタムスキンを作成するには、以下のようにします:
var data = get_skeleton().get_data()
custom_skin.add_skin(data.find_skin("skin-base"))
custom_skin.add_skin(data.find_skin("nose/short"))
custom_skin.add_skin(data.find_skin("eyelids/girly"))
custom_skin.add_skin(data.find_skin("eyes/violet"))
custom_skin.add_skin(data.find_skin("hair/brown"))
custom_skin.add_skin(data.find_skin("clothes/hoodie-orange"))
custom_skin.add_skin(data.find_skin("legs/pants-jeans"))
custom_skin.add_skin(data.find_skin("accessories/bag"))
custom_skin.add_skin(data.find_skin("accessories/hat-red-yellow"))
get_skeleton().set_skin(custom_skin)
get_skeleton().set_slots_to_setup_pose()
まずSpineSprite.new_skin(name)
でカスタムスキンを作成します。次に、SpineSprite
が管理しているSpineSkeleton
からSpineSkeletonData
を取得します。これはSpineSkeletonData.find_skin()
で名前を指定してスキンを探すために使用されます。そして SpineSkin.add_skin()
で結合したいスキンを全て追加します。最後に、 SpineSkeleton.set_skin()
でスケルトンに新しいスキンを設定します。
詳しくはサンプルプロジェクト内の example/03-mix-and-match
シーンをご覧ください。
ボーントランスフォームの取得と設定
SpineSprite
は、Spineのランタイムスケルトンをラップしたもので、ボーン、スロット、アタッチメント、コンストレイントから構成されています。スケルトンは、Spineエディタ上でスケルトンの原点を基準とした座標系で、ボーンのトランスフォームを管理します。
SpineSprite
クラスは、ヘルパーメソッド get_global_bone_transform(name)
および set_global_bone_transform(name, transform)
を公開しており、これらはGodotのキャンバス空間でボーンのトランスフォームを取得、設定できるようにします。取得または設定されたトランスフォームは、スキュー(skew)をエンコードしないことに注意してください。
ボーンのトランスフォームを手動で設定したい場合は、SpineSprite
がスケルトンのボーンのワールドトランスフォームを更新する前に行う必要があります。これは、 before_world_transforms_change
シグナルへ反応させることで行うことができます。
また、ボーンのトランスフォームを直接設定する代わりに、SpineBoneNode
を使用することができます。
SpineBoneNode
SpineBoneNode
は、スケルトンのボーンに追従(follow)させたり、そのトランスフォームを操作(drive)することができます。マウスの位置など、何らかの入力に基づいてボーンのトランスフォームを制御したい場合では、driveモードで SpineBoneNode
を使用します。CollisionShape
を SpineSprite
のボーンにアタッチしたい場合など、他のノードをスケルトンのボーンに追従させたい場合は、followモードで SpineBoneNode
を使用します。
SpineBoneNode
を作成するには、まずノードをアタッチしたい SpineSprite
を右クリックし、 Add child node...
を選択します。利用可能なノードタイプの一覧から SpineBoneNode
を選択し、名前を付けます。その後、インスペクタでノードの設定を変更することができます。
注意:
SpineBoneNode
は常にSpineSprite
の直接の子である必要があります。さもないと、追従または操作すべきボーンを見つけることができなくなってしまいます。
Bone Name
プロパティのドロップダウンには、選択可能なすべてのボーンが表示されます。Bone Mode
は、ノードが SpineSprite
のボーンに追従するか、それを操作するかを指定します。ノードは有効にも無効にもでき、必要に応じて追従と操作をオン・オフすることができます。
SpineBoneNode
は、エディタビューポートにも表示されます。Debug
セクションのプロパティで見た目を定義できます。
SpineBoneNode
を使って SpineSprite
内のボーンをマウスの動きで操作する例については example/05-mouse-following
シーンをご覧ください。
SpineBoneNode
を使って SpineSprite
のボーンを追従する例は example/06-bone-following
シーンをご覧ください。この例では、 SpineBoneNode
自体が子ノードを持ち、それが SpineSprite
のボーンを追っているように見えるでしょう。
注意: 子ノードは
SpineSprite
の描画順序には正しく挿入されません。SpineSprite
を構成するパーツの描画順序に任意のノードを挿入したい場合にはSpineSlotNode
が適しています。
SpineSlotNode
SpineSlotNode
を使うと、 SpineSprite
の描画順序に独自のノードを挿入することができます。これにより、パーティクルシステムやカスタムスプライト、他の SpineSprite
のノードをスケルトンの特定のスロットのアタッチメントとして使うことができます。SpineSlotNode
の子ノードは、そのスロットのアタッチメントがアクティブであれば、その上にレンダリングされます。また、SpineSlotNode
を使って特定のスロットのマテリアルをオーバーライドすることもできます。
SpineSlotNode
を作成するには、まずノードをアタッチしたい SpineSprite
を右クリックし、Add child node...
を選択します。利用可能なノードタイプの一覧から SpineSlotNode
を選択し、名前を付けます。その後、インスペクタでノードの設定を変更することができます。
注意:
SpineSlotNode
は常にSpineSprite
の直接の子である必要があります。さもないと、割り当てられたスロットを見つけることができなくなってしまいます。
Slot Name
プロパティのドロップダウンには、選択可能なすべてのスロットが表示されます。Materials
セクションでは、このスロットのデフォルトマテリアルを上書きするために使用するマテリアルを設定することができます。
SpineSlotNode
を使用して SpineSprite
の描画順序にノードを挿入する方法について詳しくは example/07-slot-node
シーンを参照してください。
SpineSlotNode
を使用して SpineSprite
の特定のスロットのマテリアルをオーバーライドする方法について詳しくは example/09-custom-material
シーンを参照してください。
SpineAnimationTrack
注意:
SpineAnimationTrack
は非常に実験的なものであることに注意してください。なぜなら、Godotのアニメーションエンジンはサードパーティのプラグインが、例えばインポートされた3Dキャラクターのアニメーションに見られるような完全な忠実度をサポートするほどオープンではないからです。
SpineAnimationTrack
ノードを使うと、GodotのAnimationPlayerや強力なアニメーションエディタを使って SpineSprite
をアニメーションさせることができます。コードで手作りするのではなく、Godotのアニメーションエディタを使ってカットシーンを作るのに適しています。
SpineAnimationTrack
を作成するには、まずノードをアタッチしたい SpineSprite
を右クリックし、 Add child node...
を選択します。利用可能なノードタイプの一覧から SpineAnimationTrack
を選択し、名前をつけます。その後、インスペクタでノードの設定を変更することができます。
注意: :
SpineAnimationTrack
は常にSpineSprite
の直接の子である必要があります。さもないと、割り当てられたスロットを見つけることができなくなってしまいます。
SpineAnimationTrack
を作成すると、AnimationPlayer
ノードが作成され、子ノードとしてアタッチされます。
SpineAnimationTrack
とその子である AnimationPlayer
をキーとして記録することで SpineSprite
のアニメーションが行われます。再生するアニメーションを設定するには、子AnimationPlayer
にキーを入力します。ループの可否や逆再生などのアニメーションのプロパティを変更するには、 SpineAnimationTrack
プロパティをキーにします。
この2段構えにより、アニメーションエディタが子AnimationPlayer
のキーとなるアニメーションのデュレーションを表示できるようになり、複雑なアニメーションシーケンスを簡単に作成できるようになっています。また、アニメーションエディタでタイムラインをスクラブしてプレビューすることも可能です。
注意:
SpineSkeletonDataResource
で定義されたSpineSprite
が使用するミックスタイムは、Godotアニメーションエディタの技術的制限により、エディタでプレビューすることができないことに注意してください。
単一の SpineSprite
に対して複数の SpineAnimationTrack
ノードをアタッチすることができます。これは複数のアニメーションを重ねるために使用できます。 SpineAnimationTrack
にはそれぞれトラックインデックスが設定されています。同じスケルトンプロパティをキーとする場合、上位トラックのアニメーションは下位トラックのアニメーションの効果を上書きします。
詳しくは example/08-animation-player
シーンをご覧ください。シーンのルートにアタッチされた AnimationPlayer
には SpineAnimationTrack
ノードとその子AnimationPlayer
ノードをキーにした2つのアニメーションがあります。slow-moonwalk
アニメーションは、SpineAnimationTrack
の基本的な原理を簡単に説明したものです。 cutscene
アニメーションはより凝ったアニメーションで、複数トラックのキーイングと複雑なアニメーションシーケンスを実演しています。
2Dライティング
spine-godotはGodotの2Dライティングシステムと統合されています。
Godotの2Dライティングシステムをサポートするためには、テクスチャアトラスの法線マップ(ノーマルマップ)を提供する必要があります。テクスチャアトラスページを構成する各 .png
は、ファイル階層でその隣に対応する .png
法線マップ画像を持たなければなりません。また、法線マップ画像ファイルは、共通の接頭辞を持つ必要があります。デフォルトの接頭辞は n_
です。例:raptor.png
というテクスチャアトラスページ画像は、その隣に n_raptor.png
という法線マップ画像を持つ必要があります。
テクスチャアトラスのインポート時に、spine-godotは各テクスチャアトラスページ画像に対して、法線マップ画像の検索とロードを試みます。テクスチャアトラスインポートビューで、独自の法線マップ画像の接頭辞を定義することができます。
テクスチャアトラスページと法線マップ画像が正常にインポートされたら、Godotの2Dライティングシステムを SpineSprite
ノードに適用することができます。
詳しくはサンプルの中の 10-2d-lighting
シーンをご覧ください。
SpineランタイムAPIアクセス
spine-godotは、SpineランタイムAPIのほとんどをGDSCriptにマッピングしています。SpineSprite.get_skeleton()
経由で SpineSprite
から返される SpineSkeleton
のようなオブジェクトは、spine-cpp APIをGDScriptに1対1で変換したものです。このため、Spineランタイムガイドに記載されている資料のほとんどをGDScriptに適用することができます。
しかし、GDScriptの性質上、以下のようにいくつかの制約があります:
- 返される配列やマップはすべて内部配列のコピーです。修正しても影響はありません。
- 個々の
SpineTrackEntry
オブジェクトにリスナーを設定することはできません。代わりにSpineSprite
にシグナルを設定します。 - ボーンやスロット、その他のSpineオブジェクトを直接作成、追加、削除することはできません。
- アタッチメントとタイムラインのC++クラス階層は、GDScriptでは公開されません。