ユーセンブログ

ゲーム開発に関することをたまに書きます

【Lumberyard】Script Canvas Tutorials(Opening and Closing a Door with Trigger Areas and Variables)邦訳

前回の続きです。

tachis.hatenablog.com

 トリガーエリアと変数でドアを開閉する

このチュートリアルは、「スクリプトキャンバスチュートリアル:制御可能なエンティティの作成」で学んだことを基にしています。 次のチュートリアルでは、制御可能な球体がトリガー領域に入ったり出たりすると開閉するドアを作成します。 これを行うには、次のようにします。

  • トリガー領域を作成する
  • イベントノードを追加する
  • 変数を追加する

始める前に、スクリプトキャンバスチュートリアル:制御可能なエンティティの作成を完了する必要があります。

 

ステップ1:ドアとトリガーエリアを作成する

ドアとトリガー領域を作成するには、子エンティティを持つエンティティを作成し、子エンティティにコンポーネントを追加します。

ドアとトリガーエリアを作成するには
  1. Lumberyard Editorで、コントロール可能な球の近くのPerspectiveビューポートを右クリックし、Create entityを選択してエンティティを作成します。

  2. エンティティインスペクタで、名前に「Door Group」と入力します。

  3. ドアを作成するには、次の手順を実行します。

    1. エンティティアウトライナで、[Door Group]を右クリックし、[子エンティティの作成]を選択します。この子エンティティはあなたのドアです。

    2. エンティティインスペクタの「名前」に「Door Mesh」と入力します。

    3. Asset Browserで、Game \ Objects \ Primitivesに移動します。

    4. ビューポートでドアメッシュエンティティを選択した状態で、box_1x1.cgfをアセットブラウザからエンティティインスペクタにドラッグしてメッシュコンポーネントを作成します。

    5. 「エンティティ」インスペクタで、「コンポーネントの追加」をクリックします。 物理の下で、静的物理をクリックします。 これにより、Static PhysicsコンポーネントがDoor Meshエンティティに追加されます。

    6. コンポーネントの追加をもう一度クリックします。 Physicsの下で、Mesh Colliderをクリックします。 このコンポーネントは、Door Meshエンティティの衝突シェイプを定義します。

    7. エンティティインスペクタのTransform、ScaleでXを2.5、Yを0.5、Zを4.0に設定します。

  4. トリガ領域を作成するには、次の手順を実行します。

    1. エンティティアウトライナで、[Door Group]を右クリックし、[子エンティティの作成]を選択します。この子エンティティはトリガー領域です。

    2. エンティティインスペクタで、名前に「Door Trigger」と入力します。

    3. コンポーネントの追加をクリックします。 [スクリプト]の下の[Trigger Area]をクリックします。

    4. [Trigger Area]で、[必須コンポーネントの追加]をクリックします。図形の下のボックス図形をクリックします。

    5. Box Shapeの下で、DimensionsでXを3.0に、Yを9.0に、Zを6.0に設定します。

    6. コンポーネントの追加をもう一度クリックします。 [スクリプト]の[スクリプトキャンバス]をクリックします。

    7. Lumberyard Editorで、Tools、Script Canvasを選択します。

    8. スクリプトキャンバスエディタで、「ファイル」、「新規スクリプト」を選択します。

    9. 新しいキャンバスが読み込まれたら、[ファイル]、[名前を付けて保存]を選択します。

    10. [ファイル名]に「door」と入力し、[保存]をクリックします。保存したファイルのディレクトリパスをメモしてください。これは後で必要になります。

    11. ランバーヤードエディタのエンティティインスペクタのスクリプトキャンバスで、参照(...)アイコンをクリックし、door.scriptcanvasfileに移動します。 door.scriptcanvasを選択し、[OK]をクリックします。

ステップ2:ドアを開閉するためのスクリプトを作成する

ドアとトリガエリアを設定したら、別のエンティティがトリガエリアに出入りするときにドアを開閉するスクリプトを作成できます。

