ハイスコア処理!(ハイスコア判定の方法!)

例えば、

1回目のプレイで、ゴールに10秒で着いたとする。

2回目のプレイで、ゴールに5秒で着いたら、10秒よりも早く着いたから「ハイスコア」ということになる。

 

今回はその

 

ハイスコア判定の方法

 

を紹介する。

 

「BP_Goal」を開こう。

変数を用意。

f:id:Free_Gamer:20180904214151p:plain

StageIDは、前回の記事で説明したから割愛。

SaveSlotNameArrayは、String型の配列変数だ。

 

デフォルト値は以下の通りに。

値(文字)は、個人の自由でいい。

ただ、この配列内の文字は「各ステージごとの名称」を表しているという事だけは言っておく。

f:id:Free_Gamer:20180904214324p:plain

 

イベントグラフ

f:id:Free_Gamer:20180903195927p:plain

BP_GoalのBoxコリジョンにオーバーラップしたら、まずこのステージのハイスコアを保存したセーブデータががあるかどうかを確認する。

f:id:Free_Gamer:20180904214843p:plain

DoesSaveGameExistノードは、SlotName名と一致するセーブデータが存在するかどうかを確認するためのノードだ。

存在していればTrue。存在してなければFalseを返す。

f:id:Free_Gamer:20180905182207p:plain

 

例えば、現在のステージが「Stage1」なら

f:id:Free_Gamer:20180904215210p:plain

SaveSlotNameArray内の、Index「0」にある「Stage1」という名のセーブデータがあるかどうかを確認する。といった感じだ。

 

なぜIndex「0」なのか??

「Stage1」のレベルBPで、StageIDが「0」にセットされてるからだ。

f:id:Free_Gamer:20180904181247p:plain

↓前回の記事でも書いたが、

f:id:Free_Gamer:20180904220012p:plain

StageIDは、「現在のステージがいくつ目なのかを示すための変数だ」ということ。

 

つまり、

 

現在プレイしているステージが「Stage1(StageID『0』)」なら、SaveSlotNameArray内のIndex「0」にある「Stage1」という名ののセーブデータがあるかどうかを確認する。

 

という流れだ。

 

「Stage1(StageID『0』)」の

f:id:Free_Gamer:20180905181324p:plain

 セーブデータがあるかを確認する。

f:id:Free_Gamer:20180904215451p:plain

 

だが初回プレイ、つまり1回目のプレイだから普通はセーブデータが存在しない。

だから、DoesSaveGameExistノードによって処理はFalseに流れる。

 

セーブデータが存在しなかった場合の処理

Sequenceノードで順番に処理を行っている。

f:id:Free_Gamer:20180905182724p:plain

 Then0・・・CreatSaveGameObjectノードで現在プレイしているステージのセーブデータを作成

f:id:Free_Gamer:20180905182852p:plain

 Then1・・・「MyGameInstance」から「分」と「秒」を参照。それを「SaveMinute」と「SaveSecond」に格納

f:id:Free_Gamer:20180905182947p:plain

 Then2・・・「MyGameInstance」の「分」と「秒」をハイスコア用の配列に格納

f:id:Free_Gamer:20180905200954p:plain

Then3・・・最後にセーブ。これで現在のスコアとハイスコアの保存が出来た。

f:id:Free_Gamer:20180905201205p:plain

 

2回目以降のプレイ。つまり現在のステージのセーブデータが存在してる場合の処理。ここでもSequenceで順番に処理を行っている。

f:id:Free_Gamer:20180905201331p:plain

Then0・・・現在のステージのセーブデータをロードし、それを変数に格納

f:id:Free_Gamer:20180905201454p:plain

Then1・・・現在クリアーしたタイムを変数に格納

f:id:Free_Gamer:20180905182947p:plain

下のセーブデータが存在しなかった場合の処理に無理やり繋げている。

f:id:Free_Gamer:20180905203529p:plain

Then2・・・ハイスコア判定。

「MyGameInstance(現在クリアーした時点でのタイム)」のスコアと「SaveScore」のハイスコアを比較。

「MyGameInstance」のタイムの方がハイスコアよりも早い場合、処理はTrueに流れる。

逆に、「MyGameInstance」のスコアがハイスコアよりも遅い場合はFalseに。

f:id:Free_Gamer:20180905201825p:plain

例えば、1回目のプレイを10秒でクリアーしたとする。

