UE4の勉強記録

UE4の勉強の記録です。個人用です。

12章12節 GameplayTags API –GameplayTagsをアクターに付ける Part 2

<前文>

f:id:kazuhironagai77:20190210122704p:plain

突然ですが、3Dグラフィックと一般人を繋ぐ技術に大きなビジネスチャンスがあると考えています。3Dグラフィックは仮想空間に現実と同じ寸法の物体を作成する技術として他に代える事の出来ない素晴らしい技術です。更にUE4に代表されるリアルタイムのフォトレンダリングは、信じられないレベルでの写実的な美しさをリアルタイムで提供してくれます。しかしこれらの技術は2Dのように直観で使用する事は出来ません。結果、一般人には使用出来ない眠った技術になっています。そこでこのギャップを埋める技術を開発すれば、一般人も3Dグラフィックの恩恵を受けられるので沢山の人が使用するはずです。これ以上はここには詳しく書きませんが、具体的なアイデアがあります。そのうちの一つは2.5Dグラフィックと仮に言っています。限定された3Dですが、2Dと同じように直観で操作出来るはずです。今年中に作成してみようと思ってます。

<本文>

GameplayTags APIを勉強します。前回、教科書のレシピを終了しましたが、何だか良く分からない状態で終わってしまいました。結論はこの本でGameplayTagの勉強をしても良く分からない。他のチュートリアルで勉強する必要があります。となってしまいますが、それはそれでしょうがないです。しかし前回はGameplayAbilityの中のGameplayTagとして勉強している事に気が付きました。ひょっとするとこの教科書が説明しているGameplayTagは、GameplayAbilityから独立している場合の可能性もあるのかな?と考えちょっとだけ他のチュートリアルも試してみようと思います。

<目的>

GameplayTags API を使用してGameplayTagsをアクターに付けます。前回はこのレシピを実行しました。コードを総て実装しましたが、playをしても何の変化も起きず出来ているのかどうか確認出来ません。この確認する方法を他のチュートリアルを実行する事で発見したいです。

<他のチュートリアル

いつもお世話になっている以下のサイトですが、全てGameplayAbilityを使用する中でどのようにGameplayTagsを使用する観点から説明されています。ので今回は別なチュートリアルを探してみます。

公式サイトからの情報です。

Gameplay Abilities in Action RPG

Gameplay Ability System

GameplayAbilities and You (Unreal Wiki)

Action RPG | Project Spotlight | Unreal Engine Livestream

(日本語)

猫でも分かる UE4の新しいサンプル「Action RPG」について(p77~)

公式サイト以外でGameplay Ability Systemについて述べたサイト。

Tom Looman氏による解説

       ・Tutorial: Creating a RAGE Potion in Epic’s Action RPG

       ・Gameplay Ability System Tutorial with C++ & Blueprint [Unreal Engine 4 RPG Game]

SabreDartStudiosによる解説

       ・Intro to Gameplay Abilities in Unreal Engine 4

Unreal Sydneyによる解説

       ・Intro to the Unreal Engine Gameplay Abilities Module - Unreal Sydney Meetup

(日本語)

おかわりはくまい氏による解説

       ・GameplayAbilitiesの使い方(セットアップ編)

以下のチュートリアルが見つかりました。

公式のサイトからの情報です。

Gameplay Tags

Using Gameplay Tags to Label and Organize Your Content in UE4

日本語のサイト

Gameplay Tag を使ってコンテンツをラベル付けして整理する

公式以外のサイト

Using GameplayTags

WTF Is? Gameplay Tags in Unreal Engine 4

日本語のサイト

UE4 Gameplay Tagを使ってゲームプレイ時のタグ管理をより扱いやすくする

もっと探せばありそうですが、Using GameplayTagsを読んでいたら「これが教科書のチュートリアルのやりたかった事じゃないの。」という気がしてきました。のでUsing GameplayTagsをやってみます。

<方法>

Using GameplayTagsをやります。もしUsing GameplayTagsの方法でC++からアクターにgameplayTagを表示する事が出来たら、前回行ったレシピと比較し足りなかった個所を勉強し直します。

Step.0

このチュートリアル2016年の9月に書かれてたとあるのでちょっと古い可能性があります。そのままでは出来ない場合や必要のない手順を踏んでいる場合もあるかもしれませんが取りあえずは書いてある通りにやってみます。

Step.1:何故Tagを使用するのか?

Tagを使用すると便利な具体的な例が述べられていますが、使用方法にはあまり関係ないのでスキップします。

Step.2:TagGameplayTagの違い?

最初から気になっている箇所の説明がありました。昔BPの勉強をしていた時アクターにtagを付けた事があったような気がしていたのですが、それとGameplayTagはどう違うのかが分かり易く説明されていました。ただこの時期からGameplayTagは更に進化している可能性もあるのでここに書かれている事だけがではないかもしれません。

Step.3:Tagの使い方

Tagは使用しないのでスキップします。

Step.4:GameplayTagの使い方

ここから、本格的に始まります。

f:id:kazuhironagai77:20190303151539p:plain

GameplayTagを使用するために、DefaultEngine.Iniを開いて以下のコードを追加してください。

うーん。いきなり違う事している。Step.0でここに書かれている通りのやると宣言しましたが、ここまで違うとちょっと躊躇してしまいます。どうしようか迷っていたら、公式サイトのGameplay TagsでProject settingからGameplayTagを開いていてそこに以下に示すようなイメージが表示されています。

