読者です 読者をやめる 読者になる 読者になる

UnrealEngine奮闘記

アンリアルエンジンでの開発やTIPSをまとめたblogです

横スクロールアクションを作る その3敵の作成

今回は敵を作ります。
基本はインベーダーゲームと同じですが、重力があったり移動範囲が広かったりするので、少し変える必要があります。

f:id:swiftnest:20140612002253j:plain:w460

Unreal Engine4.2からUIが日本語に対応しましたが、まだ翻訳が不十分なのと今後変更の可能性が高いため英語に設定しています。
設定は「編集 -> EditorPreferences... -> 地域&言語」にあります。

Characterクラスを作る

Content Examplesをアップロードしても良くなりましたので、今回はUFOのメッシュを使用することにします。

Content ExamplesはMarketPlace(市場)からダウンロード出来ます。
ダウンロード後にプロジェクトを開き、以下の場所にUFOのメッシュが有ります。
ExampleContent/Input_Examples/Meshes/SM_UFO_Main

Migrateのやり方が判らない方は、こちらが参考にになります。
[UE4] 他プロジェクトからアセットを移動させる方法 | historia Inc - 株式会社ヒストリア

Migrate後はコンテンツブラウザにEnemyというフォルダを作成し、その中に保存します。

次にClass Blueprintを作成します。
インベーダーゲームとは違い、今回はCharacter Classを作成します。
f:id:swiftnest:20140611222827j:plain:w240

CharacterはCharacterMovementComponetを持っているため、移動などの制御が簡単です。
ドキュメントには人型に適しているクラスと書いてありますが、人型以外も応用すれば使うことが出来ます。

名前をBP_Enemyとし、同じくコンテンツブラウザに保存します。

次にBP_Enemyをダブルクリックし、エディタ右上の「Defaults > Components > Graph」からComponentsを選びます。
AddComponentボタンを押し、Static Meshを選びます。

Static Meshには先程の「SM_UFO_Main」を設定します。
少し上を飛ぶように、Z座標に20を入力します。

f:id:swiftnest:20140611224204j:plain:w460

Characterクラスには、標準で「Mesh Component」が用意されていますが、こちらはスケルタルメッシュ専用なので使用しません。

さらに1階層上の「CapsuleComponent」の大きさをUFOのメッシュに合わせます。

f:id:swiftnest:20140611224744j:plain:w460

最後に敵の向きを進行方向に向けるため、CharacterMovementの「Orient Rotation to Movement」にチェックを入れます。

f:id:swiftnest:20140616192312j:plain:w460

Blueprintの作成

これで準備が整いましたので、次はBlueprintに移ります。

敵の移動は「Add Movement Input」を使用します。
方向(World Direction)にはYに0.2を入れます。
これだけで移動は完成です。

次に壁当たったら反転する処理を作成します。
壁に当たると「Event Hit」が返ります。戻り値の中に「Hit Normal」がありますので、このベクトルの「Y」を判定します。
真横から当たると-1 or 1が返りますが、多少斜めから当たっても反転して欲しいのと、坂道だと反転して欲しくないので「0.5」で判定します。

インベーダーと同じく変数Float Directionを作成し、ここに-1 or 1を入れることで右か左に移動するようにします。
ちょうど「Add Movement Input」には「Scale Value」という入力値がありますので、そこにDirectionを接続します。
出来上がったBlueprintがこちらです。

f:id:swiftnest:20140611225527j:plain:w460

実際に配置し、移動と反転が正しく動くか確認して下さい。

敵の攻撃と死亡

マリオのクリボーの様に、上から踏まれると死亡で、それ以外の場所でプレイヤーに接触するとプレイヤーを倒すようにします。

プレイヤーかどうかの判定はキャストを使用します。EventHitの戻り値「Other」を「Cast To UnityChanBlueprint」でキャストし、それが成功すればプレイヤーと衝突したこととなります。
プレイヤーと当たった方向がZ座標0.5以上であれば、プレイヤーに踏まれたことになるので死亡となります。
それ以外から当たった場合は、プレイヤーにダメージが行くようにします。
Apply Damageを作成し、BaseDamageに1を指定します。

f:id:swiftnest:20140611230154j:plain:w460

次に死亡処理です。
敵が死亡した際に墜落&凹む様にします。
まず「Event Any Damage」を作成します。

Event Any Damageが呼ばれた後、Add Local Offset ZでモデルのZ座標を下げます。Delta LocationのZに-50を設定します。
また、Set Actor Scale3DでモデルのZスケールを0.5にします。
その後Delayを1秒いれて、直ぐに消えないようにします。

f:id:swiftnest:20140611230756j:plain:w460

Add Local Offsetは作成するのにちょっとしたコツが必要です。左のMyBlueprintにあるStaticMeshを選択した状態で、右クリックメニューを出すと作成することが出来ます。
f:id:swiftnest:20140611232611j:plain:w460

敵の状態を持つ

現状では敵は死亡しながら移動してしまいます。
また、プレイヤーが遠い状況でも動き始める為、レベルに配置しづらいので「状態」を持つ様にします。

まずstring State変数を作成し、Default Valueに「Start」と入力します。
Event Tickからの接続にSwitchをはさみ、Stateが「Start」の時はプレイヤーとの距離を見て、近ければStateを「Move」に切り替えます。

f:id:swiftnest:20140611224348j:plain:w460

同じ処理をEvent HitとEvent Any Damageにもはさみます。

f:id:swiftnest:20140611235808j:plain:w460
f:id:swiftnest:20140611235823j:plain:w460

これで敵の完成です。

次回は最終回で「レベルを作る」です。
Blushの使い方とダメージ床や動く床などを、殆どBlueprintを使わずに作っていきます。