はじめに
UnrealEngineを学習するにあたってのメモを記事にまとめます。
本記事では完結せず何回か分けて記事にする予定です。
前回
今回やること
UnrealEngineの公式サイトにあるLearningの「Your First Game In Unreal Engine 5」を題材に学習していきます。
本記事では主に以下を扱います。
- キャラクターの移動
- キャラクターのアニメーション
- BOT(CPU)の作成
- BOT(CPU)が追尾するアイテムの動的生成
[開発環境]
windows 11
UnrealEngine 5.3.2
Character Movement
動画時間:43:04~
- 「BP_Bot」の編集エディタを開く
- 「コンポーネント」欄の「Mesh(CharacterMesh0)」を選択する
- 「詳細」欄の「Mesh」の「Skeletal Mesh Asset」を「SKM_Antbot」を選択する
- 「詳細」欄の「トランスフォーム」の「位置 Z」を「-70」「回転 Z」を「-90」に設定する
- 「コンポーネント」欄の「Capsule Component(CollisionCylinder)」を選択する
- 「詳細」欄の「形状」の「Capsule Half Height」を「70」、「Capsule Radius」を「25」に設定する
- 「コンパイル」を押して編集を適応させる
- プレイボタンを押すと、キャラクターが出てくるのが確認出来る
- 「コンポーネント」欄の「Character Movement(CharMoveComp)」を選択する
- 「詳細」欄の検索欄に「rot」と入れる
- 「詳細」欄の「Rotation Rate Z」を「420」、「Orient Rotation to Movement」をONにする
- 「コンパイル」を押して編集を適応させる
- 「コンポーネント」欄の「SpringArm」を選択する
- 「詳細」欄の「回転」を「ワールド」に変えて「絶対回転」にする
- 「コンパイル」を押して編集を適応させる
この後、実行するとキャラクターが移動方向を向くのだが、回転しませんでした。キャラクターの回転方法を調べると、以下をやると解消されました。
- 「コンポーネント」欄の「BP_Bot」を選択する
- 「詳細」欄の「ボーン」の「Use Controller Rotation Yaw」を無効にする
次にパラメータの設定をする
- 「コンポーネント」欄の「Character Movement(CharMoveComp)」を選択する
- 「詳細」欄の検索欄に「キャラクタームーブメント:基本セッティング」の「Max Acceleration」を「500」と入れる
- 「詳細」欄の検索欄に「キャラクタームーブメント:歩行」の「Max Step Height」を「60」と入れる
- 「詳細」欄の検索欄に「キャラクタームーブメント:歩行」の「Walkable Floor Angle」を「60」と入れる
- 「詳細」欄の検索欄に「キャラクタームーブメント:歩行」の「Ground Friction」を「0」と入れる
- 「詳細」欄の検索欄に「キャラクタームーブメント:歩行」の「Max Walk Speed」を「400」と入れる
- 「詳細」欄の検索欄に「キャラクタームーブメント:歩行」の「Braking Deceleration Walking」を「800」と入れる
- プレイボタンを押して、キャラクターが移動方向を向いて移動するようになる
Animation
動画時間:45:22~
- 「コンテンツドロワー」を開いて、「Character」フォルダに「Animations」フォルダを作成する
- インポートを押して、素材フォルダから「Character/Animations/A_Antbot_Idle.fbx」、「Character/Animations/A_Antbot_Run.fbx」、「Character/Animations/A_Antbot_Walk.fbx」を選択して開く
- インポート設定で「Skeleton」を「SKM_Antbot_Skeleton」を選択し、「Inmprt Mesh」をOFFにする
- 「全てインポート」して、3つインポートする
- 「Animations」フォルダで右クリックして、「アニーション->アニメーションブループリント」を選択し、名前を「ABP_Bot」にする
- 「ABP_Bot」をダブルクリックして、編集エディターを開く
- 「AnimGraph」を選択して、「アセットブラウザ」の「A_Antbot_Idle」をドラッグ&ドロップして入れる
- 「A_Antbot_Idle」->「Output Pose(Result)」に接続する
アニメーションがループしない
実際に再生するとアニメーションループしないことがありました。以下の設定でLoopするようになりました。
- 「A_Antbot_Idle」を選択
- 「詳細/設定」の「Loop Animation」をONにする
- 「Framework」フォルダにある「BP_Bot」の編集エディターを開く
- コンポーネントの「Mesh(CharacterMesh0)」を選択し、「詳細」の「Animation」の「Anim Class」を「ABP_Bot_C」に選択する
- コンパイルを実行する
- プレイボタンを押すと、立ちアニメーションが着いているのが確認出来る
- 「ABP_Bot」の編集エディターを開く
- 「A_Antbot_Idle」を削除する
- 「State Machine」コンポーネントを追加し、名前を「Locomotion」にする
- 「Locomotion(StateMachine)」->「Output Pose(Result)」に接続する
- 「Locomotion(StateMachine)」をダブルクリックして、ステート編集画面を開く
- 右クリックで「ステートの追加」をして、名前を「Idle」にする
- 「Entry」->「Idle」に接続する
- 右クリックで「ステートの追加」をして、名前を「Walk/Run」にする
- 「Idle」->「Walk/Run」に接続する
- 「Walk/Run」->「Idle」に接続する
- 「Idle」ステートをダブルクリックして、ステート編集画面を開く
- 「アセットブラウザ」の「A_Antbot_Idle」をドラッグ&ドロップして入れる
- 「A_Antbot_Idle」->「Output Pose(Result)」に接続する
- 「Locomotion(StateMachine)」に戻る
- 「Walk/Run」ステートをダブルクリックして、ステート編集画面を開く
- 「アセットブラウザ」の「A_Antbot_Walk」をドラッグ&ドロップして入れる
- 「A_Antbot_Walk」->「Output Pose(Result)」に接続する
- 「Locomotion(StateMachine)」に戻る
- 「Idle」->「Walk/Run」を繋いでる、トランジションルールをダブルクリックで選択する
- 上部タブの「Event Graph」を選択する
- 「? Is Valid」ノードを作成する
- 「Try Get Pawn Owner」->「? Is Valid(InputObject)」に接続する
- 「Event Blueprint Update Animation」->「? Is Valid(Exec)」に接続する
- 「Get Velocity」ノードを作成する
- 「Try Get Pawn Owner」->「Get Velocity」に接続する
- 「Vector Length XY」ノードを作成する
- 「Get Velocity」->「Vector Length XY」に接続する
- ノードメニューの「Promote to variable」を選んで「SET」ノードを作成する
- 「変数」のFloatとパラメーター名を「GroundSpeed」に変更
- 「Vector Length XY」->「SET GroundSpeed」に接続する
- 「? Is Valid(Is Valid)」->「SET GroundSpeed(実行)」に接続する
- コンパイルを実行して更新する
- 上部タブの「IdleからWalk/Run」を選択する
- 「変数」の「GroundSpeed」をドラッグ&ドロップして「Get」を選択して入れる
- 「>」ノードを作成する
- 「GroundSpeed」->「>」に接続する
- 「>」->「Result」に接続する
- 「Locomotion(StateMachine)」に戻る
- 「Walk/Run」->「Idle」を繋いでる、トランジションルールをダブルクリックで選択する
- 「変数」の「GroundSpeed」をドラッグ&ドロップして「Get」を選択して入れる
- 「<=」ノードを作成する
- 「<=」ノードのパラメーターを「5.0」する
- 「GroundSpeed」->「<=」に接続する
- 「<=」->「Result」に接続する
- コンパイルを実行して更新する
- プレイボタンを押すと、キャラクターを動かすと、移動速度によって停止と歩きモーションが切り替わります
- 次に走りモーションを付けるため、「Walk/Run」ステートの「A_Antbot_Walk」を削除する
- コンテンツドロワーを開き、「Character/Animations」フォルダを選択する
- 右クリックして「アニーション/ブレンドスペース」を作成する
- ファイル名を「BP_WalkRun」にする
- 「アセット詳細」の「水平軸/Name」を「Speed」に変更する
- 「アセット詳細」の「水平軸/Maximum Axis Value」を「400」に変更する
- 「アセットブラウザ」の「A_Antbot_Run」「A_Antbot_Walk」をグラフにドラッグ&ドロップして入れる
- 「A_Antbot_Walk」を左に「A_Antbot_Run」を右に配置する
- 「アセット詳細」の「解析/水平軸関数」を「Locomotion」に変更する
- 「解析/水平軸関数/Anlysis Properties」の「Bone/Socket1」を「foot_l」に変更する
- 「解析/水平軸関数/Anlysis Properties」の「Bone/Socket2」を「foot_r」に変更する
- 保存する
- 「ABP_Bot」の「Walk/Run」ステートに戻る
- 「アセットブラウザ」にある「BS_WalkRun」をドラッグ&ドロップで入れる
- 「BS_WalkRun」->「Output Animation Pose (Result)」に接続する
- 「変数」の「GroundSpeed」をドラッグ&ドロップして「Get」を選択して入れる
- 「GroundSpeed」->「BS_WalkRun(Speed)」に接続する
- コンパイルを実行して更新する
- プレイボタンを押すと、キャラクターを動かすと、移動速度によって停止->歩き->走りへモーションが切り替わります
AI Controller
動画時間:52:30~
- コンテンツドロワーを開いて「Framework/BP_Bot」をValleyレベル内(ワールド)にドラッグ&ドロップして入れる
- コンテンツドロワーを開く
- 「Framework」内で右クリックして「ブループリントクラス」を選択する
- 「All CLASSES」の検索で「ai」と入力する
- 検索候補から「AI Controller」を選択する
- 作成する名前を「BP_AIController」にする
- 「AI Controller」をダブルクリックして、編集エディターを開く
- 「イベントグラフ」タブを選択する
- 「Event Tick」を削除する
- 「AI MoveTo」ノードを追加する
- 「Set Timer by Event」ノードを追加する
- 「Event BeginPlay」->「Set Timer by Event(実行)」に接続する
- 「Set Timer by Event」の「Time」を「3」にする
- 「Custom Event」ノードを追加し、名前を「Move」にする
- 「Set Timer by Event(Event)」->「Move Custom Event(デリゲート)」に接続する
- 「Move Custom Event(実行)」->「AI MoveTo(実行)」に接続する
- 「Get Controlled Pawn」ノードを追加する
- 「Get Controlled Pawn」->「AI MoveTo(Pawn)」に接続する
- コンパイルを実行して更新する
- Valleyレベルを開き、追加した「BP_Bot」を選択する
- 「詳細/ポーン」の「AI Controller Class」を作成した「BP_AIController」にする
- 「ナビメッシュバウンズボリューム」を追加する
- 追加した「NavMeshBoundsVolume」を選択して「P」キーを押すと、地面との接触面が可視化される
- 「NavMeshBoundsVolume」のXZ軸のスケールをステージに収まるように拡大する
-
プレイボタンを押すと、ポッドが特定の位置(0,0,0)に自動で移動するのが確認出来る
-
「コンテンツドロワー」を開いて、「Framework/BP_Bot」をダブルクリックして編集エディターを開く
-
「Construction Script」タブを選択する
-
「コンポーネント/BP_Bot/Capsule Component/Mesh」をグラフの中にドラッグ&ドロップして入れる
-
「Create Dynamic Material Instance」ノードを追加する
-
「Meshh」->「Create Dynamic Material Instance(Target)」に接続する
-
「Construction Script」->「Create Dynamic Material Instance(実行)」に接続する
-
「Create Dynamic Material Instance」の「Return Value」から「Set Vector Parameter Value」ノードを追加する(個別に「Set Vector Parameter Value」追加しても別のが出てくるので「Return Value」からラインを引っ張って作る)
-
「Set Vector Parameter Value」の「Parameter Name」を「Color」にする
-
「Set Vector Parameter Value」の「Value」を「R:0.17 G:0.24 B:0.78」にする
-
コンパイルを実行して更新する
- 「M_BotBase」マテリアルで色指定しているパラメーター名を「Color」にする
- 追加したボットの色が変わっている
- 「BP_Bot」の編集エディターを再度開く
- 「Set Vector Parameter Value」の「Value」からラインを引いて「Promote to variable」を選択してノードを作成する
- 変数にColorのパラメーターが追加されるので、名前を「Color」にし、瞳アイコンをクリックして表示をONにする
- コンパイルを実行して変数定義を更新する
- 「Color」変数を選択する
- 「詳細」の「Color」を「R:0.78 G:0.34 B:0.00」にする
- コンパイルを実行して更新する
- レベルに戻って追加したボットの色が変わっている
- レベルの「BP_Bot」を選択する
- 「詳細」の「Color」を「R:0.014 G:0.072 B:0.780」にする
- ボットの色が変わる
Spawn and collect Orbs
動画時間:55:46~
- 「コンテンツドロワー」を開いて、「Props」を選択する
- 素材フォルダの「Props」から「SM_Door.FBX」「SM_Modular_WallDoor.FBX」「SM_Pickup_Orb.FBX」「SM_PressurePlate_Frame.FBX」「SM_PressurePlate_Platform.FBX」をそのままインポートする
- 「コンテンツドロワー」を開いて、「GameElements」を選択する
- 右クリックして「プループリント/Actor」を選択し、名前を「BP_Orb」にする
- 「BP_Orb」をダブルクリックして編集エディターを開く
- 「コンポーネント」に「SM_Pickup_Orb.FBX」をドラッグ&ドロップで入れる
- 「SM_Pickup_Orb」をドラッグ&ドロップで「DefaultSceneRoot」に上書きする
- 「詳細/コリジョン/コリジョンプリセット」を「OverlapOnlyPawn」にする
- コンパイルを実行して更新する
- 「編集」から「プロジェクト設定」を開く
- 「インプット」の「アクションマッピング」に新規でアクションマッピングのグループを追加し、名前を「SpawnOrb」にする
- グループ内にアクションマッピングを追加し「キーボード」の「スペースバー」にする
- 「コンテンツドロワー」を開いて、「Framework/BP_PlayerController」の編集エディターを開く
- ノード追加でAction Eventの「Spawnorb」を選択した「inputAction SpawnOrb」ノードを追加する
- 「inputAction SpawnOrb」の「Released」からラインを引いて「Spawn Action form class」を選択して「Spawn Action」ノードを追加する
- 「Spawn Action」の「Class」を「BP_Orb」を設定する
- 「Spawn Action」の「Spawn Transform」を右クリックして「構造体ピンの分割」を選択する
- イベントグラフ内に以前作成した「GetControlled Pawn」「Get Actor Location」のセットを複製する
- 「Get Actor Location」->「Spawn Action(Spawn Transform Location)」に接続する
- コンパイルを実行して更新する
- プレイボタンを押して実行すると、スペースキーを押すと、BP_Orbが生成される
- 「コンテンツドロワー」を開いて、「Framework/BP_AIController」の編集エディターを開く
- 「マイプループリント」の「関数」に新規の関数を追加し、名前を「FindOrb」にする
- 「FindOrb」関数を選択する
- 「詳細/アウトプット」に追加して、名前を「Success」にする
- さらに「アウトプット」に追加をして、名前を「OrbActor」にする
- 「OrbActor」の変数のタイプを「オブジェクトタイプ/Actor/オブジェクト参照」を選択する
- 「Find Orb」ノードと「Return Node」ノードの接続句を切る
- 「Get All Actors of Class」ノードを追加する
- 「Find Orb」->「Get All Actors of Class(実行)」に接続する
- 「Get All Actors of Class」の「Actor Class」を「BP_Orb」にする
- 「Get All Actors of Class(OutActors)」->「LENGTH」に接続する
- 「LENGTH」->「>」に接続する
- 「>」->「Branch」に接続する
- 「Get All Actors of Class(実行)」->「Branch(実行)」に接続する
- 「Return Node」を複製して片方の「Success」をOnにする
- 「Branch(True)」->「Return Node(実行)」(Success On)に接続する
- 「Branch(False)」->「Return Node(実行)」(Success Off)に接続する
- 「Get All Actors of Class(OutActors)」->「Get」に接続する
- 「Get」->「Return Node(OrbActor)」(Success On)に接続する
- コンパイルを実行して更新する
- 「BP_AIController」の「イベントグラフ」を開く
- 「FindOrb」関数を選択する
- 「詳細/グラフ」の「純粋」をONにする
- 「関数」の「FindOrb」をドラッグ&ドロップしてグラフに入れる
- 「Branch」ノードを作成する
- 「Move(実行)」->「Branch(実行)」に接続する
- 「FindOrb(Success)」->「Branch(Condition)」に接続する
- 「Branch(True)」->「AI MoveTo(実行)」に接続する
- 「FindOrb(OrbActor)」->「AI MoveTo(Target Actor)」に接続する
- 「Move」ノードを作成する
- 「AI MoveTo(on Success Actor)」->「Move(実行)」に接続する
- 「Set Timer by Event」の「Looping」を「ON」にする
- コンパイルを実行して更新する
- プレイボタンを押して実行すると、生成されたBP_OrbにBotが移動する
- 「BP_Orb」の編集エディターを開く
- 「コンポーネント/SM_Pickup_Orb」を右クリックして、「イベントを追加/ComponentBeginOverlapを追加」を選択すると「OnComponentBeginOverlap」が作成される
- 「Cast to Pawn」を追加する
- 「OnComponentBeginOverlap(実行)」->「Cast to Pawn(実行)」に接続する
- 「OnComponentBeginOverlap(Other Actor)」->「Cast to Pawn(Object)」に接続する
- 「Cast to Pawn」の「As Pawn」から「Is Player Controller」ノードを生成する
- 「Is Player Controller」の「Return Value」から「Branch」ノードを生成する
- 「Cast to Pawn(実行)」->「Branch(実行)」に接続する
- 「Destroy Actor」ノードを作成する
- 「Branch(False)」->「Destroy Actor(実行)」に接続する
- コンパイルを実行して更新する
- プレイボタンを押して実行すると、生成されたBP_OrbにBotが触れると消える。これによって生成されたBP_OrbにそってBotが移動する挙動になる
次回