f:id:kazuhironagai77:20190303151627p:plain

ひょっとすると最新のversionのUE4(4.22.0 preview 3)は既にこの設定になっているかもしれません。

新しいprojectを作成します。名前はUsingGameplayTagsとします。C++で Third Person を選択しました。そしてProject settingからGameplayTagを開いたら既にチェックされていますね。

f:id:kazuhironagai77:20190303151659p:plain

やった。加えなくていいや。と思いつつも、一応、DefaultEngine.Iniも確認してみました。

f:id:kazuhironagai77:20190303151716p:plain

[GameplayTags]

ImportTagsFromConfig=true

は書いてなかったです。

別にDefaultEngine.Iniに書いてなくてもProject settingからGameplayTagからチェックしたのだから良いと思うのですが、昔どこかで「C++から動かす場合は.iniにもコードを追加する必要がある。」みたいな文章を読んだ気がするのです。のでちょっとだけ.iniとC++について調べて見ます。

そんな文章は見つからなかったです。

チュートリアルの次の文に

f:id:kazuhironagai77:20190303151812p:plain

そしたらエディターをもう一度開いた後に、Project Setting->Gameplay Tagsに行けます。

と書かれています。と言う事は、何もしなくてもProject Setting->Gameplay Tagsに行けている現在のversionは[GameplayTags] ImportTagsFromConfig=trueを加えなくてもいいのでしょう。

この後、GameplayTagについての現状などについての説明をして、新しいactorクラスを作成しています。今回のprojectはThird Person templateを使用しているのでactorクラスから新しいactorを制作しないでそれをそのまま使用します。

Step.5:Build.cs fileの調節

Build.csに"GameplayTags"を追加してくださいと書かれていました。これは当然ですので加えます。

f:id:kazuhironagai77:20190303151937p:plain

Step.6: GameplayTag Interfaceを追加

f:id:kazuhironagai77:20190303152002p:plain

とあります。こんなの追加したかな?と思って前回のレシピを見てみるとアクタークラスに対して何もしていませんでした。これが必要なのかもしれません。

f:id:kazuhironagai77:20190303152021p:plain

f:id:kazuhironagai77:20190303152029p:plain

をAUsingGameplayTagsCharacterクラスに追加しました。

ビルドすると、

f:id:kazuhironagai77:20190303152057p:plain

アブストラクトクラスのインスタンス化は出来ません。

とエラーになってしまいました。

何かのvirtualな関数がIGameplayTagAssetInterfaceにあってそれをoverrideしないといけないのかなと思ってチュートリアルの先を読むと、案の定GetOwnedGameplayTags()関数をオーバーライドしています。ので先に進みます。

Step.6: GameplayTag の変数を作成

以下に示すコードを加えろと書いています。

f:id:kazuhironagai77:20190303152224p:plain

アクタークラスに追加すればいいんでしょうか?

f:id:kazuhironagai77:20190303152246p:plain

追加しました。取りあえずpublicの所に追加しました。

そしてさっきの関数、GetOwnedGameplayTags()を追加します。

f:id:kazuhironagai77:20190303152304p:plain

これもpublicに追加しました。これでいいのかなと思ってチュートリアルの先を読んだら、actor.hの全コードが載っていて正しい事が確認出来ました。

今度はビルド出来るでしょうか?

f:id:kazuhironagai77:20190303152327p:plain

出来ました。がエディターからコンパイルしたらエディターがクラッシュしました。

f:id:kazuhironagai77:20190303152347p:plain

これがエラーを吐いているようです。この後のアクタークラスからBPを作成して…とチュートリアルでも書かれているので、ここは、もう一度普通のprojectでやり直します。

名前はUsingGameplayTags2とします。

アクター名はそのままでMyActorです。

f:id:kazuhironagai77:20190303152446p:plain

f:id:kazuhironagai77:20190303152453p:plain

今度はビルドもコンパイルも上手く行きました。

<結果>

Step.6: GameplayTagsの追加

f:id:kazuhironagai77:20190303152541p:plain

C++クラスからBPを作成してそれを開いて下さい。

はい。

f:id:kazuhironagai77:20190303152618p:plain

f:id:kazuhironagai77:20190303152625p:plain

ここを選択すると、

f:id:kazuhironagai77:20190303152641p:plain

ここからGameplayTagが追加出来ます。

うーん。なるほど。GameplayTagが何なのかは理解出来ました。

<考察>

GameplayTagをactorから使えるようにするには、教科書のやり方ではなく、Using GameplayTagsに紹介されているやり方が必要です。しかしUsing GameplayTagsのやり方は結局、アクタークラスにFGameplayTagContainerクラスからの変数を作成してそこに、GameplayTagを保持させるという、あえてチュートリアルで説明する必要あるの?と言いたくなるくらいの簡単な方法です。前回はGameplayTagそのものが理解出来ていなかったので、かしこまって聞いていましたが、要するにGameplayTagは沢山のboolean変数をひとまとめにして一括で管理しているだけでしょう。だったら、Using GameplayTagsのやり方でいいような気がしますが。

教科書のレシピの方法は、GameplayAbilityの中でのGameplayTagの使用方法としては普通なんでしょうか?サラッと勉強しただけですが何か独特な感じがします。建設的に言えば、この書き方を知っておくと後で色々得になりそうです。