【UE4】コリジョンの基本とボールの発射【初心者】

ボールを発射するBPを作りました。
今回の話はコリジョンが関わってきます。
コリジョンの基本を動画で丁寧に説明したので、是非見てみてください
倍速ならば3分でコリジョンの基本が理解できます。

コリジョンの基本(5分59秒)2倍速推奨

コリジョンの基本

ボールを発射

再生時にボールが発射するようにします。

Third Personのテンプレートを使います。
その作り方はこちらの記事に載せています。

準備

【UE4】BP作成と[Starter Pack]のインポート

ボールのBPを作成する。[Starter Content]を追加。

コンポーネントの追加

【UE4】コンポーネントの追加

ボールのメッシュ、アローコンポーネント、[Projectile Movement]をBPに追加。

ボールの発射

Projectile Movementの設定

[Projectile Movement]の設定。→再生するとボールが落ちる。

【UE4】ボールが落ちないようにする

[Default Scene Root]を消す。

一番の親のものだけが使われる。

[Default Scene Root]を消す。→正常にボールが発射する。

ボタンで発射

ボタンを押してボールを発射させます。

発射ボタンの設定

キーの割り当て

[Project Setting…]
[Engine]>[input]
[Action Mapping]の右の+
[Launch]という[Action]のボタンを作成。
[P]キーを割り当てる。

コントローラーつなぐ

Get Player Controllerの説明

Ctrlドラッグ

こんなBPを作った。

👇画像をクリックで大きく表示。

BPのイメージ

ボタンで発射

【UE4】ボールをボタンで発射

[Velocity]をX方向に500。
[initial speed]を0に。
少し浮かせて配置。
👇クリックで拡大

ボール近くのみ発射

キャラクターがボールに近づいたときのみ、ボールに対する操作を可能にします。

コリジョン作成

【UE4】コリジョン作成と[On Component Begin/End Overlap]の説明

[Sphere Collision]を作成。

[On Component Begin Overlap]と[On Component End Overlap]を作成と説明。

物体がコリジョンの中に入ってきたのを検知すると、イベントを開始するノード。

物体がコリジョンの外に出ていくのを検知すると、イベントを開始するノード。

キャラクターかどうか判別

【UE4】キャラクターかどうか判別

B左クリック

右クリックからBranchと検索しても良いです。

👇クリックで拡大

近くなら発射

近くなら発射

👇クリックで拡大

発射速度の変更

キャラクターとボールとの位置関係によって、発射速度を変更するBPをつくります。

発射速度の変更

発射速度の変更

毎フレーム処理が走るノード。ゲームでは1秒間に60フレームくらいあるので、これを多用するとPCに強く負荷がかかってしまう。

デフォルトの発射速度を0にした。

Max Speedを2000にした。

👇クリックで拡大

ベクトルの苦手な人や、習っていない人に向けて補足の動画をつくりました。単純な計算はゲーム作りでも必要になると思うので是非ご覧ください。

ベクトルの説明

👇クリックで拡大ベクトルの引き算は、[後から前]

TickのON/OFF切り替え

TickのON/OFF切り替え

まず、デフォルトのTickをOFFにする。

その後、BPを作成。

👇クリックで拡大。

ボール近くで矢印を表示

ボール近くで矢印を表示

[Arrow]の色と大きさを分かりやすくする。

[Arrow]の[Visible]と[Hidden in Game]のチェックをはずす。

BP作成。👇クリックで拡大。

矢印を発射方向に向ける

発射方向に矢印を向ける

プレイヤーのWorld Locationをカプセルからメッシュに変更。

👇クリックで拡大

再発射はしない

再発射はしない

矢印の向きの修正

矢印の向きを修正

👇クリックで拡大。

コメントにまとめていく

BPにコメントをつける

👇クリックで拡大

失敗・疑問

失敗したことをまとめます。初心者は同じような失敗をすることも多いと思うので、上手くいかないときは参考にしてください

ボールが地面に落ちていく。

開始と同時に、ボールが地面に吸い込まれていく。

解決済

【解決方法1】非推奨

[projectile movement]の[Details]パネルで[Projectile Gravity Scale]を0にする。
ただし、これだと地面には落ちてはいかないが他の物体は通り抜ける。

【解決法2】推奨

[Default Scene Root]を消す。詳しくは次に説明する。

ボールが全てを通り抜ける

解決済

【解決方法】推奨

[Default Scene Root]にメッシュをドラッグ&ドロップして、[Default Scene Root]を消す。

コリジョンへの疑問

解決済(深く考えないことにした)

暫定的な結論

・[Projectile Movement]は衝突の際、親のBlock情報のみを使う。

・子のコリジョンでもOverlapでイベントを作ることはできる。

きっと、子のBlockの情報も扱うと処理が重くなるからだと思う。

今回ボールに対して[Projectile Movement]コンポーネントで動きを作る際、コリジョンの情報はBPにおける1番の親のコリジョンを参照しているように感じた。

理由

・[Default Scene Root]を親にすると地面に落ちる。

・[Sphere Collision]を親にしていても、そのCollisionを[Overlap All Dynamic]にしていたら地面に落ちる。(子として、コリジョンを持つボールのメッシュがあるにも関わらず。)

しかし、前回宝箱を[Set Relative Location]を使って動かした際は、[Default Scene Root]を親にしていたにも関わらず、宝箱のメッシュのコリジョンが使われている。(1番の親ではないにも関わらず。)・・・?
[Projectile Movement]はコリジョンと関係がありそうなコンポーネントなので、これに関係がありそう。
子に[Box Collision]を設定させて、オーバーラップ時のイベントを設定したら、正常に機能した。ブロックする情報は渡らないが、オーバーラップは問題なさそう。
きっと疑問を綺麗に解決するには、C++のコードを理解するしかなさそう。

質量についての疑問

解決済(深く考えないことにした)

暫定的な結論

・[Projectile Movement]は発射物っぽい動きを与えるコンポーネント。

・自身の運動がブロックされたときに処理が行われる。

・参照される情報はかなり限定されている。自身の速度とブロックした相手との角度など。

・衝突相手の、速度の影響を受けない。

[Projectile Movement]ついて、質量などに関しては深く考えるべきではない。必要な挙動を得られたら問題ない。

[Projectile Movement]はブロックだけではなく、質量の情報もつかっているはず。
だが、どこで設定できるか分からない。
バウンドするので、質量は0ではない。
[Initial Speed]を0にするとキャラクターでいくら押しても動かない。
速度をつけて衝突しても動かない。摩擦力は0なのに。
ボールに他のボールをぶつけても、止まっているボールは動かない。
いくらぶつけるボールの速さを大きくしても変わらない。

動いている状態のボールにキャラクターが衝突すると、ボールは動く。

キー入力で発射できない

BPは問題ないはずなのに発射できない。

解決済

【解決方法】少し浮かせる。

ボタンを押して発射させる際、地面と接触していると発射できない。[initial speed]を設定しただけのときは発射できたのに…。

発射される方向がおかしい

解決済

[Local Space]で速度を決定しているので、BPの座標の向きをワールド座標と合わせておく必要がある。

矢印の向きがおかしい

解決済

矢印の位置がおかしかっただけ。

Twitterしてます

記事の更新をお知らせします。

コメント

タイトルとURLをコピーしました