ゲームプレイアクションを特定のアニメーションタイミングに同期するための良いテクニックは?


10

私が取り組んでいるゲームで問題に遭遇しましたが、それはおそらく多くのゲームで登場するかなり基本的なことのようです。

私のゲームでは、キャラクターアニメーションの特定の時点でゲームプレイ機能を実行する必要があります。そして、タイトルが示すように、ゲームプレイ関連のイベント/機能/アクションをキャラクターのアニメーションの特定のポイントに同期するためのいくつかの優れたテクニックと基本的な戦略は何なのかと思っています。

ここでは、さまざまな種類のゲームで私が話していることの簡単な例をいくつか示します。

  • あなたのキャラクターはシューティングゲームで彼らの銃をリロードします。キャラクターは「リロード」アニメーションを再生しますが、currentAmmo変数を設定する関数は、マガジンが交換されて銃がコックされた直後にのみ呼び出されることが重要ですこれは、リロードアニメーションの途中の可能性があります。

  • では、ターンベースのRPGあなたのキャラクターは敵のラインが直面しているラインに立ちます。攻撃するように命じられると、キャラクターの1人が敵の1人まで走ったりジャンプしたり、立っている場所に走ったりジャンプしたりする前に巨大な剣を斬ったりします。スラッシュアニメーションが再生される正確なタイミングで敵がダメージを受けていることを確認する必要があります。

  • ではステルスゲーム、あなたのキャラクターがこっそりすることができ、世界でコンピューターとボタンと対話します。多分あなたが浸透している前哨のライトへの電力供給をオフにするボタンがあるでしょう。アクションボタンを押すと、キャラクターが手を伸ばしてボタンを押し、アイドル状態に戻ります。ボタンが押されたときに、「push_button」アニメーションの正確なポイントでライトをオフにしたい。

確かに、私の特定のケースは2番目の例に最も似ています。この例では、攻撃中にターンベースのキャラクターが前方に突進するアニメーションを作成し、アニメーションが接触していると思われる瞬間にダメージを適用したいと考えています。 。私のゲームはターンベースのシステム(ファイナルファンタジーやファイアーエンブレムのようなものを想像してください)を使用しているので、ダメージ/ヒーリング/マジックなどが必要です。実際にコリジョン/ヒットボックスを使用していなくても、各キャラクターアニメーションの正しいタイミングで適用されます。

私は人気のあるゲームエンジンでゲームを作成していること、そして今はアニメーションイベントまたは通知を使用してこれを処理し、望ましい結果に近い何かを達成することを言及しなければなりません-キャラクターが特定のコマンドを実行してトリガーしますコマンド固有のアニメーション(つまり、「attack_command」)と各コマンドのアニメーションアセットには、アニメーションイベントを含める/キャラクターのExecuteCommand関数に「コールバック」を通知する必要があります。言い換えると、キャラクターは攻撃アニメーションに再生を指示し、攻撃アニメーションはダメージが与えられるべきアニメーションの正確な瞬間にイベント/通知コールバックをキャラクターに送信します。

正直なところ、これは今のところ機能しますが、ここでは全体像の一部が欠けているように感じられます。このメソッドが間違っていると感じる理由の1つは、ゲームロジックとアニメーションアセットを結合することです。アニメーションアセットにExecuteCommand()イベント/コールバックを含めるのを忘れた場合、コマンドは正しく実行されず、コマンドを実行せずにコマンドアニメーションが終了したかどうかを確認するには追加のコードが必要です。それは乱雑で、私のゲームプレイがそのアセットに奇妙な依存関係を持っていることを意味します。もちろん、攻撃アニメーションの特定の時点でダメージが発生するようにしたいのですが、アニメーションアセット内のゲームプレイコードを呼び出すのはとても変です。

だから私はここで見落としているものは何ですか?アニメーション中に特定の時間に特定の重要なゲームプレイアクションを発生させたい場合に、このようなタイプの状況を処理するための優れた一般的なテクニックは何ですか?

編集:明確にするために、これはエンジン固有の質問ではなく、エンジン固有の設計/手法も探していません。使用しているテクノロジーに関係なく、ゲームプロジェクトで使用できる一般的なアニメーション/ゲームプレイ同期手法に興味があります。


