Unreal Engine 4 で、究極のゲーム試作の記録です。
マイルストーンとして、補題:追うものと追われるもの、に取り組むための準備です。
思考と作業の記録をざっと書いた草稿です。ご感想などあれば、どうぞ。
・Interaction
今回は、Interaction の基礎を設計実装しました。
UE4 は、Actor がInteraction の基本単位です。
まずはItem を実装しました。
Item とは、Player (AI 含む)が触って、Player の状態を物理的に、あるいは精神的に変化させるものです。Item には、何回も使えるものと消耗するものがあります。
実際に in-game で使うクラスは、Class Blueprint で実現します。
Blueprint のクラスは、C++ の基底クラスを継承して実現します。
具体的には、ConsumableItemActor を継承して、Class Blueprint で、具象クラス Apple を実現しました。
家庭用ゲーム機器での Real-Time Game 実装では、クラスの継承および仮想関数(virtual functions)をできるだけ使わないのが望ましいです。理由は、速度およびメモリです。
そのため、クラスではなく、列挙型で型を宣言する、などして工夫します。
しかしながら、動くもの、動かないものなど、3D 空間上のあらゆるものと相互作用できる設計にしたい場合、プロトタイプ型言語、Component Based Architecture が求められます。詳細は、参考文献 [5]をどうぞ。
今後、家庭用ゲーム機器の性能が向上していけば、実現できると思います。
今回は、次世代ゲーム機器を夢見て、理想的な構造にしましたw
(ハイエンドをやるための布石です。)
具象クラスで、相互作用の振る舞いを実装しました。
virtual void ConsumableItemActor::Interact(APawn* InteractedPawn) override;
今回は、最近傍のみとしました。発展は、空間分割です。
具体的には、下記のようなコードにしました。
図 今回の試作。Player (AI) が赤の球体(Apple とみなす)と相互作用するまで
緑の軌跡に沿って、Player は移動します。
次回は、りんごの振る舞いの多面体を考えて実装してみます。
マイルストーンとして、補題:追うものと追われるもの、に取り組むための準備です。
思考と作業の記録をざっと書いた草稿です。ご感想などあれば、どうぞ。
はじめに
Game Engine のツボの探し方を書いておきます。
最近のEngine は、広大です。ドキュメントを読んでいても、ぼんやりとするだけで、なかなかアウトプットに手が動きません。
そこで、ゲームを作るのに必要な最小限の要素を探して、その実現方法を手を動かしながら、進めていくやり方を考えます。手を動かしながらアウトプットにつながる良いやり方です。これなら、Unreal Engine だけでなく、Cry Engine (今は、Lumberyard)、Unity、Frostbite、内製、どんな環境でも、やっていけますw
Game Engine で、3つの I を実現する方法を探す(How to)
- Input
- Interaction
- Interface (UI)
Input (and Output)
ゲームを遊ぶPlayer からの入力を検出する方法、それに対してPlayer をどうやって動かすか
ゲームを遊ぶPlayer からの入力に対する出力の方法、画面にどうやって描画するか
入力は、デバイス(peripheral device)を想定しています。
Interaction
相互作用の方法、Player と ゲーム世界をどうやって相互作用させるか
具体的には、衝突検出と応答(Collision and Physics), メッセージ(Event Dispatch)
e.g., レベルとの相互作用、アイテムや武器との相互作用、AI との相互作用
Interface (User Interface / HUD)
ゲームを遊ぶPlayer への情報提示をどうやって実現するか(HUD)
ゲームを遊ぶPlayer からの入力とその応答をどうやって実現するか(UI)
UE4 で、それら3つのI を実現する方法を実際に作りながら、理解していきます。
今回は、Interaction の基礎を設計実装した記録です。
Coffee break - 3 つのI をどうやって決めたか
そもそも、ビデオゲームとはなんぞや、に回帰してみると、何が重要かがわかります。
ビデオゲームとは何か
1970年代から勃興してきた、Computer を使う、まだまだ新しい遊戯です。
https://en.wikipedia.org/wiki/Pong
入力機器は、喜びの棒(Joy-Stick), マウスとキーボード、など
出力機器は、テレビ、ビデオ、ディスプレイ、スピーカー、など
Computer が、ゲームのプログラムを実行して、プレイヤーは、入力と出力のフィードバックを楽しみます。
Player - Input Devices - Computer - Output Devices - Player
という正負の feedback loop 構造で、Player は、Output に応じて、Input を変えて、五感を使って、その変化を楽しみます。これは、多変量の非線形システムとも解釈できますね。
つまり、Game loop = Interaction なわけです。(強引ですw)
Interaction の設計
閑話休題。Game loop を構築するために必要な Interaction の項目を実装します。
・UI / HUD (この記事では詳細は省略します。作り方は、参考文献 [6] をどうぞ)・Interaction
今回は、Interaction の基礎を設計実装しました。
UE4 は、Actor がInteraction の基本単位です。
まずはItem を実装しました。
Item とは、Player (AI 含む)が触って、Player の状態を物理的に、あるいは精神的に変化させるものです。Item には、何回も使えるものと消耗するものがあります。
構造(Class)
InteractingActor - ItemActor - ConsumableItemActor - Apple実際に in-game で使うクラスは、Class Blueprint で実現します。
Blueprint のクラスは、C++ の基底クラスを継承して実現します。
具体的には、ConsumableItemActor を継承して、Class Blueprint で、具象クラス Apple を実現しました。
図 Interaction クラス図
家庭用ゲーム機器での Real-Time Game 実装では、クラスの継承および仮想関数(virtual functions)をできるだけ使わないのが望ましいです。理由は、速度およびメモリです。
そのため、クラスではなく、列挙型で型を宣言する、などして工夫します。
しかしながら、動くもの、動かないものなど、3D 空間上のあらゆるものと相互作用できる設計にしたい場合、プロトタイプ型言語、Component Based Architecture が求められます。詳細は、参考文献 [5]をどうぞ。
今後、家庭用ゲーム機器の性能が向上していけば、実現できると思います。
今回は、次世代ゲーム機器を夢見て、理想的な構造にしましたw
(ハイエンドをやるための布石です。)
Coffee break - Blueprint を使う理由
ゲームの試作では、仕様がばりばり激しく変化します。そのため、クラスを変更して、結果がすぐ確認できる、スクリプトが適しています。UE4 では、スクリプトに相当するのが、Blueprint です。本音は、Gaffer のような、Visual Python が良いですw振る舞い
InteractingActor は、Pawn (目に見えて触れる Geometry, Mesh を持つ) と相互作用します。
相互作用のインターフェイス
virtual void InteractingActor::Interact(APawn* InteractedPawn);
Pawn クラスを引数にとるのは、Player が3D 空間の Level で必要な情報を保持するのが、Character クラスであり、Character クラスの基底が、Pawn クラスだからです。
UE4 Gameplay Framework の都合ですw具象クラスで、相互作用の振る舞いを実装しました。
virtual void ConsumableItemActor::Interact(APawn* InteractedPawn) override;
Level で Player (AI) が、相互作用できるアクタ (InteractingActor) を探す方法
PlayerCharacter クラス(ACharacter クラスから派生)で、毎フレーム実行する更新関数 Tick() 内で、Ray Casting して、近傍の相互作用できるアクタ(InteractingActor から派生したクラスのインスタンス)を探します。今回は、最近傍のみとしました。発展は、空間分割です。
具体的には、下記のようなコードにしました。
void APlayerCharacter::InteractImpl( const FVector& viewLocation, const FRotator& viewRotation) { // 視界内で、相互作用できるアクタを探します AInteractingActor* FoundInteractingActor = nullptr; if(FindInteractingActorInView(&FoundInteractingActor, viewLocation, viewRotation)) { // 相互作用アクタの種類に応じて、振る舞いが決まります FoundInteractingActor->Interact(this); } }
スクリーンショット
緑の軌跡に沿って、Player は移動します。
次回は、りんごの振る舞いの多面体を考えて実装してみます。
今回は、暗黙のうちに食べるだけでしたが、投げる、焼く、育てるなどいろいろな作用が考えられます。
その他、Player が持つ銃、AI とのInteraction を設計実装してみます。
https://docs.unrealengine.com/latest/INT/Gameplay/Framework/index.html
[2] Entry Level Guide to UE4 C++
https://wiki.unrealengine.com/Entry_Level_Guide_to_UE4_C%2B%2B
[3] Unreal Engine 4 Programming API Fundamentals
http://www.gamasutra.com/blogs/DanielAdamitskiy/20150112/233926/Unreal_Engine_4_Programming_API_Fundamentals.php
[4] りんご
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B4
[5] A Dynamic Component Architecture for High Performance Gameplay
http://www.insomniacgames.com/a-dynamic-component-architecture-for-high-performance-gameplay/
[6] User Interface With UMG
https://docs.unrealengine.com/latest/INT/Programming/Tutorials/UMG/index.html
参考文献
[1] Gameplay Frameworkhttps://docs.unrealengine.com/latest/INT/Gameplay/Framework/index.html
[2] Entry Level Guide to UE4 C++
https://wiki.unrealengine.com/Entry_Level_Guide_to_UE4_C%2B%2B
[3] Unreal Engine 4 Programming API Fundamentals
http://www.gamasutra.com/blogs/DanielAdamitskiy/20150112/233926/Unreal_Engine_4_Programming_API_Fundamentals.php
[4] りんご
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B4
[5] A Dynamic Component Architecture for High Performance Gameplay
http://www.insomniacgames.com/a-dynamic-component-architecture-for-high-performance-gameplay/
[6] User Interface With UMG
https://docs.unrealengine.com/latest/INT/Programming/Tutorials/UMG/index.html
コメント
コメントを投稿