46.GameInstanceとは? レベルを跨いで変数を保持してみよう
「GameInstance」というブループリントクラスとは?
https://scrapbox.io/files/65c5dc1ab2fc69002426b137.png
GameInstanceは全レベルで存在し続ける永続的なブループリントクラスになります。変数のデータはレベルを跨ぐとリセットされますが、GameInstance内で作成すると変数はリセットされません。つまりGameInstanceはレベルが切り替わっても残り続けるので、変数のデータも一緒に保持する事ができます。
https://scrapbox.io/files/65c5dcba952d660024a94098.png
GameInstanceは主にレベルを跨いで変数を保持したい時に使用します。例えばステージが複数あり、HPやスコアやコイン枚数とかの変数データをレベルを切り替えても保持したい場合、GameInstanceを使用して実装します。
🐱ではここから実践としてGameInstanceを使ってみましょう。
今回実装する機能↓
https://youtu.be/MGkB7p9_cd8
Enterキーを押すとGameInstanceに保存したHP変数を10減らして表示します。レベルを切り替えて、再度Enterキーを押すとHPはリセットされずに続きから10減って表示されます。イメージです↓
🐱ではGameInstanceを使用してレベルを跨いで保持させる変数を作っていきましょう!
HPの変数をレベルを跨いで保持してみよう|実践]
今回サードパーソンのプロジェクトを使用します。
https://scrapbox.io/files/65c5dee5d195200024d2be15.png
Blueprintsフォルダを用意して右クリック > ブループリントクラス > 全てのクラスでgameinstanceと検索 > GameInstanceを選択 > 名前をMyGameInstanceにします。
https://scrapbox.io/files/65c5df1b9b5ea20026e5b6b6.png
HPという名前でInteger型の変数を作成します。
https://scrapbox.io/files/65c5df7ead0f7e00244ea15d.png
コンパイルしてHPのデフォルト値を100にしておきます。
https://scrapbox.io/files/65c5dfc2c68f930025362d7d.png
🐱これで変数をGameInstanceで作れました。この変数HPはレベルを跨いでもリセットされません。ではGameInsntaceはプロジェクト設定にセットする事でゲームで使用できるので、設定していきましょう。
プロジェクト設定を開いてマップ&モードの項目にある一番下のGameInstanceの項目をMyGameInstanceにします。
https://scrapbox.io/files/65c5e05b014b510023d8028b.png
これでMyGameInstanceが全レベルに永続的に存在するようになりました。プロジェクト設定は閉じます。
そしたらHPを変更する処理を作っていきます。
BP_ThirdPersonCharacterを開きます。
https://scrapbox.io/files/65c5e0eaad0f7e00244eb410.png
既存のノードは無視してしてもらって、まずは以下のノードを追加します。Enterキーノード(Enter キーと検索すると出てきます)から、GetGameInstanceノード、CastTo"My"GameInstanceを作成します。
https://scrapbox.io/files/65c5e15d48287800232184d5.png
ノード解説
GetGameInstanceノードで、プロジェクト設定にセットしてあるGameInstanceを取得する事ができます。CastToノードでMyGameInstanceのHP変数にアクセスする事で、GetやSetが可能になります。
CastToMyGameInstanceノードから以下のノードを作成します。まずGetHPでゲームインスタンスからHPを取得します。GetHPから「-」と検索して減算(substract)ノードを作成し10を引きます。 その後ゲームインスタンスのHPにセットします。
https://scrapbox.io/files/65c5e1a0952d660024a9a8d9.png
その後ゲームインスタンスのHPにセットします。最後にPrintStringで表示させます。Appendノードで「現在のHP : 」というテキストを結合させておきます。
https://scrapbox.io/files/65c5e1e394f1fc0026d87ab0.png
一旦プレイしてみてEnterキーを押してみましょう。HPが-10されて表示されます。
https://scrapbox.io/files/65c5e1ffd1e3f6002595fd71.gif
全体ノード解説
https://scrapbox.io/files/65c5e99941a1610025f29913.png
GameInstanceのHPを取得、変更して再度GameInstanceのHPにセットしている流れになります。
🐱ではレベルを追加していきます。
ファイル > 新規レベル > Basicを選択して作成します。
https://scrapbox.io/files/65c5e244a748fa0025b435ed.png
空のレベルが開きます。
Ctrl+Alt+Sで名前を付けてレベルを保存します。名前は「NewMap」そのままにします。保存場所はどこでもよいです。
https://scrapbox.io/files/65c5e280e530ab0023e3b9be.png
レベルはThirdPersonの方を開いておきます。
ここからレベルを切り替える処理を作っていきます。再度、BP_ThirdPersonCharacterを開きます。
以下のノードを追加します。「1 キー(key)」と検索して1と2キーのイベントを作成して、それぞれOpenLevelノードを作成します。名前も「ThirdPersonMap」「NewMap」を割り当てておきましょう。
https://scrapbox.io/files/65c5e30b4fc4a4002589888a.png
これでレベルを切り替える処理が実装できました。
これでプレイしてみましょう。Enterキーを押してHPを減らした後、1また2キーでレベルを切り替えます。その後再度Enterキーを押すとHP途中から減らされて表示されます。
https://youtu.be/MGkB7p9_cd8