2回目のプレイを5秒でクリアーしたらハイスコア。(True)

逆に10秒よりも遅い20秒とかでクリアーした場合、ハイスコアではない。(False)となる。

ハイスコアだった場合Trueに処理が流れ、現在のスコアをハイスコアとして配列に上書きする。

ハイスコアじゃない場合は何もない。

f:id:Free_Gamer:20180905203657p:plain

Then3・・・セーブ。

f:id:Free_Gamer:20180905203845p:plain

 

これでプレイしてみよう。

まず1回目のプレイ。セーブデータが存在していない場合の処理

youtu.be

10秒でクリアーした。

分かりやすく左上に「クリアー!」という文字が出ているはずだ。

この時点で、10秒というスコアがハイスコアとして保存された。

 

2回目以降のプレイ。

15秒でクリアーしてみる。

 youtu.be

左上に「ハイスコアではない!」という文字が出てきたはずだ。

 

今度は8秒でクリアーしてみる。

youtu.be

左上に「ハイスコア!」と表示されていたはずだ。

この時点で、前回の「10秒」というハイスコアが「8秒」に上書きされた。

しっかりハイスコア判定がされているのが分かった。

 

かなり長くなってしまった為雑な説明があるかもしれない。

その際はぜひともコメント等で言ってほしい。

 

次回は、今回の引き続きのようなものだ。

 

それではまた!^^ノシ

ハイスコア処理の方法!(下準備)

今回やる事は、

 

ステージ制のゲームでのハイスコア処理

 

だ。

 

ゲーム内容としては、

 

スタート地点からゴール地点まで、何秒でたどり着けるか

というもの。

そして、クリアーした時間が「スコア」となる。速くゴールすればその時の時間が「ハイスコア」となる。

ステージ数は3つ。という体で行く。

 

処理全体。最終的にこうなる。

f:id:Free_Gamer:20180903195927p:plain

あまり1つの記事に長々と書きたくないので(めんどくせぇし)、小分けにして記事を出していく。

 

今回は、下準備だ。

 

用意するもの

ActorクラスのBP(記事内では「BP_Goal」という名前で出てくる)

・GameInstance(記事内では「MyGameInstance」という名前で出てくる)

・GameModeBase(記事内では「MyGameMode」という名前で出てくる)

・3つのマップ(レベル)

・レベルBP

・SaveGame(記事内では「SaveScore」という名前で出てくる)

 

「BP_Goal」の作成

前述の通り、ActorクラスのBPだ。

この「BP_Goal」は、ゴール地点としての役割を担う存在だ。

コンポーネント

f:id:Free_Gamer:20180903201444p:plain

Box・・・オーバーラップコリジョン。プレイヤーがオーバーラップしたらゴール!という判定をする為のもの。

ParticleSystem・・・ゴールだという事を分かりやすくするための目印のようなもの。

 

自分はこんな感じにした。派手な炎エフェクトで分かりやすいだろう。

f:id:Free_Gamer:20180903201653p:plain

変数

「StageID」という名のInteger型の変数だ。

これは、今何ステージ目をプレイしてるのかを示すための変数だ。

今回の処理でとても重要だ。

デフォルト値は「0」のままでいい。

f:id:Free_Gamer:20180904180042p:plain

 

「MyGameInstance」の作成

これはタイマー、つまり時間の「分」と「秒」を格納する為のもの。

今回ハイスコア処理をするうえで重要な存在となる。

変数

f:id:Free_Gamer:20180903202301p:plain

MinuteInstance・・・「分」を格納する為の変数

SecondInstance・・・「秒」を格納する為の変数

 

「MyGameMode」の作成

これは主にタイマー処理を行う為のもの。

処理は以下の通り。

f:id:Free_Gamer:20180903202842p:plain

 

「秒」の処理。

f:id:Free_Gamer:20180903202937p:plain

「秒」と「分」を、ゲームインスタンスに格納

「Minute」は「MinuteInstance」に。

「Second」は「SecondInstance」に。

f:id:Free_Gamer:20180903203131p:plain

「分」を更新する処理

「秒(Second)」が「60」に達した時、つまり「60秒」に達した時

Trueに処理が流れ、

f:id:Free_Gamer:20180904175308p:plain

「分(Minute)」に「1」を足す。つまり、「1分」経ったという事になる。