1
よくわかりません。ゲームプレイをアニメーションのタイミングに依存させたいが、ゲームプレイをアセットに依存させたくないと言い、アニメーションはアセットの一種です。あなたはそれらの願いがどのように両立することを期待していますか?
Anko

一部のゲームプレイ要素をアニメーションと同期させたい。ただし、2つの同期は必ずしも依存関係を意味するわけではありませんよね?私は、人々がアニメーションをゲームプレイと同期させるために使用するいくつかのテクニックに興味があります。私が試したこととこれを達成するために現在何をしているのかを述べました-そして私の質問は、人が使うかもしれない、またはこれである別の/より良い/代替の技術があるかどうかです(アニメーションイベント/通知/コールバックは資産)標準的な方法?これはプロジェクトで使用するものですか?
MrKatSwordfish 2015

回答:


5

同期をとるには、タイミングの権威者(コード、アニメーション、またはどちらでもない)を決定する必要があります。つまり、他の誰もが「ダンス」する「ビート」です。

さまざまな配置がさまざまなゲームに適しています。

  • アニメーションはタイミング機関です(現在の設定)

    ゲームコードがアニメーションをトリガーすることがあります。アニメーションが特定のポイントに達すると、ゲームコードが反応する可能性のあるイベント(たとえば、リロードの完了)が発生します(たとえば、使用可能な弾薬をリセットします)。

    アニメーションの正確なタイミング(ゲームの状態に関係なく)がゲームの重要な部分である場合、またはアニメーターにタイミングを制御させたい場合は、このアプローチを検討してください。

    アニメーションツールのBlender(3D)およびSpine(2D)を使用すると、アニメータはゲームコードがサブスクライブできるイベントを定義できます。

  • コードはタイミング機関です

    上記の逆:ゲームの世界で発生するイベント(たとえば、プレイヤーが武器をリロードすることを選択)により、アニメーションが実行され、パラメーターが渡されます(リロードが完了するまでの時間など)。各アニメーションは、指定されたパラメーターを使用して外観を変更します(たとえば、「リロードされた部分」が指定されたときに発生するような適切な速度でアニメーションを実行します)。

    アニメーションはゲームイベントをリッスンしている可能性もあり(たとえば、プレーヤーがリロードをキャンセルしたり、リロード中にプレーヤーがしゃがんだり)、それに応じて外観を変更します。

    アニメーションがタイミングについて柔軟である余裕がある場合、ゲームは手続き的に生成されたコンテンツに大きく依存します。または特にプログラマーにタイミングを制御させたい場合は、このアプローチを検討してください。

    Overgrowthのキャラクターアニメーションは、主にこのように構成されています。DavidRosenは、GDC 14の講演でそれについて説明しています(特に、 Movementおよび Movement Continuedセグメントを参照)。

  • 暗黙のタイミング(外部権限)

    リズムゲームや、タイミングが外部ソースから制御されているその他の状況(リズムゲームでは、音楽トラックのビート)では、そのようなものをモデル化することが理にかなっています。ゲームコードとアニメーションの両方がグローバルタイムスタンプとゲームの状態を読み取ることができ、通信することなくそれに応じて動作します。

    ゲームの状態とアニメーションが外部のタイミング機関に大きく依存している場合は、このアプローチを検討してください。

もちろん、ゲーム内のシステムごとに異なるアプローチを使用することもできます。(たとえば、リズムゲームは頻繁に曲のビートを外部の権限として使用しますが、アニメーションは依然としてプレーヤーのインタラクションイベントをリッスンして、保持されたノートの外観をキャンセルまたは変更します。)


0

ほとんどすべての計算問題は追加の抽象化レイヤーで解決できるとどこかで読んだことがありますが、あなたのケースが違うとは思えません。

この要件では、通常、キャラクターの状態を制御するレイヤーが表示されます。このようにして、キャラクターには現在のアニメーションと現在の状態があります。それぞれに責任があります。

アニメーションはビジュアルのみを担当し、状態はそのアクションのゲーム固有のロジックを処理します。

私の格闘ゲームでは、状態はBaseStateクラスから継承し、Update()メソッドを持つオブジェクトです。各キャラクターには状態のコレクションがありますが、一度に割り当てられるのは1つだけです。また、現在の状態のUpdate()メソッドは、フレームごとに1回呼び出されます。

これは、私がすべてのロジックを実行する状態のUpdate()内にあります。特定のフレームでのキャラクターの速度の設定、ヘルスの増減などです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.