本日のテーマは『スイカゲーム』風の落ちものパズルを作ろう です
本記事は、自機がフルーツを離した直後ではなく、何かにぶつかるまで次がでない仕様の実現方法解説です。
URSuika UnrealEngine製のスイカゲーム風3D落ちものパズルゲーム – BOOTH
無料です(Windowsのみ)遊んでみてください。
ぶつかったらなんかやる
スイカゲームはフルーツを離したらすぐ次ではなく、何かにぶつかるまでは次のフルーツがでませんね
どこかにぶつかったら次の玉を落とす仕様も実現してみましょう
※ここが前半のヤマです 難しいですが頑張ってついてきてください
玉がぶつかったら がきっかけなので玉自体 BP_Fruitクラス を編集します
スフィアという玉のメッシュの詳細欄を下のほうに進んでいくと、イベントという欄にOn Component Hit ぶつかりイベントがあります
なにかにぶつかったときに発動するので、ここに次のフルーツを作る機能を作ればよいということですね
ただしフルーツ生産者は現在プレイヤーが担当しています
なのでプレイヤーにお願いするというさっきと逆方向の依頼です
プレイヤーを探す
さっきの変数のようにプレイヤーを特定する必要がありますが、プレイヤーはよく使うのでゲットプレイヤーキャラクターという関数が用意されています
関数というのはイベントと似た感じですが、結果を相手に返す出力ピンがついています
ここから取り出した「プレイヤーキャラクター」を「BPサードパーソンキャラクター」 へ「キャスト」します
なんのこっちゃわからないと思いますが、プレイヤーにどの設計図が使われているか、どのキャラクターがいまプレイヤーになっているかは状況によって変わります
なので「プレイヤー」という役割名ではなく、BPサードパーソンキャラクター と特定してあげないとこの設計図に作った機能があるのかないのかもわからないということです
フルーツ生産を依頼しましょう
が、いまフルーツ生産機能は「ジャンプボタンを押したら発動」になっています。このままではフルーツからはプレイヤーにジャンプボタン押してと依頼し、プレイヤーがジャンプボタンを押してフルーツを生産する流れになってしまいます。
他の人から使いたい機能はイベント化
こういうときは、フルーツに作った起動イベントと同じように、フルーツ生産機能をカスタムイベント化しましょう
BP_ThirdPersonCharacter > イベントグラフ
アッドカスタムイベントは覚えましたか?
スペース押したときに出る代わりに、受注したら生産するのでお引越しします
これでジャンプボタンを押しても出なくなりましたね
おっと初めてのエラーが出ました
何言ってるかわからない場合はChatGPTにでも貼り付けましょう
リンクをクリックすると該当箇所にジャンプできます
ただし問題が起きた場所と原因箇所は違うことが多いので、ここでこういうエラーが起きるってことはどういうことなんだ? を考える必要があります
さっきのエラーはカレントフルーツが中身入ってないエラーで、カレントフルーツが中身入っているか検証してからあれば落とすようにしましょう
検証済をゲットってわかりにくいですが 「ぬるぽ」「ガッ!」て意味です
中身あったら予定通り、空っぽだったら異常処理に分岐というよく使う処理です
空っぽだったらのルートは落とせない仕様通りなので放置でOKです
急にエラーになったのは、まだ誰もフルーツ生産イベントを発動させてないからです
フルーツが何かにぶつかったら呼び出してもらうとして、ゲーム開始時一番最初のフルーツはあらかじめ持っていてほしいですね
開始時というイベントもあります
ただしこのプレイヤーキャラクター自体がスポーンされる前では早すぎるので、プレイヤーがスポーンされたタイミングで発動するビギンプレイ 遊び開始時です
よく使うのでPキーを押しながら左クリックでショートカットできます
開始したらスポーンフルーツしましょう
自分で自分のイベントを呼び出すということです
誰に のターゲットピンにセルフが設定されています
BP_Fruitにもどり、さきほどのぶつかったイベントからフルーツ生産を依頼しましょう
ちなみに特定する前のプレイヤーからはフルーツ生産を呼び出せません
だれがフルーツ生産能力を持っているか特定するのが大事です
コンパイルすると、おっとエラーです 確認した際に線を切っちゃいましたね
これで完成でしょうか?残念ながらまだでません
Hitイベントが発生しない問題
ぶつかるコリジョン設定も、ぶつかったときのイベントも正しくかけているはずなのに動かない というときは、ぶつかるイベントが有効になっていない可能性があります
BP_Fruit / Sphere 詳細欄
これですね チェックが外れています
逆に少し下の重なったときのオーバーラップイベントは必要ありません
ぶつかりはゲーム内で大量に発生するので全部が全部ぶつかりイベントを処理しているとゲームが重くなってしまいます
なのでぶつかってるはずなのにイベントが動かないときはさっきの設定を確認しましょう
できましたが、1個目だけ地面に着いたそれらしいタイミングで次がでていて、2個目以降は落下始めたときにはすでに次のがある状態になってしまいました
どんな原因が考えられるでしょうか?
何かにぶつかったら次の玉がでる設計なので、何にぶつかっているかですね
すぐ当たっているということはプレイヤーに当たっちゃっているのでしょうか?
この仮説を検証してみましょう
プレイヤーにぶつかっている説
一旦ぶつからないノーコリジョン設定に変更して起動するときに有効にしてみましょう
セットコリジョンイネーブルで変更できます
これは一番下が最強 ではなくて物理を有効にしたいのでフィジックスが含まれている設定にします
まだ駄目ですね そしてよく見ると凄いことになっています
プレイヤーが回転すると、物理シミュレーションで動いているはずの玉がついてきてますね
F8キーを押してゲームを動かしたままデバッグしてみましょう
ここにプレイヤーキャラクターがいます
その子供としてフルーツがたくさんぶら下がっていますね
コリジョンの設定を変えたらプレイヤーについてくるようになった理由は私にもわかりませんが、落下し始めたらプレイヤーとは独立させたほうがよさそうですね
スポーンさせたときにアタッチしたのと反対のデタッチというのが独立させるノードです
独立する相手は親から で十分で、誰が親なのか特定しなくていいのでデタッチフロムアクターというノードをつなぐだけでOKです
ただし、このときも位置や回転の基準点は指定する必要があります
親のアクターからみて0の地点にいたのが、独立した瞬間ステージの原点にワープしてしまうとこの場合は困るのでキープワールドでこの世界の中での座標位置のまま独立してもらいましょう
プレイヤーの回転についてこなくなりましたね
とはいえ依然落ちたら次が出るようにはできていません
では Colligion Enable ではなくもう一段階細かい Collision Profile Nameなら? とか途中で切り替える作戦ではなく最初からプレイヤーの所属しているポーンを無視する設定にして、起動後もプレイヤーとはぶつからないようにしたらどうか?と一旦ブロックオールダイナミックで基本的にぶつかる設定にしてからカスタムに切り替えて細かい設定のなかから、ポーンを無視する設定に変更しました
これでもうプレイヤーにぶつかることはないので今度こそ?
ダメでした
というわけで、この「プレイヤーとぶつかっている説」はハズレな可能性が高いとわかります
何度も何度もどこかしらにぶつかっている問題
実は、さっきまでのデバッグ中にヒントはありました
- 最初にプレイヤーの元を離れてからぶつかるまではスポーンされていなかった
- デバッグ中にプレイヤーの子供がどんどん増えていったこと
玉は一旦落下するとどこかしらにぶつかりまくっているので何度も何度もぶつかりイベントが発生しています
そのたびに新しいフルーツを生産すると、在庫を大量に抱えた状態になります
色も形も大きさも全く同じなので気づきにくいと
ただし、そこで気づけなくてもイベント中にブレイクポイントを貼ってゲームを一時停止することで今さっきぶつかったばかりなのにまたぶつかった というので気づけると思います
これを回避するためにBP_FruitのHitイベントに変数を追加しました
Boolean ブーリアン型とはチェックついてるついてないの2択の信号です
よく「フラグが立った」というのもこれです
フラグが立ってないときだけフラグを立てて後の処理を行います
ブランチというのが条件分岐の基本系ですこれもよく使うのでBキー+左クリックで出せます
フラグが立ってなかったら立てて依頼するとこれで1回だけやるというプログラミングができました
これを変数もいらずにできる便利なノード(Do Once)もありますが、まずは基本から学びましょう
フラグが立っているときは何もしません
わーいできましたね
コメント