この時、「秒(Second)」が「60」以上行ったらおかしいから、「秒(Second)」を「0」にセット。

そしてまた「秒(Second)」が1秒おきに更新されていく・・・といった感じだ。

f:id:Free_Gamer:20180904175431p:plain

 

3つのマップ(レベル)の作成

3つレベルを作成する。

ステージ名はそれぞれ分かりやすく「Stage1」「Stage2」「Stage3」にしといた。

f:id:Free_Gamer:20180904180616p:plain

それぞれのレベルにゴール地点の役割を担う「BP_Goal」を配置しよう。

Stage1

f:id:Free_Gamer:20180904180929p:plain

Stage2

f:id:Free_Gamer:20180904180949p:plain

Stage3

f:id:Free_Gamer:20180904181009p:plain

もちろん自分の好きな位置に置いてくれて構わない。

 

レベルBPの作成

それぞれのレベルのレベルBPに以下のような処理を組む。

 

Stage1のレベルBP

f:id:Free_Gamer:20180904181247p:plain

Stage2のレベルBP

f:id:Free_Gamer:20180904181305p:plain

Stage3のレベルBP

f:id:Free_Gamer:20180904181321p:plain

「BP_Goal」から「StageID」変数を参照。

各レベルごとに数値をセットしている。

これは今回の処理でとても重要だ。

 

「SaveScore」の作成

SaveGameクラスのBP。

SaveMinute・・・タイマーの「分」を格納し、セーブする為の変数

SaveSecond・・・タイマーの「秒」を格納し、セーブする為の変数

HighScoreMinute・・・ハイスコアの「分」を格納し、セーブする為の変数

HighScoreSecond・・・ハイスコアの「秒」を格納し、セーブする為の変数

f:id:Free_Gamer:20180905200419p:plain

 

 今回はここまで。

 

次回は、実際にどのようにハイスコア処理をしていくのかを紹介する。

 

それではまた!^^ノシ

 

 

 

 

 

 

 

 

 

 

 

Set Array Elemって何よ!?!?!

今回「Set Array Elem」という気になったノードがあったので、色々調べた。

f:id:Free_Gamer:20180828194707p:plain

このノードは、

 

「指定した配列(Array)の、指定したIndexに、Item(要素)を追加する」

 

というものだ。

 

使用例を紹介しよう。

 

(例)

String型の配列「MyArray」から、指定したIndex(画像だと「3」)のString値をPrintStringで表示。

f:id:Free_Gamer:20180828200254p:plain

「MyArray」の中身

f:id:Free_Gamer:20180828200522p:plain

 

これでプレイすると・・・

f:id:Free_Gamer:20180828200704p:plain

f:id:Free_Gamer:20180828200722p:plain

指定したIndex「3」に入ってた「DANTE」の文字がしっかり表示される。

 

ここで、例えば「DANTE」という名前を他の名前に変えたいとき。

ここで、Set Array Elemを使うのだ。

 

f:id:Free_Gamer:20180828201256p:plain

TargetArray(MyArray)内の、IndexのItem(要素)を変更する。

Index「3」に入ってる「DANTE」を「聖徳太子」に変更だ。

f:id:Free_Gamer:20180828201531p:plain

 

これでプレイすると・・・

f:id:Free_Gamer:20180828202259p:plain

f:id:Free_Gamer:20180828202320p:plain

しっかりと変更されている。

 

プレイ前プレイ中で比べてみよう。

 

プレイ前

f:id:Free_Gamer:20180828203310p:plain

プレイ中

f:id:Free_Gamer:20180828203350p:plain

OK!

 

ちなみに、

f:id:Free_Gamer:20180828203735p:plain

「Size to Fit」というのは、

 

Trueの場合、指定したIndexがTargetArrayのサイズよりも大きい場合、指定したIndexまでTargetArray内のIndexを拡張する。

 

というもの。

 

ちょっと分かりにくいかもしれないので、また例を出しておく。

 

(例)

ここでポイントなのは、Set Array Elem内のIndexに「8」を指定してるところ。

TargetArray内のIndex「8」にItem内の文字を追加している。

本来Target Array内のIndexは「0~5」までなのだが、Size to Fitを使うことで

Target Arrayのサイズを「0~5」から「0~8」に拡張が可能なのだ。

指定したIndexまで拡張が可能。という感じだ。

f:id:Free_Gamer:20180828204726p:plain

 

これでプレイすると・・・

