Blueprintsは、Unreal Engine 4のビジュアルスクリプトシステムであり、ゲームのプロトタイプをすばやく作成する方法です。 コードを1行ずつ記述する代わりに、すべてを視覚的に行うことができます。ノード(ノード)をドラッグアンドドロップし、インターフェイスでプロパティを設定し、「ワイヤ」を接続します。
ラピッドプロトタイピングに加えて、ブループリントはプログラマー以外の人のためのスクリプト作成も簡素化します。
チュートリアルのこの部分では、次の操作にブループリントを使用します。
- トップビューカメラのセットアップ
- 単純な動きでプレーヤー制御の俳優を作成
- プレーヤー入力設定
- プレーヤーと接触すると消える要素を作成する
注:このパートでは、Unreal Engine 4のインターフェースを理解していることを前提としているため、コンポーネントやノードなどの基本的なブループリントの概念を理解する必要があります。 知識を更新する必要がある場合は、Unreal Engine 4チュートリアルの最初の部分を読んでください 。
この部分ではベクターも使用されます。 それらに慣れていない場合は、gamedev.netのベクターに関するこの記事をお勧めします。
注:この記事は、Unreal Engineチュートリアルの8つのパートの1つです。
- パート1:エンジンの紹介
- パート2:ブループリント
- パート3:材料
- パート4:UI
- パート5:簡単なゲームを作成する方法
- パート6:アニメーション
- パート7:サウンド
- パート8:パーティクルシステム
- パート9:人工知能
- パート10:シンプルなFPSを作成する方法
仕事を始める
初期プロジェクトをダウンロードして解凍します。 プロジェクトを開くには、プロジェクトフォルダーに移動してBananaCollector.uprojectを開きます 。
注:プロジェクトがアンリアルエディタの以前のバージョンで作成されたことを通知するウィンドウが開く場合、すべてが正常に機能しています(エンジンは頻繁に更新されます)。 コピーを作成するオプションを選択するか、プロジェクト自体を変換するオプションを選択できます。
下の画像はシーンを示しています。 プレーヤーがオブジェクトを移動して収集するのは、その中にあります。
ナビゲーションを簡単にするために、図に示すように、プロジェクトファイルをフォルダーに分割しました。
赤で強調表示されたボタンは、ソースパネルの表示または非表示に使用できます。
プレイヤー作成
コンテンツブラウザで、 ブループリントフォルダを参照します。 [ 新規追加 ]ボタンをクリックして、 ブループリントクラスを選択します。
プレーヤーが入力した情報をアクターに受信してほしいので、 Pawnクラスが適しています。 ポップアップウィンドウでPawnを選択し、 BP_Playerという名前を付けます。
注: 文字クラスも問題ありません。 デフォルトのmoveコンポーネントもあります。 ただし、独自の移動システムを実装するため、 Pawnクラスで十分です。
カメラアタッチメント
カメラは、プレイヤーが世界を見る方法です。 プレーヤーを見下ろすカメラを作成します。
コンテンツブラウザで、 BP_Playerをダブルクリックして、ブループリントエディタで開きます 。
カメラを作成するには、[コンポーネント]パネルに移動します。 [ コンポーネントの追加]をクリックして、[ カメラ]を選択します。
カメラを上から下に向けるには、プレーヤーの上にカメラを配置する必要があります。 カメラコンポーネントを選択した後、[ビューポート]タブに移動します。
Wキーを押してモーションパッドをアクティブにし、カメラを(-1100、0、2000)に移動します。 または、[ 場所]フィールドに座標を入力できます。 詳細パネルの変換セクションにあります。
カメラを見失った場合は、 Fキーを押して焦点を合わせます。
次に、 Eキーを押して回転マニピュレーターをアクティブにします。 カメラをY軸に沿って-60度下に回転させます。
ディスプレイプレーヤー
プレイヤーのキャラクターを赤い立方体で指定するため、静的メッシュコンポーネントを使用して表示する必要があります。
最初に、コンポーネントパネルの空きスペースを左クリックして、 カメラコンポーネントの選択を解除します。 これが行われない場合、次に追加されるコンポーネントはカメラの子になります。
[ コンポーネントの追加]をクリックして、[ 静的メッシュ]を選択します。
赤い立方体を表示するには、 静的メッシュコンポーネントを選択し、[詳細]タブに移動します。 Static Meshの右側にあるドロップダウンリストをクリックして、 SM_Cubeを選択します。
次が表示されます(表示されていない場合は、ビューポート内でFを押してキューブに焦点を合わせることができます)。
今こそ、俳優Pawnプレイヤーをスポーンするときです。 [ コンパイル]をクリックして、メインエディターに戻ります。
プレイヤースポーン
プレイヤーがポーンをコントロールするには、次の2つのことが言えます。
- プレーヤーが制御するPawnクラス。
- ポーンスポーンプレイス
新しいゲームモードクラスを作成して、最初のタスクを完了することができます 。
ゲームモードの作成
ゲームモードクラスは、プレーヤーのゲームへの参加方法を制御するクラスです。 たとえば、マルチプレイヤーゲームでは、ゲームモードを使用して各プレイヤーのスポーンを設定します。 さらに重要なことは、ゲームモードが決定することです。 プレイヤーが使用するポーン。
コンテンツブラウザに移動し、 ブループリントフォルダに移動します。 [ 新規追加 ]ボタンをクリックして、 ブループリントクラスを選択します。
ポップアップメニューから[ ゲームモードベース ]を選択し、 GM_Tutorialという名前を付けます。
ここで、デフォルトで使用されるPawnクラスを指定する必要があります。 GM_Tutorialをダブルクリックして開きます。
[詳細]パネルに移動し、[ クラス]セクションを確認します。 [ デフォルトのポーンクラス] ドロップダウンリストをクリックし、 [ BP_Player]を選択します。
新しいゲームモードを使用するには、使用するゲームモードをレベルに伝える必要があります。 これは、 ワールド設定で指定できます。 [ コンパイル]をクリックして、ブループリントエディターを閉じます。
各レベルには独自のパラメーターがあります。 これらのオプションにアクセスするには、 Window \ World Settingsを選択します。 または、ツールバーに移動して、[ 設定] \ [ワールド設定]を選択します。
[詳細]タブの横に、新しい[ワールド設定]タブが開きます。 その中で、 GameMode Override ドロップダウンリストをクリックし、 GM_Tutorialを選択します。
これで、クラスがGM_Tutorialで選択されたクラスに変更されたことがわかります。
最後に、プレイヤーのスポーンポイントを設定する必要があります。 これは、 プレーヤーの開始アクターレベルに配置することによって行われます。
プレーヤーの開始の配置
プレーヤーをスポーンするプロセスで、ゲームモードはプレーヤー開始アクターを検索します。 ゲームモードがそれを見つけると、そこでプレイヤーをスポーンしようとします。
Player Startを配置するには、[モード]パネルに移動し、 Player Startを見つけます。 Players Startを 左クリックして、モードパネルからビューポートにドラッグします 。 マウスの左ボタンを放して配置します。
どこにでも配置できます。 完了したら、ツールバーに移動して[ 再生 ]をクリックします。 Player Startの場所にスポーンされます。
ゲームを終了するには、ツールバーの[ 停止 ]ボタンをクリックするか、 Escキーを押します 。 カーソルが表示されない場合は、 Shift + F1を押します 。
移動できない場合、これはゲームのようではありません。 次のタスクは、入力パラメーターを構成することです。
入力設定
キーをアクションに割り当てることをキーバインディングと呼びます。
Unrealでは、押されたときにイベントをトリガーするようにキーバインディングを設定できます。 イベントは、特定のアクション中に実行されるノードです(この場合、指定されたキーが押されたとき)。 イベントがトリガーされると、イベントに接続されているすべてのノードが実行されます。
このキーバインディング方法は、コード内のキーをハードコーディングする必要がないことを意味するため、便利です。
たとえば、マウスの左ボタンをスナップしてShootという名前を付けることができます。 射撃できる俳優は、射撃イベントを使用して、プレーヤーがマウスの左ボタンを押すタイミングを知ることができます。 キーを変更する場合は、入力パラメーターでこれを実行できます。
キーをハードに設定した場合、各アクターに入り、キーを個別に変更する必要があります。
軸とアクションのバインド
入力オプションに移動するには、 編集\プロジェクト設定に移動します。 [ エンジン]セクションで、左側の[ 入力]を選択します。
Bindingsセクションは入力を構成します。
アンリアルは、キーバインディングを作成する2つの方法を提供します。
- バインディングアクション:押される状態と押されない状態の2つの状態のみが可能です。 アクションイベントは、キーを押すか放したときにのみ発生します。 大砲の発射など、中間状態を持たないアクションに使用されます。
- 軸バインディング:軸は、軸値と呼ばれる数値を送信します (これについては後で説明します)。 Axisイベントはすべてのフレームを発生させます。 通常、スティックまたはマウスの制御を必要とするアクションに使用されます。
このチュートリアルでは、 軸バインディングを使用します。
モーションスナップの作成
最初に、 車軸バインディングの 2つのグループを作成します 。 グループを使用すると、複数のキーを単一のイベントにバインドできます。
新しい軸スナップグループを作成するには、 軸マッピングの右側にある+アイコンをクリックします。 2つのグループを作成し、それらにMoveForwardおよびMoveRightという名前を付けます。
MoveForwardは前後に駆動します。 MoveRightは、左右の動きを制御します。
ムーブメントを4つのキーW 、 A 、 S 、 Dにバインドします。 これまでのところ、キーバインド用のスロットは2つしかありません。 グループ名フィールドの横にある+アイコンをクリックして、各グループにもう1 つの軸バインディングを追加します。
キーをバインドするには、キーのリストを含むドロップダウンリストをクリックします。 WキーとSキーをMoveForwardにバインドします。 AキーとDキーをMoveRightにバインドします。
次に、「 スケール」フィールドに値を設定する必要があります。
軸値と入力スケール
スケールフィールドを定義する前に、 軸の値を操作する方法についてさらに学習する必要があります 。
軸の値は、入力の種類とその使用方法によって決まる数値です。 ボタンとキーを押すと、1が出力され、スティックの方向と傾きに応じて、スティックの出力値は-1〜1になります。
軸の値を使用して、ポーンの速度を制御できます。 たとえば、スティックを最後まで押した場合、軸の値は1になります。半分押した場合、値は0.5になります。
軸の値に可変速度を掛けると、スティックで動きの速度を調整できます。
軸の値を使用して、軸に沿った方向を設定することもできます。 Pawnの速度に正の軸値を掛けると、正のバイアスが得られます。 負の軸値を使用すると、負のオフセットが得られます。 このオフセットをPawnの位置に追加して、その移動の方向を設定します。
キーボードキーは値1または0のみを出力できます。その後、 スケールを使用してそれらを負の数値に変換できます。 これは、軸の値を取得し、それにスケールを掛けることで実行できます。
正(軸値)に負(スケール)を掛けると、負の値が得られます。
Scaleフィールドをクリックして-1を入力し、キーSとAをスケーリングします。
今から楽しみが始まります:Pawnを動かします! プロジェクト設定を閉じ、ブループリントエディターでBP_Playerをダブルクリックして開きます。
プレイヤーの動き
まず、モーションバインディングのイベントを選択する必要があります。 イベントグラフの空のスペースを右クリックして、ノードのリストを開きます。 このメニューでMoveForwardを見つけます。 Axis EventsリストからMoveForwardノードを追加します。 軸の値には緑のノードではなく、軸のイベントには赤のノードが必要であることに注意してください。
MoveRightに対してプロセスを繰り返します。
次に、 MoveForwardのノードを構成します。
変数を使用する
移動するには、ポーンの移動速度を指定する必要があります。 速度を示す簡単な方法の1つは、速度を変数に格納することです 。
変数を作成するには、[マイブループリント]タブに移動し、[ 変数]セクションの右側にある[ + ]アイコンをクリックします。
新しい変数を選択したら、[詳細]タブに移動します。 変数名をMaxSpeedに変更します。 その後、変数の型をFloatに置き換えます。 これを行うには、[ 変数の種類]の横にあるドロップダウンリストをクリックして、[ フロート]を選択します。
次に、デフォルト値を設定する必要があります。 ただし、設定するには、ツールバーの「 コンパイル」をクリックする必要があります。
変数を選択した後、「詳細」タブに移動します。 [ デフォルト値]セクションに移動し、 デフォルトの MaxSpeedを10に変更します。
次に、 MaxSpeed変数を[マイブループリント]タブからイベントグラフにドラッグします。 メニューから「 取得」を選択します。
ここで、 MaxSpeed に軸の値を乗算して、最終的な速度と方向を取得する必要があります。 float * floatノードを追加し、 Axis ValueとMaxSpeedをアタッチします 。
プレイヤーの道順を取得する
前進するには、Pawnがどこを見ているのかを知る必要があります。 幸いなことに、Unrealにはこのためのノードがあります。 Get Actor Forward Vectorノードを追加します。
次に、 運動入力ノードを追加します。 このノードは方向と値を取得し、それらを保存されたオフセットに変換します。 次のようにノードを接続します。
白い線は実行チェーンを示します。 つまり、プレーヤーが入力軸を移動すると、 InputAxis MoveForwardノードを実行するイベントが生成されます。 白い線は、その後、 移動入力の追加ノードが実行されることを示しています。
移動入力の追加ノードは、 入力で次のデータを受け取ります。
- ターゲット :自己を設定します。この場合、これはプレイヤーのキャラクター(赤い立方体)です。
- World Direction :ターゲットが移動する方向。この場合、プレイヤーが見ている方向です。
- スケール値 :プレーヤーを移動する距離。この場合、これはmax_speed * axis_value(これは思い出すように、-1から1の範囲の値です)です。
MoveRightのプロセスを繰り返しますが、 Get Actor Forward VectorをGet Actor Right Vectorに置き換えます。 上記の手順を参照せずに自分で試してみてください!
オフセットを追加
Pawnを実際に移動するには、Add Movement Inputによって計算されたオフセットを取得し、Pawnの場所に追加する必要があります。
本質的には、ゲームの各フレームでプレーヤーを少し動かすことになるので、フレームごとに生成されるイベントティックイベントにムーブを追加する必要があります。
イベントグラフのイベントティックノードに移動します。 非アクティブで左側にある必要がありますが、存在しない場合は、自分でノードを作成します。
オフセットを取得するには、 Consume Movement Input Vectorノードを作成します。 オフセットを追加するには、 AddActorLocalOffsetノードを作成します。 その後、次のように接続します。
これは、ゲームの各フレームでムーブの入力全体を保存し、それをアクターの現在の場所に追加することを意味します。
[ コンパイル ]をクリックし、メインエディターに移動して[ 再生 ]をクリックします。 これでシーン内を移動できます!
ただし、小さな問題があります。 強力なコンピューターは、フレームをより速くレンダリングできます。 イベントティックはフレームごとに呼び出されるため、ノードの移動はより頻繁に実行されます。 これは、ポーンが強力なコンピューター上でより速く移動することを意味します。
この問題を解決するには、動きがフレームレートに依存しないようにする必要があります。
注:フレームレート依存性の影響を示すためにキーバインディングを設定しました。 0を押して周波数を1秒あたり60フレームに制限し、 1を押して制限を解除します。 両方のフレームレートで移動してみてください。速度の違いがわかります。
フレームレートの独立性
フレームレートから独立しているため、フレームレートに関係なく、常に同じ結果が得られます。 幸いなことに、Unrealでこのような独立性を実現するのは簡単です。
ゲームを終了し、 BP_Playerを開きます 。 次に、 イベントティックノードに移動して、 デルタ秒を確認します。
デルタ秒は、前のイベントティックから経過した時間です。 オフセットにデルタ秒を掛けることで、フレームレートに依存しない動きになります。
たとえば、ポーンの最大速度は100です。前のイベントティックから1秒が経過すると、ポーンは完全な100ユニットに移動します。 0.5秒が経過すると、50単位移動します。
動きがフレームレートに依存している場合、ポーンはフレーム間の時間に関係なく、各フレームで100ユニットを移動します。
オフセットにデルタ秒を乗算するには、 vector * floatノードを追加します。 その後、次のようにノードを接続します。
フレーム間の時間(デルタ秒)は非常に短いため、ポーンの移動ははるかに遅くなります。 これは、デフォルトのMaxSpeed値を600に置き換えることで修正できます。
おめでとうございます、あなたはなんとかフレームレートからの独立を達成することができました!
キューブがすべてのオブジェクトを通過することに気付くかもしれません。 これを修正するために、 衝突に精通する必要があります。
今、私たちは理論に直面しなければならないので、ヘルメットを着用してください!
アクターの衝突
衝突を思い出すとき、自動車事故を想像します。 幸いなことに、Unrealでの衝突ははるかに安全です。
オブジェクトと衝突できるようにするには、アクタは衝突空間の指定(通常はコリジョンと呼ばれます)が必要です。 次のスペースのいずれかを使用できます。
- コリジョンメッシュ:メッシュをインポートするときに自動的に生成されます(このオプションを選択した場合)。 ユーザーは、3Dエディターで任意の衝突メッシュを作成することもできます。 赤い立方体にはすでに自動生成された衝突メッシュがあります。
- 衝突コンポーネント:平行六面体、カプセル、球の3つの形式のいずれかです。 コンポーネントパネルで追加できます。 通常、単純な衝突に使用されます。
以下は、キャラクターとその衝突の例です。
衝突は、俳優の衝突が別の俳優の衝突に触れると発生します。
次に、衝突をオンにします。
衝突介在物
衝突メッシュはあるのに、なぜキューブがオブジェクトと衝突しないのか疑問に思われるでしょう。 アクターを移動するとき、Unrealは衝突のルートコンポーネントのみを考慮します。 Pawnのルートコンポーネントには衝突がないため、すべてのオブジェクトを通過します。
注:ルートコンポーネントに衝突がないアクターは、他のアクターをブロックする可能性があります。 しかし、俳優を動かせば、彼は何にも遭遇しません。
したがって、衝突メッシュを使用するには、 StaticMeshがrootでなければなりません。 これを行うには、[コンポーネント]パネルに移動します。 次に、マウスの左ボタンを押しながら StaticMeshをDefaultSceneRootに ドラッグします 。 StaticMeshを新しいルートコンポーネントにするには、マウスの左ボタンを放します 。
衝突が機能し始めるには、もう1つのアクションを実行する必要があります。 イベントグラフに切り替えて、 AddActorLocalOffsetノードに移動します。 Sweep入力を見つけ、 チェックボックスを 左クリックして値をtrueに変更します 。
AddActorLocalOffsetは、アクターを新しい場所にテレポートすることを約束します。 Sweepは、アクターが古い場所と新しい場所の間にあるすべてのものに直面することを保証します。
メインエディターに移動し、[ 再生 ]をクリックします。 これで、キューブはレベルとの衝突に応答します!
最後に作成するのは、プレイヤーのキャラクターと接触すると消えるアイテムです。
アイテム作成
一般的に、アイテムはプレイヤーが収集するオブジェクトです。 BP_Bananaをアイテムとして使用します。
キューブとオブジェクトの接触を認識するには、衝突によってトリガーされるイベントのノードが必要です。 このようなイベントを生成するには、 衝突反応を使用できます。
衝突反応は、アクターが他のアクターとの衝突にどのように反応するかも決定します。 衝突反応には、 無視 、 重複、 ブロックの 3つのタイプがあります。 相互作用の方法は次のとおりです。
ここではオーバーラップとブロックの両方を使用できますが、このチュートリアルではオーバーラップのみを使用します。
競合反応タスク
ゲームを閉じてBP_Bananaを開きます 。 StaticMeshコンポーネントを選択し、詳細パネルに移動します。 衝突反応は衝突セクションで定義されます。
ご覧のとおり、ほとんどのパラメーターは非アクティブです。 それらを変更可能にするには、 衝突プリセットの横にあるドロップダウンリストを クリックします 。 リストから「 カスタム」を選択します。
次に、アイテムとキューブの衝突に対する反応を示す必要があります。
コンポーネントにはobject typeという属性があります。 オブジェクトタイプは、同様のアクターをグループ化する便利な方法です。 オブジェクトタイプの詳細については、 こちらをご覧ください 。
キューブのタイプはWorldDynamicなので 、このタイプの衝突に対する反応を変更する必要があります。 Collision Responsesセクションで、 WorldDynamic collisionsへの応答をOverlapに変更します。 これは、 WorldDynamic の右側にある中央のチェックボックスを クリックして実行できます。
衝突処理
衝突を処理するには、 オーバーレイイベントを使用する必要があります。 コンポーネントパネルに移動し、 StaticMeshを右クリックします 。 コンテキストメニューで、[ イベントの追加 ] \ [ OnComponentBeginOverlapの追加 ]を選択します。
そこで、 OnComponentBeginOverlap(StaticMesh)ノードをイベントグラフに追加します。
最後に、 DestroyActorノードを作成し、それをOnComponentBeginOverlap(StaticMesh)ノードに接続します 。 名前が示すように、ゲームからターゲットアクターを削除します。 ただし、ターゲットアクターがないため、ターゲットアクターを破壊します。
アイテムの配置
ブループリントエディターを閉じて、ブループリントフォルダーに移動します。
左マウスボタンを押したまま BP_Bananaをビューポートにドラッグ して 、バナナの配置を開始し ます 。
[ 再生]をクリックして、バナナの収集を開始します。
次はどこに行きますか?
完成したプロジェクトはここからダウンロードできます 。
Unreal Engineのスペシャリストになるための別のステップを踏み出しました。
トレーニングを続けたい場合は、シリーズの次の投稿をお読みください。UnrealEngineのマテリアルを詳しく見ていきます。