Unreal Engine 5で、キャラクターが弾を発射する機能を作ります。
FPSテンプレートの機能を簡略化したものを1から実装します。
弾のモデルのインポート
FPSのテンプレートから、弾のスタティックメッシュ、マテリアルを、自分のプロジェクトに移行します。
FPSテンプレートを作成して開き、弾のスタティックメッシュを右クリック→「アセットアクション」→「移行」→マテリアルとメッシュにチェックが入っているのを確認して「OK」→移行先のプロジェクトの「Content」フォルダを選択して「フォルダーの選択」でアセットを取り込みます。
移行したアセットは、移行先のプロジェクトのコンテンツフォルダの下にコピーされるので、必要に応じてフォルダを整理します。
弾のブループリントアセットの作成
弾のメッシュや移動パラメータなどを設定するためのブループリントを作成します。
コンテンツブラウザでフォルダを選択→フォルダ内で右クリック→「ブループリントクラス」→「Actor」で作成します。
コンポーネントの変更
作成したアクタブループリントに、弾のメッシュなどのコンポーネントを追加します。
コンポーネントの追加
ブループリントを開き、「コンポーネント」の「追加」→「Sphere Collision」を選択します。
追加したSphere Collisionを選択した状態で、「追加」→「Static Mesh」を選択します。
「追加」→「Projectile Movement」を選択します。
構成の変更
ここで、Sphere Collisionを、DefaultSceneRootにドラッグ&ドロップして、上書きしておきます。
これで、(この記事では不要ですが)物理演算を適用した際に、アクタが移動しなくなる現象を避けられます。
パラメータの変更
弾の大きさや速さ、スタティックメッシュを設定します。
スタティックメッシュの設定
Static Meshを選択して、「詳細」の「Static Mesh」に弾のスタティックメッシュを設定します。
大きさの調整
Static Meshを選択して、「詳細」の「トランスフォーム」でメッシュの大きさを、Sphere Collisionを選択して、「詳細」の「Sphere Radius」でコリジョンの大きさを調整します。
キャラクターのロボットは大きめのモデルなので、メッシュの「拡大・縮小」を0.2、コリジョンの「Sphere Radius」を初期値の32にしました。
接触時の挙動設定
Sphere Collisionを選択して、「詳細」の「コリジョンプリセット」をFPSテンプレートと同様に設定します。
これは、弾が接触した時の挙動を、接触相手の種類ごとに設定するものです。
移動動作の設定
Projectile Movementを選択して、「詳細」の「Should Bounce」にチェックを入して弾が跳ね返るようにし、「Velocity」で弾の速さを設定します。
ロボットのキャラクターブループリントで前方向となる、X軸方向の値を設定しました。
生存時間の設定
アクタブループリントを選択して、「詳細の」の「Initial Life Span」で弾が自動的に削除されるまでの時間を設定します。
弾の衝突処理の作成
弾が何かに衝突した時に力を加えてから消滅する処理を、イベントグラフで作成します。
全体
全体としては、弾がオブジェクトに衝突した場合に、相手に衝撃力を与えて、弾を削除する流れです。
詳細1
弾がオブジェクトに衝突した場合に、そのオブジェクト取得し、物理演算が有効か確認します。
物理演算が有効な場合は処理を続けます。
また、弾の速度を使った衝撃力計算と、弾の位置の取得をします。
詳細2
衝突したオブジェクトの物理演算が有効だった場合、弾が衝突した位置に衝撃力を与え、弾を削除します。
入力アクションの作成
発射処理の入力情報の型(ボタンのオンオフ、2次元のベクトルなど)を定義するアセットを作成します。
アセットの作成
コンテンツブラウザでフォルダを選択→フォルダ内で右クリック→「入力」→「入力アクション」で作成します。
アセットの設定
作成したアセットを開き、「Value Type」で「Digital(bool)」を選択→「Triggers」横の「+」で要素を追加→「Pressed」を選択します。
これで、プレイヤーがボタンを押したときに、Boolean型で入力情報を取得する設定になります。
入力マッピングの追加
入力マッピングコンテキストに、弾の発射に対応するプレイヤーからの入力情報(デバイスやボタンなど)を追加します。
入力マッピングコンテキストを開き、「Mappings」横の「+」で要素を追加→弾発射用の入力アクションを選択→入力アクション横の「+」で要素を追加→「マウスの左ボタン」、「ゲームパッド右トリガー」を選択します。
発射ボタンを変更する場合は、ここのボタン設定を変更してください。
ソケットの追加
キャラクターのスケルタルメッシュに、弾を発射するためのソケットを追加します。
構成の変更
スケルタルメッシュを開き、「スケルトンツリー」でソケットの親とするボーンを右クリック→「ソケットを追加」で追加します。
位置の調整
ソケットを、プレビュー内のウィジェットや「詳細」の「Relative Location」の値で、弾の発射位置に移動します。
プレビューを平行投影のワイヤーフレーム表示にすると、ソケットとメッシュの位置関係が分かりやすく、調整しやすいと思います。
キャラクターブループリントの変更
弾を発射する処理をブループリントに追加します。
全体
全体としては、キャラクターの位置姿勢から発射位置と方向を決めて、発射ボタンの入力があった場合に弾を生成する流れです。
詳細1
キャラクターのスケルタルメッシュから、ソケット名でソケットの位置を取得します。
それとは別に、キャラクターの姿勢からグローバル座標での、発射位置ずらし量を計算して足すことで、発射位置を決めています。
発射方向はキャラクターの向いている方向になります。
発射位置をずらす必要がなければ、ソケットの位置をそのままTransformのLocationにします。
また、発射方向としてカメラを参照する場合は、FPSテンプレートのように「Get Player Camera Manager」ノードと「Get Camera Rotation」ノードを使うと良さそうです。
詳細2
発射に対応するボタンが押されたときに、作成したTransformの位置姿勢で、アクタとして弾を生成します。
目標物の設置
ここまでで弾を発射する機能は実装できていますが、せっかくなので弾を当てる目標となるアクタを設置します。
ビューポートへの追加
「コンテンツブラウザ」で、StarterContentフォルダ→Shapesフォルダ→Shape_Cubeをビューポートにドラッグ&ドロップします。
パラメータの設定
追加したShape_Cubeを選択し、「詳細」の「Simulate Physics」と「Mass」にチェックを入れ、「Mass」を設定します。
位置や大きさは適当に調整してください。
冒頭の動画では、弾の速度が50000、Shape_Cubeの「Mass」が5000にしています。
以上です。
コメント