f:id:Free_Gamer:20180828205134p:plain

f:id:Free_Gamer:20180828205408p:plain

しっかり表示。

 

配列内も、プレイ前とプレイ中で確認しよう。

 

プレイ前

f:id:Free_Gamer:20180828205006p:plain

プレイ中

f:id:Free_Gamer:20180828205053p:plain

しっかり配列内が「0~8」まで拡張されて、指定したIndex「8」に指定したItem(要素)が追加されている。

 

以上がSet Array Elemの概要でした!

 

それではまた!^^ノシ

セーブ・ロードの方法!

お久しぶりです!

最近はPS4のDETROIT Become Humenにドハマりしてい為、ブログとUE4の事はすっかり頭からすっ飛んでいたが、ようやく頭と体がUE4に戻りたがってきた為、活動を再開する事にした。

 

DETROIT Become Humen、面白いですよ!(おすすめです!)(宣伝)

 

今回はタイトル通り、「ゲームのセーブ・ロード」の方法だ。

 

意外と簡単なので身構える必要はないと思う。

 

今回は、「自分のステータスと自分の位置をセーブ・ロード」するという形式で行く。

 

SaveGameの作成

SaveGameクラスのBPを作成。

SaveGameは、値の保存を行う事が出来る。金で言えば「ATM」のようなもの。

名前はご自由に。僕は「MySaveGame」と付けた。

f:id:Free_Gamer:20180813011818p:plain「MySaveGame」を開き、2つの変数を用意。

SaveMoney・・・所持金をセーブする為の変数。

SaveLocation・・・キャラの位置をセーブする為の変数。

f:id:Free_Gamer:20180813012338p:plain

デフォルト値は不要。これでSaveGameの設定は以上だ。

 

 

キャラクターBP

変数を用意。

Money・・・所持金(ステータス)デフォルト値「100」Integer型の変数。

イベントグラフ

所持金の減算

「10」ずつ減らしていく。

f:id:Free_Gamer:20180813011345p:plain

セーブ処理

f:id:Free_Gamer:20180813012701p:plain

「CreatSaveGameObject」のSaveGameClassには先程作成した「MySaveGame」を指定。

f:id:Free_Gamer:20180813012830p:plain

 

GetActorLocationで現在の位置を、「SaveLocation」に保存。

現在の所持金「Money」を「SaveMoney」に保存。

f:id:Free_Gamer:20180813013139p:plain

 

「SaveGametoSlot」で、保存した情報に「名前を付けて保存する」処理を行っている(個人的解釈なので間違いの可能性あり)

SlotNameには任意の名前を入力。僕は「SaveSlot」と入れた。

UserIndexはよくわからん。

f:id:Free_Gamer:20180813013512p:plain

ちなみに、保存された内容は自分のPCのフォルダに保存される。

UnrealProjects→プロジェクト名(今回の場合は「TEST」という名前にしてある)→Saved→SaveGamesに保存されている。

先程SlotNameに入力した名前「SaveSlot」という名で保存されている。

f:id:Free_Gamer:20180813014221p:plain

 

ロード処理

f:id:Free_Gamer:20180813014518p:plain

「LoadGameFromSlot」で、保存した内容をロードする。

キャストが必要。「MySaveGame」をキャストする。

f:id:Free_Gamer:20180813014834p:plain

「MySaveGame」から保存した内容(SaveLocation・SaveMoney)を参照する。

SetActorLocationで前回セーブした位置に移動する。

前回セーブした所持金「SaveMoney」をMoneyに渡す。

f:id:Free_Gamer:20180813015043p:plain

 

これでプレイしてみよう!

youtu.be

まず、所持金を50まで減らして、好きな位置でセーブしてみよう!

スタートした位置からかなり離れた位置まで移動し、所持金を50まで減らしてセーブをした。

その後、セーブした位置から遠く離れた場所に移動し、ロードした結果しっかりと前回セーブした位置に移動した。

これで自分の位置がしっかりセーブされているのが分かった!

 

だが、肝心の所持金はどうだろう??

50まで減らしてセーブしたところで、ロードしてからまた減らそうとしてもそのまま40、30、20・・・と減っていくのは当然なのだから、果たして所持金までしっかりセーブされているのか分からないだろう。

簡単に確かめられる。

 

もう一度、ゲームをプレイしてみよう。

youtu.be