ドアを開閉するスクリプトを作成するには
  1. スクリプトキャンバスエディタで、door.scriptcanvasファイルがまだ開いていない場合は、ステップ1:ドアとトリガ領域を作成して開きます。

  2. ノードパレットで、検索ボックスに「Vector3」と入力します。

  3. 変数、変数の作成で、ノードパレットからVector3をキャンバスにドラッグします。変数を使用して、スクリプト内の永続的な値を格納および変更できます。

  4. #Variable 1ノードで、次の操作を行います。

    1. 表示名に「opened_position」と入力します。

    2. デフォルト値の場合、Zを2に設定します。z軸の正の値は、ドアをスライドさせます。ドアエンティティはドアグループの子であるため、ローカル相対位置を使用してドアの開閉位置を制御できます。

  5. ノードパレットから別のVector3をキャンバスにドラッグします。

  6. #Variable 2ノードのDisplay Nameに「closed_position」と入力します。閉じた位置はデフォルト値の0,0,0を使用できます。

  7. ノードパレットから別のVector3をキャンバスにドラッグします。

  8. #Variable 3ノードのDisplay Nameに「destination_position」と入力します。この変数は、エンティティがトリガ領域に出入りするときにドアの目的地位置を設定します。

  9. ノードパレットで、検索ボックスに「trigger」と入力します。

  10. 「ゲームプレイ」の「トリガーエリア」で、「ノードパレット」から「入力エリア」をキャンバスにドラッグします。このイベントノードを使用すると、Lumberyard EBusメッセージングシステムを簡単に使用できます。

  11. [トリガーエリア]ノードで、[イベントの追加と削除]をクリックし、[エリア終了時にオン]チェックボックスをオンにします。トリガーエリアEBusからの入力イベントと終了イベントを公開します。

  12. ノードパレットで、検索ボックスにpositionと入力します。

  13. Node Paletteから2つの#destination_positionノードをキャンバスにドラッグします。変数を作成した後、ノードパレットでGetおよびSetノードを使用できます。これらのノードを使用すると、動的変数値を扱うことができます。コア変数ノードは変数を初期化します。

  14. キャンバスで、以下の接続を行います:

    1. On Area EnteredのOutピンを選択し、ドラッグしてSet#destination_positionノードのInピンに接続します。

    2. On Area ExitedのOutピンを選択し、それをドラッグして他のSet#destination_positionノードのInピンに接続します。

    3. #opened_positionのGetピンを選択し、それをドラッグして、On Area Enteredに接続されているSet#destination_positionノードのVector 3ピンに接続します。

    4. #closed_positionのGetピンを選択し、それをドラッグしてOn Area Exitedに接続されているSet#destination_positionノードのVector 3ピンに接続します。

    5. スクリプトが次のイメージのようになっていることを確認します。

  15. Door Meshエンティティの位置を取得し、目的地に補間するには、次の操作を行います。

    1. ノードパレットで、検索ボックスに「get local」と入力します。

    2. ノードパレットからローカル変換をキャンバスにドラッグします。このノードを使用して、Door Meshentityの現在の位置を取得し、宛先に補間することができます。現地通訳は、その親に対するエンティティの翻訳に適用されます。

    3. [ローカル変換を取得]ノードで、[ソース]テキストボックスで一時停止し、ターゲットボタンをクリックします。選択すると、ターゲットボタンの輪郭はオレンジ色になります。

    4. Entity Outlinerで、Door Meshを選択して、Door MeshエンティティをGet Local TranslationノードのSourceプロパティに割り当てます。

      注意

      エンティティ参照をリセットするには、[ソース]テキストボックスを右クリックし、[Set to Self]を選択します。

    5. スクリプトキャンバスエディタで、以下の接続を行います。

      1. Set #destination_positionノードのOutピンを選択し、それをドラッグしてGet Local TranslationのInピンに接続します。

      2. 他のSet#destination_positionノードのOutピンを選択し、それをドラッグしてGet Local TranslationのInピンに接続します。

        複数の接続が1つの論理ピンに入ると、いずれかの実行がトリガされるたびにノードが実行されます。複数の実行が同時にトリガーされた場合、ノードは同じゲームティックで複数回実行されます。

  16. 指定した時間(秒)でノードを実行するには、次の操作を行います。

    1. ノードパレットで、検索ボックスにdurationと入力します。

    2. ノードパレットから長さをキャンバスにドラッグします。

    3. Get Local TranslationのOutピンを選択し、ドラッグしてDurationのStartピンに接続します。 Durationノードをトリガーすると時間がリセットされます。

    4. 期間ノードで、期間に1.0(秒)を入力します。

  17. 現在の位置と目的地の間の補間を設定するには、以下を実行します。

    1. ノードパレットで、検索ボックスに「lerp」と入力します。

    2. 数学、Vector3の下で、ノードパレットからLerpをキャンバスにドラッグします。このノードは、Percentageプロパティに基づいて2つの値をブレンドします。

    3. S持続時間のOutピンを選択し、ドラッグしてLerpのInピンに接続します。

    4. 期間のElapsedピンを選択し、ドラッグしてLerpのPercentageピンに接続します。

    5. Get Local TranslationのTranslationピンを選択し、ドラッグしてLerpのStartピンに接続します。

    6. ノードパレットで、検索ボックスにdestinationを入力します。

    7. ノードパレットから#destination_positionをキャンバスにドラッグします。

    8. Get_destination_positionのVector 3ピンを選択し、ドラッグしてLerpのEndピンに接続します。

    9. スクリプトが次のイメージのようになっていることを確認します。

  18. Durationノードが現在の位置と目的地の位置の間でブレンドされているときに、ドアの位置を設定するには、次の操作を行います。

    1. ノードパレットで、検索ボックスに「set local translation」と入力します。

    2. ノードパレットからSet Local Translationをキャンバスにドラッグします。

    3. LerpのOutピンを選択し、それをドラッグして、Set Local TranslationのInピンに接続します。

    4. LerpのVector 3ピンを選択してドラッグし、Set Local TranslationのTranslationピンに接続します。

    5. [Set Local Translation]ノードで、[Source]テキストボックスで一時停止し、ターゲットボタンをクリックします。選択すると、ターゲットボタンの輪郭はオレンジ色になります。

    6. Entity Outlinerで、Door Meshを選択して、Set Local TranslationノードのSourceプロパティにDoor Meshエンティティを割り当てます。

  19. スクリプトが次のイメージのようになっていることを確認します。

  20. スクリプトキャンバスエディタで、ファイル、保存を選択します。 Ctrl + Sを押すこともできます。

  21. ランバーヤードエディタで、Ctrl + Gキーを押してゲームモードに入り、スクリプトをテストします。

  22. 球をドアトリガーエリアに移動してドアをスライドさせて開くには、W、A、Dキーを押します。

  23. トリガーエリアの外に球を移動してドアを閉じてスライドさせるには、Sキーを押します。

  24. スクリプトのテストが終了したら、Escキーを押します。