ボールを発射するBPを作りました。
今回の話はコリジョンが関わってきます。
コリジョンの基本を動画で丁寧に説明したので、是非見てみてください。
倍速ならば3分でコリジョンの基本が理解できます。
コリジョンの基本(5分59秒)2倍速推奨
ボールを発射
再生時にボールが発射するようにします。
Third Personのテンプレートを使います。
その作り方はこちらの記事に載せています。
準備
ボールのBPを作成する。[Starter Content]を追加。
コンポーネントの追加
ボールのメッシュ、アローコンポーネント、[Projectile Movement]をBPに追加。
ボールの発射
[Projectile Movement]の設定。→再生するとボールが落ちる。
[Default Scene Root]を消す。
一番の親のものだけが使われる。
[Default Scene Root]を消す。→正常にボールが発射する。
ボタンで発射
ボタンを押してボールを発射させます。
発射ボタンの設定
[Project Setting…]
[Engine]>[input]
[Action Mapping]の右の+
[Launch]という[Action]のボタンを作成。
[P]キーを割り当てる。
コントローラーつなぐ
Ctrl+ドラッグ
BPのイメージ
ボタンで発射
ボール近くのみ発射
キャラクターがボールに近づいたときのみ、ボールに対する操作を可能にします。
コリジョン作成
[Sphere Collision]を作成。
[On Component Begin Overlap]と[On Component End Overlap]を作成と説明。
物体がコリジョンの中に入ってきたのを検知すると、イベントを開始するノード。
物体がコリジョンの外に出ていくのを検知すると、イベントを開始するノード。
キャラクターかどうか判別
B+左クリック
右クリックからBranchと検索しても良いです。
近くなら発射
発射速度の変更
キャラクターとボールとの位置関係によって、発射速度を変更するBPをつくります。
発射速度の変更
毎フレーム処理が走るノード。ゲームでは1秒間に60フレームくらいあるので、これを多用するとPCに強く負荷がかかってしまう。
ベクトルの苦手な人や、習っていない人に向けて補足の動画をつくりました。単純な計算はゲーム作りでも必要になると思うので是非ご覧ください。
TickのON/OFF切り替え
ボール近くで矢印を表示
矢印を発射方向に向ける
プレイヤーのWorld Locationをカプセルからメッシュに変更。
👇クリックで拡大
再発射はしない
矢印の向きの修正
コメントにまとめていく
失敗・疑問
失敗したことをまとめます。初心者は同じような失敗をすることも多いと思うので、上手くいかないときは参考にしてください。
ボールが地面に落ちていく。
開始と同時に、ボールが地面に吸い込まれていく。
解決済
【解決方法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してます
記事の更新をお知らせします。
コメント