先程のセーブした情報が、PCのフォルダにずっと残っているので、いきなりロードが可能。

なので、前回セーブした位置からいきなりロードできる。

普通、プレイ開始して所持金を減らしたら、デフォルト値は「100」なので90、80、70・・・と10ずつ減っていく。

だが、ロードしてから減らしてみると、いきなり40、30、20・・・と減っている。

これで所持金もしっかりセーブされているのが分かった!

 

それではまた!^^ノシ

 

 

 

 

 

 

 

 

 

 

 

 

ぷちコン奮闘記!~タイマー処理・スコア表示~

今回作るゲームには、タイマーとキルカウント(敵を殺した数)がスコアとして表示される。

 

タイマー処理もキルカウント処理も、どちらもGameModeBaseに処理を組んでいる

 

まず、どのようにしてキル数のカウント処理をしてるのかを紹介しよう。

 

GameModeBase

自分が敵を殺したという通知が、「KillCount」インターフェースを経由して送られてくる。

敵が殺された時、「KillNumber」というInteger型の変数に殺した数を格納していく。

f:id:Free_Gamer:20180808003014p:plain

「KillCount」インターフェースは、前回の記事にも書いてあるはずなので、確認してほしい。

free-gamer.hatenablog.com

 

次にタイマー処理だ。

f:id:Free_Gamer:20180808002805p:plain

イベントTickを使用。

Delayで1秒おきに「TimerSecond」というInteger型の変数を1足している。

「TimerSecond」は、秒数を格納する為の変数だ。

デフォルト値は「0」

これで、1、2、3、4・・・というように1秒ずつタイマーが加算されていく。

だが、Delayとセット「TimerSecond」変数の間に、ブランチを挟んである。

これは、キル数(KillNumber)が目標キル数(KillGoalNumber)と同じになったら、Trueに処理が流れ、クリアーリザルトを表示するために、ウィジェットBPにインターフェースで処理を送っている。

そうすれば、タイマー処理も止まってくれる。

f:id:Free_Gamer:20180808003734p:plain

f:id:Free_Gamer:20180808004418p:plain

「TimerSecond」が「60」に到達したら、「〇分」経ったかを格納する為に、「TimerMinute」というInteger型の変数を1足している。

「TimerMinute」のデフォルト値は「0」

つまり、「TimerSecond」が60秒に達したら、1分経ったという事で「TimerMinute」に1足している。

という感じだ。

その後、また「0」から秒数をカウントしていく為に、TimerSecondを「0」にセット。

そしてまたタイマーを加算していく・・・のループだ。

 

f:id:Free_Gamer:20180808005605p:plain

 

UMGはこんな感じ。

f:id:Free_Gamer:20180808010223p:plain

 

実際にやってみた結果。

youtu.be

 

キル数が目標値に到達した時、つまりステージにいる敵を全員鏖(みなごろし)にした時、しっかりタイマーが止まっていた!

同時にキル数もカウントされていた!

 

それではまた!^^ノシ

 

 

 

 

ぷちコン奮闘記!~ぷちぷち小人をぶち殺していくゲーム!!!!~

さて!ぷちコンのテーマがようやく解禁されましたね!

テーマは「ぷち」

これまたよくわからないマニアックなテーマですw

 

このテーマに沿って、

 

「小人をぷちぷちぶち殺していくゲーム」!!!!!

 

を!作ることにした!

 

ステージはこの部屋丸ごと使った。

f:id:Free_Gamer:20180807001528p:plain

 

この部屋の中にうじゃうじゃいる小人たちを、左クリックでひたすら潰していくのだ。楽しいだろう??

 

今回は、「敵を殺す処理」を紹介する。

 

プレイヤー

「リアルなレンダリング」のアセットにデフォルトで入っているFPS_Character」をそのまま使っている。

 

コンポーネント

デフォルトだとカメラが入ってないので、カメラを追加。

f:id:Free_Gamer:20180807004424p:plain

「Z:90」の位置にカメラを設置した。

f:id:Free_Gamer:20180807004750p:plain

カメラの詳細パネル内の「CameraOption」項目にある赤枠で囲った部分にチェックを入れる。

チェックを入れないと、上下にカメラが動いてくれない。

f:id:Free_Gamer:20180807004550p:plain

 

イベントグラフ

f:id:Free_Gamer:20180807002931p:plain

カメラから5000の距離までトレースを飛ばす。

f:id:Free_Gamer:20180807003046p:plain

タグ判定でトレースが当たったアクターが指定したタグ持ちの敵かどうかを判定。

IsValidを入れないとエラーの嵐が起きる。

指定したタグ持ちのアクター(敵)にトレースがヒットした場合、Killインターフェースを経由して敵のBPに処理が送られる。

その後、殺した数、つまりスコア処理を行う為ゲームモードにも処理を送っている。

f:id:Free_Gamer:20180807003220p:plain

 

敵の名前は分かりやすく「Enemy」にした。

 

イベントグラフ

血のパーティクル・デカールをスポーン。

死んだときの音・声を再生し、最後に敵を破壊。

f:id:Free_Gamer:20180807003611p:plain

 

Enemyにトレースがヒットするように、Capsulecomponentのコリジョン「Visibility」を「ブロック」にしてある。

f:id:Free_Gamer:20180807004151p:plain

何故なら、トレースのコリジョンはVisibilityに設定してあるからだ。

f:id:Free_Gamer:20180807004239p:plain

 

youtu.be

 

しっかり殺害されていた!

 

これからぷちコンの進捗を上げていこうと思う!

 

それではまた!^^ノシ

 

 

GroupActor(グループアクター)って??

つい最近買ったアセットで、気になるものを見つけた。

f:id:Free_Gamer:20180805191721p:plain

赤枠で囲った部分。「GroupActor」「なんだこれ??」と。

 

そういうクラスがあるのかと思いきやそういうわけでもなく、

色々調べた結果・・・

 

「複数のアクターを『1つのアクター』としてまとめる機能」

 

だというのが分かった。

 

(例)

1つの壁を複数積み上げて作ったビルがあったとする。

X方向に2枚

Y方向に2枚

Z方向に5枚積み上げたシンプルなビルだ。

f:id:Free_Gamer:20180805194639p:plain

例えばこのビルを、ある位置に全部丸ごと動かしたい。となった時、

まあ恐らく「1枚ずつ壁をマメに移動させる」「壁を1枚ずつ複数選択して一気に運んでいく」かのどちらかだろう。

もちろんそれでも不可能ではないが、はっきり言って面倒だろう。

 

もし移動させる壁が更に多かったらどうなるだろうか。

1枚ずつマメにドラッグして移動させるのは考えたくもないし、

壁を複数選択して一気にドラッグで移動させたくても、複数選択する為に1枚ずつクリックして複数選択するのも面倒だ。

 

そういういった面倒を緩和してくれるのが「GroupActor」だ。

使用方法は簡単。

移動させたい壁を複数選択する。

f:id:Free_Gamer:20180805195844p:plain

ビューポート上、あるいはアウトライナ上で右クリックし、「グループ」を選択する。

 

ビューポート上の場合、指定のアクター(今回の場合だと壁)にカーソルを合わせた状態で右クリック。

f:id:Free_Gamer:20180805200448p:plain

アウトライナ上の場合、選択状態にしたアクターにカーソルを合わせた状態で右クリック。

f:id:Free_Gamer:20180805200252p:plain

 

「グループ」をクリックすると、以下の画像のように指定した壁が緑色の枠のようなもので囲われてるのが分かると思う。

f:id:Free_Gamer:20180805201855p:plain

指定したアクターを「1つのグループ」としてまとめた証拠だ。

 

アウトライナを確認すると、「GroupActor」というのが追加されてるはずだ。

f:id:Free_Gamer:20180805202248p:plain

この「GroupActor」を選択すれば、自動的に指定したアクターが複数選択される。

 

こうすれば、「ビルの位置を変更したい!」となった時も、「グループ」化してしまえば、簡単に指定した壁を複数一気に移動させることが可能なのだ。

 

ちなみに、この「グループ」化にはショートカットキーが存在する。

指定したアクターを複数選択し、「Ctrl+G」で「グループ」化が可能だ。

 

もちろん、「グループ」化を解除することだってできる。

「グループ」化したアクター上で右クリックし、「グループ化解除」を選択すればOKだ。

あるいは、ショートカットキー「Shift+G」でも解除可能だ。

f:id:Free_Gamer:20180805203704p:plain

 

youtu.be

 

この機能をうまく使えば、レベルデザインもなかなか楽になるかもしれない!(適当)

ぜひ活用していこう!

 

それではまた!^^ノシ