3D ゲームキットウォークスルー

Tutorial

Beginner

+0XP

130 mins

23

Unity Technologies

3D ゲームキットウォークスルー

このガイドでは、ProBuilder と PolyBrush を使ったレベルの構築から、3D Game Kit に含まれるすべてのインタラクティブ機能とレベルを飾る要素の使用までを詳細に説明しています。このチュートリアルのほとんどのステップは、それぞれ単独のチュートリアルとして使うことができますが、関連するチュートリアルも参照していただくことで、より深い理解を得ることができます。

素早く理解したい場合は、クイックスタートガイドを参照してください。こちらはよりコンパクトで、それ自体で完結したチュートリアルおよびサンプルを集めたものとなっています。最初はクイックスタートガイドのステップ 2 に従って新しいシーンを作るところから始めるとよいでしょう。

Languages available:

1. ウォークスルーの概要

このガイドでは、ProBuilder と PolyBrush を使ったレベルの構築から、3D Game Kit に含まれるすべてのインタラクティブ機能とレベルを飾る要素の使用までを詳細に説明しています。

このチュートリアルのほとんどのステップは、それぞれ単独のチュートリアルとして使うことができますが、関連するチュートリアルも参照していただくことで、より深い理解を得ることができます。

素早く理解したい場合は、クイックスタートガイドを参照してください。こちらはよりコンパクトで、それ自体で完結したチュートリアルおよびサンプルを集めたものとなっています。

最初はクイックスタートガイドのステップ 2 に従って新しいシーンを作るところから始めるとよいでしょう。

2. ProBuilder を使った編集

新しいシーンには、すでに Ellen が走りまわることができる地面が用意されています。この地面について少し見てみましょう。

  • Hierarchy ウィンドウに移動します。
  • Plane という名前のゲームオブジェクトを選択します。

この Plane は、Unity で 3D オブジェクトを作成、編集できるツール「ProBuilder」を使って作成されています。シーンに ProBuilder メッシュがあるので、ProBuilder ウィンドウが開いています。

ウィンドウが開いていない場合は、トップメニューから開くことができます。

  • Tools > ProBuilder > ProBuilder Window をクリックします。

グレイボクシング

グレイボクシングとは、作りたいレベルのアウトラインや計画を立てるために、シーンの中でシンプルな図形(ジオメトリ)を作成する技術です。ゲーム開発では、これは素早くプロトタイプを作成してアイデアを試す、レベルデザインの初期段階にあたります。ProBuilder はグレイボクシングに最適なツールです。ここでは、シーン内に新しくシェイプを作ってみましょう。

  • ProBuilder ウィンドウに移動します。
  • 「New Shape」の横にある「+」をクリックしてください。

すると Shape Tool ウィンドウが開きます。

Shape Selector ドロップダウンから、さまざまな形状のシェイプを選んで作成することができます。

ここではデフォルトのシェイプである立方体を作ります。

  • Cube を選択します。
  • Dimensions3,3,3 に指定します。
  • Build Cube をクリックします。

シーンの中央に立方体ができると思います。地面は立方体の真ん中よりも高いので、立方体が地面にめりこむ形になります。

移動ツールを使って立方体を動かしましょう。シーンビューの中にある矢印のいずれかをクリックして、好きな場所に動かしてみましょう。

ProBuilder のさまざまなツールを使って、立方体の形状を変えることができます。ProBuilder を使って Unity の中で 3D モデルを作る方法の詳細を学びたい方は、ProBuilder101 tutorialドキュメンテーションを参照してください。

この立方体を削除してみましょう。

  • Hierarchy ウィンドウの Cube を選択します。
  • キーボードの Delete(Mac の場合は Cmd + Backspace)キーを押します。

次は地面を作り替えたりペイントしたりしてみましょう。

3. アシッドプールを作る

PolyBrush

地面は ProBuilder のプレーンでできています。これは普通平らなのですが、PolyBrush を使って凸凹を作り、地面らしく見えるよう Mesh をペイントすることができます。地面に凹みを作り、Ellen がダメージを受けるアシッドプールを作ってみましょう。

メッシュ:メッシュは 3D 空間で立体物の印象を作り出すように排列された三角形の集まりです。三角形は 3 つの角の点、すなわち頂点によって定義されます。

注:PolyBrush は現在ベータ版です。ツールの使用中にバグに遭遇することがあります。

これからレベルを作っていく地面のスケールを変更して、少し大きくしてみましょう。

  • ヒエラルキーで Plane を選択します。
  • インスペクターに移動します。
  • Scale の X を 2 にします。
  • Scale の Y は 1 のままにします。
  • Scale の Z を 2 にします。

PolyBrush ウィンドウを開き、編集を始めます。

  • Tools > PolyBrush > PolyBush Window の順にメニューをたどります。

注意:PolyBrush は現在ベータ版のため、レイアウトは変更されることがあります。

Plane を選択した状態で、

  • PolyBrush ウィンドウの「Push/Pull」アイコン(下の赤枠内)をクリックします。
  • Plane を選び、シーンビュー内で Plane の上にマウスカーソルを合わせます。
  • Push/Pull ギズモがマウスを動かした場所に表示されます。
  • 左クリックすると、クリックした場所の頂点が持ち上がります。
  • Ctrl キーを押しながら左クリックすると、クリックした場所の頂点が押し下げられます。

基本操作はこれだけです。Ctrl + 左クリックで地面に凹みを作り、プールの形にしていきましょう。そんなに深くしなくても大丈夫です。

  • 凹みを作り終わったら再度「Push/Pull」アイコンをクリックし、ツールの選択を解除します。

下の画像のような凹みができたでしょうか。

PolyBrush とその使い方の詳細については、チュートリアルドキュメンテーションを参照してください。

では、アシッドプールの作成に戻りましょう。

Acid の追加

酸性の液体を表現した Acid というプレハブを Project ウィンドウで探しましょう。Project ウィンドウはすべてのプレハブとツールが格納されている場所でしたね。

  • Project ウィンドウで Assets > 3D GameKit > Prefabs > Interactables の順にフォルダーをたどります。
  • Acid プレハブを左クリックして、Hierarchy ウィンドウにドラッグします。

Acid を表す図形がシーンビューのどこかに表示されます。Unity では、フレーム選択でオブジェクトを素早く見つけることができます。

  • Hierarchy で Acid を選択します。
  • シーンビューにマウスを置きます。
  • キーボードの F を押します。

以上の操作で、Acid がシーンビューのフレーム内に収められます。

Acid は大きすぎるので、少し小さくしましょう。

  • Acid を選んだ状態で、キーボードの R キーを押し、拡大縮小ツールを選択します。
  • 中央の白い箱をクリックしてドラッグすると、Acid が小さくなります。

また、Acid は適切な位置にないので、移動ツール(Acid を選択してキーボードの W キーを押す)を使い、Acid を Plane のすぐ下に置きましょう。先ほど作ったプールから、わずかに Acid が見える程度の位置に持っていきます。

望みの位置になるまで、Acid を移動させたり、大きさを調整してみてください。

ヒント:Acid は作ったプールより少し大きい程度のサイズで十分です。

  • 再生ボタンをクリックして、泡立つアシッドプールがシーンにできているか確認してください。

注意:3DGamekit ツールバーメニューから新しいシーンを作った場合、デフォルトで DeathVolume エリアができています。これは空間を編集しても問題がない程度のサイズにしてあります。地形の高さを下げるときに、この DeathVolume エリアより低くしないように注意してください。もし低くなっていると、Ellen はスタート直後に倒れてしまいます。

デフォルトの DeathVolume のトップビュー

デフォルトの DeathVolume のサイドビュー

DeathVolume の追加

今の時点では、Ellen は Acid に入ってもダメージを受けません。これだと危険地帯として機能していないですね。

Ellen が Acid に触れるとダメージを受けるようにするには、次のように設定します。

  • Hierarchy で Acid を選びます。
  • Inspector ウィンドウで Add Component をクリックします。
  • 検索ボックスに「death」と入力します。
  • Death Volume スクリプトを選択します。

これで Acid に Death Volume スクリプトが追加されます。このスクリプトは、Ellen のライフを 0 にするようゲームに指示するスクリプトです。

  • 再生ボタンを押して、レベルをテストします。アシッドプールに向かって走っていってみましょう。Ellen は倒れて、その後すぐにリスポーンします。

4. PolyBrush を使った頂点ペインティング

PolyBrush には、頂点カラーリングと呼ばれる 3D アーティストに便利な機能があり、ゲームオブジェクトの表面に直接ペイントするのではなく、頂点(サーフェスを作るために結合する点)にペイントすることができます。

Acid Pool や Death Volume の作成に Push/Pull 機能を使用したのと同じように、このペイントは頂点を使用して表面全体にペイントします。スクリーンショットでは頂点がハイライトされており、線はその間のポリゴンのエッジを表しています。

頂点ペイントでは、サーフェスのエッジに沿って頂点と最も近い頂点を取り、それらの間でカラー/テクスチャを「ブレンド」するのに対し、サーフェスに直接ペイントできると思っているかもしれないので、最初は不思議に思うかもしれません。

これはマテリアルで処理され、シェーダー(スクリプト)を利用してテクスチャ(ビットマップイメージ)をグループ化し、GameObject上でレンダリングします。これらのトピックの詳細については、マニュアルのマテリアル、シェーダー、テクスチャのページを参照してください。

それでは、早速ペイントを始めてみましょう。

ペインティングとマテリアル

先にキットを使用してシーンを作成したときには、平面はすでにシェーダーマテリアルを添付して作成されていました。次のステップでは、これがどのように作成されたかを確認し、ビジュアルスタイルとマテリアルを構成するものをより深く掘り下げていきます。

まずは、基本的なプレーンの設定とマテリアルのアタッチから始めましょう。

  • 既に開いていない場合は、Tools > ProBuilder > ProBuilder Window から ProBuilder を開きます。
  • ProBuilder ウィンドウから New Shape を選択します。
  • Shape ウィンドウのドロップダウンから Plane を選択します。

これにより、いくつかのデフォルト値が添付されたプレーンがシーンビューに追加され、以前に作成されたデフォルトプレーンの隣に配置されます。デモのように見えるようにするには、ProBuilder ウィンドウで Plane の値を設定します。

  • Width: 20
  • Height:20
  • Width Segments: 10
  • Height Segments: 10

インスペクタビューでは、次のように設定します。

  • Position: X: -30 Y: 0 Z: -10

これで、レベルで生成された既存の平面の隣に新しく作った平面が配置されます。入力した値で完全に整列していない場合は、必要に応じて調整します。

Shape ツールウィンドウに戻り、Build Plane をクリックします。

インスペクターを見てみると、現在アタッチされているシェーダーは単純に Standard Vertex Color で、グレーアウトして表示されていることがわかります。

これにより、プロジェクト内のすべてのマテリアルが表示されるように Project ビューが更新されます。

3D Gamekit では、メインプレーンにアタッチされているデフォルトのマテリアルは Default_Ground_Mat になっています。

  • 検索フィールドで「t: default_ground_mat」と入力してください。
  • Project ビューの Default_Ground_Mat.mat をシーンビューの平面にドラッグアンドドロップして、マテリアルを追加します。

インスペクターで、マテリアルが Default_Ground_Mat に更新されていることに注意してください。

これで、平面上での描画にマテリアルを使用できるようになりました。

  • Tools > Polybrush > Polybrush Window の順に進みます。
  • PolyBrush ウィンドウの上部にある「Paint Vertex Colors」タブを選択します。

テクスチャは、左側がデフォルトのパターン、右側が頂点ペイントされたバージョンで、プレーンのサーフェスエリア全体にタイル状に配置されていることに注目してください。

現在マップされているテクスチャを見るには、Project ビューで、 Assets > 3DGamekit > Art > Textures > Environment > Ground の順にフォルダーを開いてください。

ヒント:Default_Ground_Mat シェーダーを使用して、マテリアルプレビューの横にある矢印の頭をクリックして、テクスチャの 1 つを選択しても同じことができます。どちらの方法でも Project ビューの正しいフォルダーが開きます。

新しい平面のペイントを開始するには、Polybrush ウィンドウから赤のペイントを選択してブラシの色を設定します。

これにより、マップされたテクスチャを使ってペイントできるようになります。ここで紹介しているケースでは、Moss_Albedo テクスチャを使って頂点をペイントします。

シーンビューのブラシギズモを使って、平面上の頂点に向かってブラシを動かすと、エディターでテクスチャブレンディングをリアルタイムに見ることができます。編集内容を確定するには、クリックしてください。

MuddyGround のテクスチャを追加したい場合は、パレットのブラシカラーを青に、SmallStone のテクスチャを追加したい場合は、パレットのブラシカラーを緑に切り替えてください。地面の見た目にちょうど良いばらつきを与えることができます。

ぜひさまざまなブラシの使い方を試して、皆さんの創造性を発揮してください。Push/Pull、ブラシのサイズ変更、ブラシカラーテクスチャとの組み合わせで、多種多様なペイントメッシュを作成することができます。

ヒント:様々なカラーを試すにあたり、エディターでライブプレビューを行い、3D Gamekitで適用されている様々なテクスチャとブレンドを見ることができます。

オブジェクトから ProBuilder スクリプトを削除

ProBuilder で作成したオブジェクトをシーンで使用する場合は、編集が終了したら ProBuilder スクリプトを削除しておくと、ゲームでの不必要なオーバーヘッドを防ぐことができます。個別にオブジェクトを選択してスクリプトを削除することも、シーン内のすべての ProBuilder オブジェクトからスクリプトを削除することもできます。

  • Tools > ProBuilder > Actions をクリックして、シーン中のすべてのオブジェクト、または個別に選択したオブジェクトから、 ProBuilder スクリプトを削除します。

このアクションは永続的なものなので、このアクションを行う前にメッシュと頂点のペイントに必要な変更をすべて行っていることを確認してください。

5. 環境プレハブの利用

環境用の素材を好きな場所に配置できるように、レベルジオメトリを構築しました。これらは Prefabs > Environment にあります。

例として、岩のモデルをシーンにドラッグしてみましょう。

  • Project ウィンドウで Prefabs > Environment > Rock を選択します。
  • CliffBig01 をクリックしてください。
  • インスペクタの下部にあるプレビューウィンドウで、このモデルをプレビューします。
  • プレビューウィンドウでモデルを左クリックしてドラッグすると、モデルを回転させたり、さまざまな角度から見ることができます。

ヒント:このウィンドウが表示されない場合は、インスペクタの下部にあるグレーのバーをクリックして、マウスを上にドラッグします。

パフォーマンスに関する注意事項

モデルを回転させてみると、モデルの一部が欠けているのがわかります。これは、多くのジオメトリが背面を欠いているためです。これにより、より大きなシーンのパフォーマンスが向上し、コンピュータの速度低下を防ぐことができます。

シーンにジオメトリや特殊効果を追加すればするほど、コンピュータが処理しなければならない量が増えます。マシンによっては、信じられないほど大量のジオメトリやエフェクトが必要になる場合もあれば、ほとんど処理されない場合もあります。レベルを構築する際には、このことを念頭に置き、プレイボタンを押したときにコンピュータの処理速度が低下する場合は、ジオメトリを削除する必要があるかもしれません。

上記のようなテクニックをいくつか使用して、できるだけ多くのレベルを構築できるようにしています。このプロジェクトは、お使いのコンピュータのハードウェアを自動的に検出して、PC ゲームがコンピュータによって設定を変えるのと同じように、どのくらいのジオメトリやエフェクトが表示され、どのくらい詳細になるかを決定します。これらの設定をリセットする必要がある場合や、自動的に設定されない場合は、Kit Tools > Auto Detect Quality Settings で設定を変更してください。

これらの設定を手動で変更し、設定の内訳を確認したい場合は、Edit > Project Settings > Quality と進みます。これにより、インスペクタの情報が表示されますので、必要に応じて調整することができます。

詳細レベル

パフォーマンスを向上させるために使用するもう一つのテクニックとして、LOD グループの使用があります。LOD は Level of Detail の略です。ディテールの低いメッシュは、オブジェクトがカメラから離れていて、その違いに気づかない場合に表示されます。これは、よりシンプルなジオメトリのメッシュの方がハードウェアへの負荷が少ないからです。

例として CliffBig01 を見てみましょう。

  • CliffBig01 をシーンビューにドラッグします。
  • 階層構造で、CliffBig01 の横にある矢印をクリックすると、その子が表示されます。

それぞれの子をクリックして、シーンビューで子が変化するのを見てみましょう。

ここでは、詳細が変化しているのを見ることができますが、これらのメッシュをカメラからの距離を変えて表示するように設定しています。

  • CliffBig01 の横にある矢印をクリックすると、折りたたむことができます。
  • CliffBig01 が選択されていることを確認してください。
  • インスペクタで LOD グループコンポーネントを見てください。

ここでは、どのモデルをカメラからどのくらいの距離で表示するかを確認できます。これらの設定は、Unity がすべて設定していますので、変更する必要はありません。LOD グループの距離は、自動的に選択された画質設定によって異なります。

LOD グループの詳細については、ドキュメントを参照してください。

6. 岩や植物を描く

シーンをさらに華やかにするために、ロックペインターと植生ペインターを作成しました。これらのツールを使用すると、ペイントしている面に合わせて植生や岩を大きさや回転数を変えて配置することができます。

これらのツールを使用するには、以下の手順に従います。

  • Hierarchy で VegetationPainter を見つけてください。
  • その子を展開するには、矢印をクリックしてください。
  • GroundCover をクリックしてください。
  • シーンビューの地面の上にマウスを置きます。
  • 左クリックして、希望の場所に草/リリーパッドを配置します。

このために、配置するオブジェクトのタイプを変更することができます。

  • インスペクタに移動します。
  • インスタンスペインターコンポーネントには、ペインター内の各プレハブの写真があります。
  • 選択されたプレハブは灰色になります。
  • 白くハイライトされたボックスをクリックして、ペイントするプレハブを選択します。

ペインタのコントロールは、Instance Painter Component の上部にあります。とりあえず作業するために必要な操作方法は下記のとおりです。

  • 左クリック : ペイント
  • Ctrl (Cmd) + 左クリック : 削除
  • Alt + スクロール : ブラシサイズを大きくする
  • スペース:位置と回転のランダム化

ペイントして配置したものは、親の子として保存されます。例えば、以下のようになります。

  • Hierarchy ウィンドウに移動します。
  • GroundCover を展開して、配置したものが子になっていることを確認します。

ペイントの中のそのタイプのオブジェクトはすべて子としてここに格納されます。また、これらをクリックして個別に編集して配置することもできます。

プロセスは、VegetationSmall、VegetationMedium、VegetationLarge をペイントしても同じです。

岩のペイントも同じように行います。

  • Hierarchy で RockPainter を見つけてください。
  • その子を展開するには、矢印をクリックしてください。
  • RocksSmall をクリックします。
  • 石を配置したいエリアにマウスを合わせてクリックして配置します。

これらのツールを使用すると、レベルの装飾方法にバリエーションを素早く追加することができます。これらのツールは、Prefabs フォルダから prefabs にドラッグする従来の方法で見つけることができ、配置することができます。

  • Project ウィンドウに移動します。
  • Assets > 3DGameKit > Prefabs > Environment に移動します。

ここには、Rocks、VegetationSmall、VegetationMedium、VegetationLarge のフォルダがあります。

これらをクリックしてシーンビューにドラッグして、レベルに配置することができます。この方法でオブジェクトをドラッグしても、位置、回転、サイズはランダム化されないことに注意してください。

シーンにオブジェクトを配置し続けます。再生ボタンを押してレベルをテストし、ゲーム内の様子を確認することも忘れないでください。

次の章では、ゲームの仕組みを紹介するための小さな環境を作成しました。楽しんで、創造的にレベルを構築してください。

7. シーンの整理

Unity でシーンを作成する際には、階層構造の中で物事を整理整頓しておくことが重要で、探しているオブジェクトやゲームメカニックを簡単に見つけることができます。以下に、キットの使用は必須ではありませんが、プロジェクトをきれいに整理整頓するためのヒントをいくつか紹介します。

Hierarchy で、シーン内のオブジェクトのタイプを整列させるためのセクションを作成しました。

これらは、空の GameObject で作られています。これらは、シーン内のオブジェクトのタイプを識別するのに役立つ以外の機能はありません。各セクションの下にあるすべてのオブジェクトは、そのセクションの子ではないことに注意してください。

エクストラレベルのデコレーションを保存するために、新しいセクションを作成してみましょう。

  • 階層構造の一番上にある Create > Create Empty を選択します。

これにより、Hierarchy の一番下に GameObject という名前の新しい空の GameObject が作成されます。

Hierarchy で、GameObject が青くハイライトされていることを確認してください。これで名前を変更することができます。

  • インスペクターに移動します。
  • インスペクターの上部にある[名前フィールド]をクリックします。
  • 名前フィールドに「----- Environment -----」と入力します。

このようにセクションに名前をつけると、オブジェクトがたくさんあるときに見つけやすくなります。

では、後で見つけやすいように、CliffBig01 を正しいセクションに移動させてみましょう。

  • Hierarchy で、CliffBig01 を見つけます。
  • 左クリックしたまま、「----- Environment -----」の下まで CliffBig01 をドラッグしてください。

ヒント:他のオブジェクトの上で左クリックした場合、そのオブジェクトが子になってしまうので、左クリックを手放さないようにしてください。

ドラッグすると、オブジェクトの子になることを視覚的に示すインジケーターが、このように表示されます。

オブジェクトをドラッグしたときに、水平線が表示されていることを確認してください。これは、このようにオブジェクトを下に配置することを示しています。

誤ってラベルの子にしてしまった場合は、それを元に戻してからやり直すことができます。

8. ゲームの境界線

レベルを構築するとき、テストでは、レベルから簡単に脱出して、プレイヤーが行けるようにしたい場所の外に出ることができることに気づくかもしれません。これは、ジオメトリを追加しても直らないことがありますが、プレイヤーが脱出できないように見えない壁を追加することができます。

これは、空の GameObject に Collider を追加してシーンに追加することで実現できます。

  • 階層構造の一番上にある Create から Create Empty を選択します。
  • インスペクタでは、これを GameBoundary に名前を変更します。
  • インスペクタで、Add Component をクリックします。
  • 検索ボックスに Box Collider と入力してください。
  • Box Collider をクリックして、先ほど作成した GameBoundary ゲームオブジェクトに追加します。

Scene の中でこのオブジェクトを探してみましょう。

  • Hierarchy で GameBoundary を選択します。
  • シーンビューの上にマウスを置きます。
  • キーボードの F キーを押してオブジェクトをフレーム内に表示します。

Box Collider が緑色のアウトラインで表示されます。このオブジェクトを、レベル内の問題のある部分に合わせて配置、回転、拡大縮小します。

このコライダーが Ellen が通過できないようにする必要があります。このために、GameBoundary を選択した特定のレイヤーを設定しました。

  • インスペクターで、Layerドロップダウンメニューをクリックします。
  • Environment を左クリックして、そのレイヤーに設定します。

ここでは、プレイヤーが簡単に飛び上がって脱出できる場所に境界を配置しました。再生ボタンをクリックして、この境界が意図したとおりに機能するか確認するようにしてください。

9. ムービングプラットフォームを詳しく見てみる

キットを使って様々なゲームプレイ要素を追加することを見てみましょう。デモレベルを用意しましたので、自分で作ったシーンを使ってもいいですし、新しいシーンを使ってもいいでしょう。

2D ゲームキットを使用したことがある方は、ワークフローを簡単にするためにいくつかの要素を調整していますが、これらのテクニックのいくつかはよく知っているかもしれません。

移動プラットフォームは、プレイヤーをある場所から別の場所に移動させるために使用することができます。

  • Project ウィンドウに移動します。
  • Assets > 3D GameKit > Prefabs > Interactables に移動します。

Interactables フォルダには、このキットのために作成された構築済みのゲームプレイ要素があります。

  • 左クリックして、MovingPlatform プレハブをシーンビューまたは Hierarchy ビューにドラッグします。
  • 注:Hierarchy に移動する場合は、Frame Select(キーボードショートカット:F キー)を使えばオブジェクトを見つけやすくなります。
  • また、Transform コンポーネントのインスペクタを使って、オブジェクトの位置合わせ、回転、拡大縮小を行うこともできます。

ヒント:X,Y,Z の上にマウスを置いて左クリックでドラッグすると、これらの値がそれぞれ増えたり減ったりします。

  • プラットフォームをスタートさせたい場所にオブジェクト全体を配置します。

ここでは、先ほど作成したアシッドプールの上に配置しました。

それでは、プラットフォームの作成とパスの設定をして、プラットフォームの移動先を変更してみましょう。

ギズモ

移動プラットフォームには 3 つのギズモが付属しており、プラットフォームの動きを簡単に変えることができます。画面では、ワールドに配置するための Transform の位置(1)、開始位置(2)、終了位置(4)、およびその間の距離(3)を破線で示された移動経路の線を使って設定することができます。

Inspector ウィンドウで、Simple Translator (Script)を見つけ、Activate のボックスにチェックを入れて、Moving Platform の移動を有効にします。

Activate をチェックする前に、このプロセスの間に開始位置を移動した場合、移動プラットフォームは、Transform で設定された初期位置ではなく、開始位置にスナップすることに気づくでしょう。これは、プラットフォームが常に正しい場所から開始し、Simple Translator スクリプトで設定された動作に従って移動するようになるためです。

ヒント: ギズモを移動するときに Ctrl(Cmd)キーを押したままにすると、グリッドにスナップして移動します。

Ellen は環境を横断してアシッドプールを避ける必要があるので、エンドギズモを調整する必要があります。

エディタで移動プラットフォームの現在の移動モーションを確認するには、プレビュー位置のスライダーを 0 から 1 の範囲で動かすことができます。 シーンウィンドウでは、移動のその段階でゲーム内にあるはずの場所にプラットフォームが移動していることがわかります。

これは、シーン内の他のゲームオブジェクトとの重複の可能性を確認したり、動作をプレビューしたりするのに非常に便利な機能です。

移動にかかる時間の設定

シーケンスの開始から終了までの速度を変更するには、Duration の値を変更することができます。デフォルトでは 5 になっており、単位は秒です。この値を小さくすると移動が速くなり、大きくすると移動が遅くなります。

移動プラットフォームの設定

  • エンドギズモの Y ハンドル(緑)をクリックし、Ctrl(Cmd)を押してスナップし、希望の高さまで下にドラッグします。

この例では、下向きにまっすぐ移動するようにします。エンドギズモの Z ハンドル(青)をドラッグし、スナップ(Ctrl/Cmd)でギズモをスタートポイントの下までドラッグします。

ここで Preview Position のスライダーを動かすと、移動プラットフォームは新しい終了地点の位置に向かって移動するはずです。

  • 最後に、Once に設定されている Loop Type を Ping Pong に設定します。この設定を変えると、動くプラットフォームが開始地点と終了地点の間を行き来するようになります。

Loop Type の設定の意味

Once - リニアな動きをするように設定します。開始地点から終了地点まで移動し、終了地点に到達すると停止します。

Once ループタイプは、プレイヤーを開始地点から終了地点まで移動させるだけの場合に最も一般的に使用されます。

Ping Pong - 双方向移動のループを設定します。開始地点から終了地点、終了地点から開始地点への移動を繰り返し行うループを行います。

Ping Pong ループタイプは、プラットフォームがプレイヤーに提供するルートを継続的に利用できるようにする必要がある場合に最も一般的に使用されます。

Repeat - 一方向移動のループを設定します。開始地点から終了地点に移動し、終了地点に到達すると、瞬時に開始地点に戻って移動を繰り返します。

Repeat ループタイプは、プラットフォームが開始地点から終了地点に移動する一方向のシーケンスに最もよく使われます。これは 3D Game Kit の Level 2 のアシッドピット(3D Game Kit > Scenes > Gameplay)で見ることができます。

圧力パッドを使ったゲームコマンド

ゲームコマンドは、シーン内の GameObject がコマンドを送受信することで、他の GameObject と通信することを可能にします。これにより、複雑なビヘイビアやスクリプトをデザインするのに役立ちます。

ゲームコマンドは、発生するイベントに基づいており、3D ゲームキットのオブジェクトごとに異なります。この例では、ゲームコマンドを使用して、MovingPlatforms チュートリアルで追加した MovingPlatform Prefab をアクティブにする PressurePad プレハブの設定を見てみましょう。

  • プレッシャーパッドからのインタラクションに対応した動くプラットフォームを準備するには、Activate プロパティを無効にします。

インタラクション可能なオブジェクトのリンク

  • Project ウィンドウに移動し、3DGamekit > Prefabs > Interactables に移動します。
  • Project ウィンドウから、シーンビューに PressurePad をドラッグアンドドロップします。このとき、接続する MovingPlatform の近くにドラッグアンドドロップします。

インスペクターで、Send On Trigger Enter スクリプトのコンポーネントを編集します。

このスクリプトを使用すると、Interactive Object を選択して、Game Command Receiver を Hierarchy を関連する GameObject にリンクすることで、他のゲームオブジェクトをフックすることができます。

この例では、既に Hierarchy ビューにある MovingPlatform にリンクします。

  • Interactive Object の選択ボタンをクリックし、MovingPlatform を選択し、Interaction Type を Activate に設定します。

シーンビューで、PressurePad から MovingPlatform へ延びる矢印のラインが表示されているはずです。これは、2 つの GameObject 間の関係を視覚化し、ゲームコマンドの送信側から受信側への流れを示しています。

  • ゲームを再生して、PressurePad に歩いていき、上に乗ってみましょう(PressurePad は一度だけ押せて、押されたあとは押し込まれたままになります)。MovingPlatform が起動し、ループシーケンスが始まります。

10. カウンターとスイッチの使用

複数のオブジェクトをつなげていくことができます。次に、ドアを開ける前にカウンターを使って 3 つのスイッチのうち有効化されたものの数を数えてみましょう。

  • まず、Project ウィンドウで、Assets > 3DGameKit > Prefabs > Interactables と進みます。Switch と DoorSmall をシーンビューにドラッグして追加します。

Switch がアクティブになるとドアが開くように、Switch と DoorSmall を接続してみましょう。

  • Hierarchy で Switch をクリックして選択します。
  • Hierarchy で DoorSmall をクリックして、Send on Trigger Enter コンポーネントの Interactive Object スロットにドラッグします。
  • シーン・ビューでは、Switch から DoorSmall への接続を示す白い矢印の線が表示されているはずです。
  • Hierarchy で、Switch を選択します。
  • Ctrl + D (Mac の場合は Cmd + D)を押して、Switch を複製します。
  • これをもう 1 回繰り返して、Switch をもう 1 つ作成します。

Switch、Switch (1)、Switch (2)が表示されているはずです。

これらは Hierarchy の一番下に表示されます。プロジェクトを整理しておくには、Ctrl + クリック(Cmd + クリック)して、ドラッグして Hierarchy で近くにまとめておきます。

Switch (1)、Switch (2) は元のものと同じ場所に複製されます。

  • Hierarchy で、Switch を個別に選択し、場所をずらして一列に並ぶようにします。

オブジェクトを複製したことで、ドアとの接続も複製されていることがわかります。これらのスイッチのどれかにぶつかるとドアが開きます。再生ボタンを押して試してみてください。

次に、3 つのスイッチがすべてアクティブになっているときにドアを開くようにします。

  • Project ウィンドウで、Assets > 3DGameKit > Prefabs > Interactables を選択します。
  • Counter プレハブを見つけて、シーンにドラッグしてください。
  • 配置したゲームオブジェクトを、スイッチの近くに動かします。

このオブジェクトはゲームメカニクスを保持するためのもので、シーン内では形になって見えません。Transform ツールを使って移動を行うことになります。また、シーンでは形がないので、Hierarchy で Counter を選択して変更を行います。

ヒント:ラベルを追加することで、このようなオブジェクトをシーンビューで見やすくすることができます。

  • Counter を選択します。
  • インスペクターの上部で、青のボックスをクリックします。
  • ドロップダウンからカラーラベルを選択します。

これでオブジェクトにラベルが追加されます。

ラベルが見えない場合、シーンビューのアイコンが小さすぎるかもしれません。これは以下の手順で変更することができます。

  • シーンビューの上部にある Gizmos ドロップダウンをクリックします。
  • シーンビューのアイコンのサイズを変更するスライダーを調整します。

シーン内に送信者の数をカウントできるカウンターができたので、各 Switch から「Open」ゲームコマンドを送信するように変更を加えます。

  • Hierarchy で Switch を選択します。
  • Counter をクリックして、Send on Trigger Enter スクリプトの Interactive Object スロットにドラッグします。

これにより、Door がコマンド送信先のオブジェクトに置き換えられました。

シーンビューでは、矢印が Counter に接続されているように表示されます。

  • Switch (1)と Switch (2) についても上記の手順を繰り返します。

3 つのスイッチがすべて Counter にコマンドを送信するようになりました。

Counter の Game Command Receiver スクリプトでこれをダブルチェックできます。

ここで再生モードに入り、各スイッチにぶつかっても何も起こりません。カウントが 3 に達したら DoorSmall を開くように指示する必要があります。

  • Hierarchy で Counter を選択します。
  • インスペクターで、Gameplay Counter スクリプトの以下の設定を変更します。
  • Interaction Type:Open
  • Is One Shot:True(チェックボックスをオン)
  • Target Count:3

この設定で、各スイッチから 1 回ずつ Open タイプのコマンドを受信し、カウンターが満たされる数字が 3 にセットされます。

ここで、カウンターがドアにコマンドを送信するようにしてみましょう。

  • Counter を選択した状態で、Send Game Command スクリプトに以下の設定を入力します。
  • Interaction Type: Open
  • Hierarchy から DoorSmall を Interactive Object スロットにドラッグします。
  • One Shot: Enabled(チェックボックスをオン)

これで、各スイッチがカウンターにコマンドを送信し、カウンターは 3 つのコマンドを受信したときにドアにオープンコマンドを送信します。

再生ボタンを押してレベルをテストします。各スイッチに触れることができ、3 つのスイッチすべてに触れたときにドアが開くはずです。

カウンターは、何かの行動を取ることで条件が満たされる仕掛けを作りたいときに、幅広く使用することができます。Send Game Command では、Enable や Open 以外にもさまざまなインタラクションタイプを使用することができます。

プレイヤーへの進行状況の通知

通常、ゲームではこのような仕掛けを互いに離れた場所に配置します。このプロジェクトのゲーム例でも同じです。ゲームデザインにおいて、ユーザーインターフェースやゲーム内のインジケーターを使って、プレイヤーに進捗状況を示すのが一般的に良いプラクティスとされます。

Game Command と Counter を応用し、各スイッチに触れたらドアの近くにクリスタルを光らせて、状況がわかるようにしましょう。こうすると、ドアを見ればゲーム内に 3 つのスイッチがあることがプレイヤーに伝わりますし、いくつアクティブにされているかも同時に把握させることができます。

  • Project ウィンドウで、Assets > 3DGameKit > Prefabs > Interactables を選択します。
  • Crystal プレハブを見つけて、シーンにドラッグします。

クリスタルはレベルにしては少し大きいので、サイズを変更してみましょう。

Hierarchy で Crystal を選択して、

  • インスペクターに移動して、Transform コンポーネントの Scale を以下のように設定します。
  • X: 1
  • Y: 1
  • Z: 1
  • トランスフォームツールを使って、クリスタルをドアの近くに置いてください。
  • Hierarchy で Crystal を選択した状態で、Ctrl + D(Mac では Cmd + D)を 2 回押して、2 つ複製します。
  • Hierarchy で Crystal (1)と Crystal (2) を選択(Mac では Ctrl + クリックまたは Cmd + クリック)して、ドラッグして Crystal の近くに並べます
  • シーンビューで、トランスフォームツールを使用して、希望の位置にクリスタルを配置します。

ドアのすぐ横に設置したので、プレイヤーの目につきやすいようにしました。スイッチが入ると色が変わるようにしましょう。

  • Hierarchy で Switch を選択します。
  • インスペクターの下までスクロールして、Add Component をクリックします。
  • 検索ボックスに「Send on Trigger Enter」と入力してください。
  • Enter キーを押すか、「Send on Trigger Enter」というスクリプトをクリックして、Switch オブジェクトに追加します。

これにより、Send on Trigger Enter スクリプトがスイッチに追加されます。これを使用して、スイッチがアクティブになったときにクリスタルに色を変更するコマンドを送信します。

  • 先ほど追加した Send on Trigger Enter スクリプトの値を以下に設定します。
  • Interaction Type: Activate
  • Hierarchy から、Interactive Object スロットに Crystal をドラッグします。
  • One Shot: Enabled(チェックボックスをオン)
  • Layer: Player

こうすると、スイッチが起動したとき、クリスタルに起動するコマンドが送られます。

Play ボタンを押して仕掛けをテストします。Ellen を最初のスイッチまで走らせると、最初のクリスタルも起動します。

残りのスイッチとクリスタルの組み合わせについても、この手順を繰り返します。Switch (1) は Crystal (1) に、Switch (2) は Crystal (2) に合わせてください。これで、各スイッチがカウンターとクリスタルにコマンドを送信します。

ユーザーインターフェース(UI)プロンプト

スイッチのゲームプレイ要素を完成させるためには、スイッチが何をしているのか、スイッチの重要性についてユーザーにヒントを与える必要があります。これは、主人公からプレイヤーへの対話で行うのが一般的です。3D Game Kit では、これは InfoZone プレハブとして提供されています。

  • Project ビューで、3DGamekit > Prefabs > Interactables と移動し、InfoZone プレハブを選択します。
  • InfozoneHierarchy の「----- UI -----」の下にドラッグします。

Infozone は空のラベルの下に持っていくだけである点に注意してください。

  • Sphere コライダーをスイッチの上に移動し、エリア内の 3 つのスイッチをすべて含むようにサイズを変更します。ただし、あまり大きくしないように注意しましょう。サイズが大きすぎると、Ellen がスイッチから遠く離れていてもトリガーが反応してしまうためです。
  • インスペクタで自動的に設定されていない場合は、Layer を Environment に設定します。
  • インスペクターの Sphere Collider の Is Trigger にチェックを入れます。

次のステップでは、ゲームコマンドを使ってトリガーゾーンに入ったときに、ゲームがスイッチに関する必要な情報をプレイヤーに伝えるための DialogueCanvas プレハブをリンクします。

  • 3DGamekit > Prefabs > UIPrefabs に進み、DialogueCanvas Prefab を見つけます。
  • Hierarchy で、DialogCanvas を UI の下にドラッグする
  • プレイヤーが InfoZone のトリガーゾーンに入ったときだけ表示されるようにしたいので、これを非アクティブにします。
  • シーンの InfoZone を選択し、インスペクターで Interact on trigger Script コンポーネントを見つけます。
  • 自動的に行われていない場合は、Layers を Player に設定します。
  • Dialogue Canvas Controller スクリプトの「On Enter ()」と「On Exit ()」の空のオブジェクトスロットにドラッグします。
  • DialogueCanvasController 関数リストから ActivateCanvasWithText を On Enter の関数に設定します。
  • テキストフィールドを更新して、プレイヤーに役立つテキストを提供します。以下のように使用しました。
    • "If I switch all of these on maybe the door will open."
  • On Exit 関数を DeactivateCanvasWithDelay に設定し、Delay を 1 に設定します。

ここまでの設定が完了したうえで、スイッチやクリスタルを他のエリアに移動させたり、プレイヤーから隠したりして、より難易度を上げることができます。ゲームコマンドのリンクはそのままで、レベル内でオブジェクトをよりダイナミックに使うことができます。プロジェクトの中で重要なゲームプレイの仕組みをプレイヤーに通知する必要がある場合は、DialogueCanvas を追加するようにしましょう。

11. 敵キャラを詳しく見てみる

3D Gamekit には、構築済みの 3 種類の敵が含まれています。Chomper、Spitter、Grenadier です。

これらはすべて EnemyController スクリプトで制御され、さらにそれぞれに固有の動作をさせるスクリプトがアタッチされています(ChomperBehavior、SpitterBehavior、GrenadierBehavior)。

Chomper

Chomper は、プレイヤーを見つけるとプレイヤーに向かって走り、十分に近づくと攻撃してきます。

Time to Stop Pursuit:この時間(秒単位)だけプレイヤーが Chomper の視界より外側に逃げ続ければ、Chomper はプレイヤーの追撃を止めて元の場所に戻ります。

Spitter

Spitter はプレイヤーを見つけると、プレイヤーに向かって触れると爆発する酸を吐いてきます。酸を吐いていないときにプレイヤーが近づいていくと、Spitter は逃げ出します。

Flee Distance:プレイヤーから Spitter が逃げているとき、ここで指定した距離よりプレイヤーから離れると Spitter は逃げるのをやめてまた攻撃してきます。

Grenadier

これまで紹介した 2 種類よりタフで大きな敵です。遠くにいる場合はプレイヤーに向かって弾むグレネードを発射し、正面近くにいる場合はパンチ、近いが正面にはいない場合は触れるとダメージを食らう爆発を身にまといながら、一時的なシールドを展開します。

背中からの光るコアを攻撃することでのみ、ダメージを与えることができます。

Melee Range:ここで設定した距離よりもプレイヤーが Grenadier に近づいた場合、Grenadier はパンチ(プレイヤーが正面にいる場合)かシールドを展開します。

Range:Grenadier に近づいても、まだ Melee Range よりは遠い場合は、Grenadier はプレイヤーに向かって弾むグレネード弾を発射します。また、Grenadier がプレイヤーを見つけたが、まだこの Range よりも遠くにいる場合、Grenadier はプレイヤーに届くところまで移動してきます。

共通設定

すべての敵キャラはそれぞれ固有の動作を与えるコンポーネントに Player Scanner というプロパティを持っています。これは敵キャラがどのようにプレイヤーを見つけるのかを決めるプロパティです。

設定の詳しい内容は、TargetScanner のドキュメントを参照してください。

敵キャラには Damageable コンポーネントもアタッチされており、これは敵キャラのヒットポイントと、どのようにすればダメージを受けるかを定義します(例:Granadier は背中から攻撃されたときだけダメージを受ける)。

このコンポーネントがついている位置は敵キャラの種類によって異なります。

Chomper と Spitter:ルートのゲームオブジェクトの、固有の動作を定義するスクリプトの次

Grenadier:HierarchyGrenadier の子オブジェクトとなっている DamageablePart

Scene ビューで使えるギズモ

これらの設定のいくつかは、敵キャラが選択されているときにシーンビュー上で視覚化することができます。

青い円(扇形)は、Player Scanner の検出半径と角度を表しています。プレイヤーはこの図形の中を歩いている場合にのみ発見されます。

黄色いワイヤーフレームで描かれた小さな球体は、Player Scanner の高さのオフセット(スキャナの「目」の位置)を表しています。システムはこれとプレイヤーとの間の視線が遮られていないかどうかをチェックします。

赤い円は、ここを攻撃するとダメージを与えられる範囲を示します。敵にダメージを与えるには、プレイヤーは敵のこの範囲内に攻撃を当てる必要があります。

Chomper の追加

Chomper をシーンに追加してみましょう。

  • Assets > 3DGameKit > Prefabs > Characters > Enemies > Chomper に移動します。
  • Chomper プレハブをシーンにドラッグします。
  • すぐ動作をテストできるよう、Chomper を Ellen の近くに置きます。

非常に大きな青色の領域がシーンを覆っているのが見えます。これが Chomper の Detection Radius、つまり見える範囲を表しています。Ellen がこの範囲内を歩くと Chomper が攻撃してきます。Hierarchy で Chomper を選択した状態で、この設定を調整することができます。

  • インスペクタで Chomper Behaviour スクリプトを見つけます。
  • Detection Radius では、値を 4 に変更します。スクロールして値をすばやく変えて調整することもできます。Detection Radius の文字が表示されている領域の上にカーソルを置き、クリックしながら左にドラッグすると値が減り、右にドラッグすると値が増えます。
  • 再生ボタンを押して Chomper に向かって走り、Detection Radius の範囲内に入ってみましょう。

Ellen が Chomper の Detection Radius に入ると、Chomper は Ellen を見つけて攻撃しようとしますが、彼はその場で走って足踏みしているだけで、移動しません。

これは、Chomper の AI に歩行可能な範囲を伝えていないためです。これを伝えるには Unity の NavMesh システムを使用します。Chomper の AI は NavMesh Agent コンポーネントによって処理されます。これにより、Chomper は世界をナビゲートしながら、私たちが設定したサーフェス上を歩き、障害物や他の Chomper、Spitter、Grenadier を避けることができるようになります。

Chomper や他の敵はすでに特定の方法で行動し、移動するように設定されているので、これらの設定を変更する必要はありません。

NavMesh Surface を追加して、敵が歩けるように地面を設定してみましょう。

  • Hierarchy で Plane(地面)を選択します。
  • インスペクタの一番下の Add Component をクリックします。
  • NavMeshSurface」を検索します。
  • Enter キーを押すか、検索結果の NavMeshSurface をクリックして Plane に追加します。
  • NavMesh Surface スクリプトで、Agent Type を Chomper に設定します。

これは Agent がその上を歩ける面を Agent に伝えます。このリストには Chomper だけが登場し、Spitter や Grenadier は存在しないことに注意してください。これは、すべての敵が Chomper のエージェント設定を使用するためです。

  • Include Layers ドロップダウンでは、最初は Nothing をクリックします。
  • もう 1 度ドロップダウンを開き、Environment と Vegetation を選択します。

たくさんのレイヤーを一括で選択解除して、必要なものを再選択すると簡単に必要なものだけを選べます。

  • Bake ボタンをクリックします。

これにより、シーン内の NavMesh をベイクし、敵キャラは地面の表面のほとんどの領域を歩行できるようになります。シーンビューでは、敵が歩ける場所を水色のハイライト表示で確認できます。

青くハイライトされた NavMesh サーフェスの隙間がありますが、敵キャラはこの部分を歩くことはできません。

ここでは、壁の直前に隙間があるのがわかります。これは、敵が壁やドアを通り抜けられないことを意味します。

再生ボタンを押して、Chomper をテストしてみましょう。Chomper に駆け寄ると、追いかけてくるようになりました。これで Chomper から少し離れて走ると、Chomper にアタッチされた NavMesh Agent が NavMesh Surface を使ってワールドを移動し、Ellen を追いかけてきます。

シーンに Chomper や他の敵を追加しても、同じ NavMesh Surface を使用しますので、新しい敵の追加のためにここまでの手順を繰り返す必要はありません。

レベルに新しいパーツを追加したり、シーン内のオブジェクトの位置を変更したい場合は、NavMesh サーフェスを再度ベイクする必要があります(Plane の NavMash Surface スクリプトの Bake ボタンをもう一度クリックする)。

Spitter の追加

  • 3DGamekit > Prefabs > Characters > Enemies > Spitter から Spitter プレハブをシーンにドラッグして追加します。

インスペクターを見ると、Spitter は Chomper によく似ていることがわかります。

Spitter は遠距離攻撃をしてくる敵で、Ellen が Fleeing Distance プロパティに設定された距離より近づくと、攻撃ではなく逃げるべきタイミングと判断し、Ellen から逃げます。そして距離を取ると、Range Weapon に設定された武器を Ellen に向かって発射します。

ヒント:Fleeing Distance が Detection Area よりも大きいと、Ellen を見つけたと同時に逃げ出す距離に入ってしまっているので、ただ逃げ続けるだけの動作になります。

理想的には、攻撃の機会を増やし、Ellen に対してより手ごわいものになるように、少し Ellen から離れた位置に置いておくのがいいでしょう。Spitter に環境を考慮させたい場合は、View Blocker Layer Mask を DoNotDraw から Environment に変更する必要があります。

このシーンでは、Ellen が移動プラットフォームに乗った時に厄介な敵になるよう、Spitter を高い位置に配置しています。

追加した後のシーンをプレイして挙動を確認し、Detection Radius や Fleeing Distance をいろいろ変えてみてください。

Grenadier の追加

3DGamekit > Prefabs > Characters > Enemies > Grenadier から Grenadier をシーンにドラッグして追加します。

Grenadier はボス敵なので、これまで 2 種類のキャラよりディテールが多いです。シーンで選択した時点では、Damage Radius は背面のみに設定されており、プレイヤーはコアを狙わなければならないようになっています。

Behaviour スクリプトは Chomper や Spitter と非常に似ていますが、Grenadier 独自のものとして、Melee と Ranged のプロパティを組み合わせたようなものがあります。Fist Weapon、Grenade Launcher それに Shield です。

ダメージを与えられるコンポーネントを見るには、Hierarchy で Grenadier を展開し、DamageablePart を見つけてください。

展開すると Damageable スクリプトがあり、ライフと無敵時間、攻撃を当てられる領域に関連するコンテンツが表示されます。

Grenadier にアタッチされた Damageable コンポーネントのイベントエリアには、Grenadier が倒されたときの処理、ダメージを与えたときのパーティクルの表示、それとダメージが入ったあとの無敵状態をリセットする処理が設定されています。

12. トラップの作成

Game Commands を使って、Game Commands を受け取ったときにオブジェクトを回転させて、Spitter の上に箱を落とします。

  • Hierarchy の Gameplay グループの下に新しい空の GameObject を作成します。
  • 名前を PlatformTrap にします。

PlatformTrap の位置を、プラットフォームを回転させたい場所に移動します。これがプラットフォームを回転させるためのピボットポイントとして使用されます。

これを移動させたことで、次のステップで他の GameObject を現在の位置ではなく、その位置を中心に回転させながらアタッチすることになります。

  • 3DGamekit > Prefabs > Environment > Stonework から PlatformShort を Hierarchy にドラッグし、その位置がピボットである PlatformTrap の近くになるように移動させます。
  • 同じフォルダから PlatformSupportShort プレハブについても、同じ手順を実行して Platform の下に移動させます。
  • Hierarchy で PlatformShort と PlatformSupportShort の両方を選択します。
  • インスペクタの Static パラメータを無効にします。これにより、親が回転したときに GameObject が動くようになります。
  • Hierarchy で両方を選択したまま、空の PlatformTrap ゲームオブジェクトの上にドラッグして、以下のようにします。

ヒント:これらのゲームオブジェクトを追加する操作を行う時、追加先のオブジェクト名は青いバブルで囲まれます。

親の PlatformTrap を選びます。

  • インスペクタで、Add Component を使い、Game Command Receiver と Simple Rotator を追加します。

これにより、親グループの PlatformTrap がゲームコマンドを受信し、別段の設定なしに子オブジェクトを回転させることができるようになります。

SimpleRotator コンポーネントの設定をいくつか変更して、回転をより信憑性のあるものにしてみましょう。

以下の設定を変更します。

  • Interaction Type : Activate
  • Is One Shot : チェックを入れる
  • Accel Curve : Linear Increase(インスペクタのプロパティのところにあるボックスをクリックして、表示されるウィンドウ下部の左から 2 番目のプリセットを選択)
  • Loop Type : Once
  • Axis の Z : 1
  • End : -60(角度)

Preview Position スライダーを動かすと、PlatformTrap がトラップドアのように回転するのを見ることができるはずです。

ヒント:期待通りに動作しない場合、または期待していたものと異なる回転をする場合は、Hierarchy の PlatformTrap グループから PlatformShort と PlatformSupportShort を取り出し、ピボットが必要な場所に PlatformTrap を移動させてから、PlatformShort と PlatformSupportShort をグループに戻してください。

MovingPlatform チュートリアルと同様に、圧力パッドを使って PlatformTrap の回転を有効化してみましょう。

  • Prefabs > Interactables から PressurePad をシーンの PlatformTrap の近くにドラッグします。
  • PressurePad を選択した状態で、Hierarchy から PlatformTrap グループを Game Command Receiver の Send On Trigger Enter の Interactive Object フィールドにドラッグします。
  • Interaction Type を Activate に変更します。

送信側から受信側へ延びる視覚的なリンクが表示されます。

  • この時点でシーンを再生して、パッドを踏むとドアが回転します。
  • Spitter にダメージを与えるには、3DGamekit > Prefabs > Interactables から DestructibleBox をシーンにドラッグして移動させ、PlatformTrap の上に来るようにします。
  • Hierarchy で、DestructibleBox グループを展開し、子ゲームオブジェクトになっている DestructibleBox を選択します。
  • インスペクタで、Contact Damager 用のコンポーネントを追加し、Damaged Layers を Enemy に設定します。

Amount の値は、敵の Damageable component にある Max Hit Points の値と一致させます。

  • シーンを再生してトラップを有効にすると、下にいる敵にボックスがヒットするところを見ることができます。

13. リスポーンチェックポイントの追加

チェックポイントは最近のほとんどのゲームに共通して見られる要素で、このゲームキットでは、3D Gamekit > Prefab > Utilities > Checkpoint にあるプレハブの形で提供しています。

Ellen が倒れると、最後に触ったチェックポイントでリスポーンされます。プレイヤーがどこでリスポーンするかを確実に知るためには、ゲーム内でオブジェクトや視覚的な手がかりを使って、チェックポイントに到達したことを示す必要があります。

この例では、シーンに別のクリスタルを追加します。今回は、ゲームコマンドを送信して、チェックポイントに入ったことを示すイベントでクリスタルが起動されるようにします。

  • チェックポイントを追加するには、チェックポイントをシーンにドラッグアンドドロップするだけです。プレイヤーがコライダーに入ることができるように配置してください。チェックポイントが大きくなりすぎないようにリサイズしてください。
  • インスペクタで Layer を Checkpoint に設定します。
  • 3D Gamekit > Prefabs > Interactables から Crystal を追加します。
  • チェックポイントエリアの近くに置きます。
  • Hierarchy の中でこのクリスタルが何に使われているかをより明確にするために、インスペクタで名前を CheckpointCrystal に変更します。
  • 2 つのオブジェクトをリンクするため、Checkpoint を選択します。
  • Add Component をクリックします。
  • 「Send On Trigger Enter」と入力します。
  • Enter キーを押すか、検索結果をクリックして追加します。
  • Interaction Type を Active に設定します。
  • One Shot を Enabled に設定します。
  • Layer を Player に設定します。これで Ellen がエリアに入ったことが検出されます。
  • ゲームオブジェクトの選択で、Interactive Object を GateCheckpoint に設定します。
  • CheckpointCrystal を選択し、インスペクタで Game Command Receiver に Sender がアタッチされていることを確認します。

この段階でゲームを再生し、チェックポイントに入るとクリスタルが起動するのを確認してください。起動後、Ellen が倒れると、Ellen がチェックポイントの領域の中央にリスポーンします。

14. 武器を拾う

3D Gamekit のデフォルトでは、Ellen は武器を使ってモンスターを攻撃することができます。この例では、Ellen の攻撃能力を無効にして、台座からのピックアップ時に再度有効にすることで、ゲームのデモレベルと同様の動作をします。

  • Ellen の攻撃能力を無効にするには、Ellen を選択し、インスペクタで Player Controller コンポーネントを選択します。
  • Can Attack の設定を無効にします。

3DGamekit > Prefabs > Interactables で Weapon Pedestal プレハブを見つけ、シーンにドラッグして追加します。

  • Hierarchy ビューで、WeaponPedestal のグループを展開して、プレハブ内の他のゲームオブジェクトを表示します。

以下の 3 つのゲームオブジェクトがあります。

  • StaffTakeTrigger
  • WeaponPedestal
  • Staff
  • Hierarchy ビューで StaffTakeTrigger ゲームオブジェクトを選択します。

インスペクタでは、Sphere Collider コンポーネントと Interact On Trigger スクリプトコンポーネントがあり、スクリプトのプロパティにいくつかの定義済みの値が設定されていることがわかります。これは、台座のセットアップ時間を短縮し、コードを書く必要なしに既製のロジックを使用できるようにするためです。

台座で Ellen の攻撃能力の設定を更新できるようにするには、Hierarchy から Ellen の GameObject をアタッチする必要があります。

  • Hierarchy ビューから Ellen を一番上のプロパティフィールドにドラッグします。GameObject を受け入れたら、ドロップダウンから「PlayerController.SetCanAttack」という関数を選択します。この関数はデフォルトで True(有効)になっています。
  • シーンを再生して、Ellen が出現した時点では Ellen は攻撃できなくなっているはずです。台座の上に行くと、コライダーが Ellen の攻撃能力を解放し、台座の上にある杖が消えます。

15. ライフの回復

このチュートリアルでは、敵からの攻撃で失われたライフを Ellen が回復できるようにします。これは、Ellen の Damageable コンポーネントを使って、ResetDamage()を使用して完全に回復させるという手順になります。

Spitter の追加

Ellen がダメージを受けることを確かめたり、ライフ制システムを素早くプレイテストしたりできるようにするため、Ellen のスタート地点付近のシーンに Spitter を配置します。

開いているシーンの Project ビューに移動し、3DGamekit > Prefabs > Characters > Enemies > Spitter のフォルダで Spitter を見つけてください。

Spitter をシーンビューにドラッグして、必要に応じて位置と回転を調整します。再生モードに入ってすぐ Spitter が Ellen を見つけられるように、青い円の中に Ellen が入っていることを確認してください。離れた場所にいる敵のところまで走っていく時間を節約できます。

Detection Radius を調整するには、Spitter を選択した状態で、インスペクタビューの Spitter Behaviour スクリプトコンポーネントを探し、Detection Radius フィールドの値を変更します。この例では 8 を使用していますが、皆さんの設定に合わせてサイズを調整してください。

ライフ回復アイテムの入った箱の追加

Project ビューで、検索ボックスで「Health Crate」を検索して、HealthCrate プレハブを見つけます。

または、3DGamekit > Prefabs > Interactables > HealthCrate とフォルダーをたどっても見つけられます。

HealthCrate プレハブを Project ビューからシーンビューにドラッグし、適切な場所に配置します。回転させて、お好みの位置に移動します。

シーンビューで HealthCrate を選択した状態で、インスペクタビューで、Interact On Trigger (Script) コンポーネントを見てください。

このスクリプトコンポーネントは、HealthCrate がリストされたゲームオブジェクトに対してイベントを呼び出し、それらと HealthCrate の間のインタラクションを可能にします。この場合、プレイヤーが Ellen を HealthCrate のコライダー領域に向かって移動したときに発生します。

現在、Ellen のライフを回復するためのゲームオブジェクトや関数は設定されていないので、再生モードで HealthCrate と衝突させても何も起きません。

試しに再生モードに入って、Ellen に Spitter からダメージを受けさせ、HealthCrate にぶつかってライフを回復させようとしてみましょう(何も起きません)。

Interact On trigger

Ellen がライフを回復できるようにするため、シーン内のゲームオブジェクトを Interact On Trigger に追加する必要があります。

注意:以下のステップでは、ドラッグアンドドロップで設定を進めますが、フィールドの横にある円をクリックして表示されるウィンドウで設定を進めることもできます。

こちらの方法で設定を行う場合は、Project ビューのプレハブではなく、現在のシーンの Hierarchy ビューから Ellen を選ぶようにしてください。

再生モードで HealthCrate が選択解除されている場合は、改めて選択してください。

On Enter() の空白になっているオブジェクトで、円形の選択ボタンを押します。

Assets はデフォルトで選択されているので、上部のバーから Scene タブを選択します。

「Ellen」と検索します。プレイヤーキャラクターの名前を変更している場合は、その名前で検索してください。

「Ellen」とだけ書いてあるものを選択します(それ以外の「Ellen」が入っているものは Ellen のパーツを表します)。

これで、On Enter() でインタラクトするゲームオブジェクトとして Ellen が選択されたので、次はライフを回復するための関数を選択しましょう。

Interact On Trigger (Script) のドロップダウンフィールドのうち、Ellen の隣にあるものがこの時点では No Function となっています。

ドロップダウンメニューで、Damageable > ResetDamage() を選択します。

このステップでは、シーン内の HealthCrate と Ellen をリンクして、Ellen がコライダーに入ったときに ResetDamage() を呼び出し、ライフを回復できるようにしました。

ここでレベルを再生して、Spitter からダメージをもらい、次に HealthCrate に衝突すると、Ellen のライフが完全に回復するはずです。

16. シーン内・シーン間のテレポート

シーン内でのテレポート

シーン内でプレイヤーをテレポートするには、トランジションを設定する必要があります。このために、2 つのプレハブを作成します。

  • TransitionStart
  • TransitionEnd

まず、トランジションの開始点を設定する必要があります。

  • Project ウィンドウで、Prefabs > SceneControl の順に開きます。
  • TransitionStart プレハブを探す
  • TransitionStart をシーンビューにドラッグします。
  • プレイヤーが歩くときにコライダー(緑色の箱)に触れる位置に配置します。下の例では、ドアの反対側に配置しています。

目的地を設定するには、次のようにします。

  • SceneControl フォルダからもう 1 度 TransitionStart プレハブをシーンビューにドラッグします。

インスペクターに移動し

  • TransitionEnd に名前を変更します。

では、この 2 つをリンクしてみましょう。

  • Hierarchy で、TransitionStart を選択します。
  • インスペクターで、TransitionPoint コンポーネントを見つけます。
  • Hierarchy から Ellen を TransitionPoint コンポーネントの Transitioning Game Object フィールドにドラッグします。
  • Transition Type は Same Scene にします。

これにより、Ellen だけがテレポートされるオブジェクトとして設定され、かつ同じシーン内にテレポートされるようになります。

次に、テレポート先を設定します。

  • TransitionEnd を TransitionPoint コンポーネントの DestinationTransform スロットにドラッグします。
  • Transition When は On Trigger Enter にします。

On Trigger Enter は、プレイヤーがコライダーに入った時にのみトランジションが作動し、キーを押した時には作動しないことを意味しています。プレイヤーがインタラクトキー(E)を押した時だけテレポートしたい場合は、Transition When を Interact Pressed に設定してください。

別のシーンへのテレポート

プレイヤーを新しいシーンに遷移させるには、2 つのプレハブが必要です。

TransitionStart は、前のセクションで使用したものと同じプレハブです。このプレハブには Transition Start コンポーネントが含まれており、テレポーテーションの開始場所と、テレポーテーションがプレイヤーを連れて行く場所のすべてのプロパティを定義しています。このプレハブを、遷移を開始する場所に配置します。

TransitionDestination は、プレイヤーを「受け取る」プレハブです。Transition Destination コンポーネントが含まれています。このプレハブを、トランジションを先となる別のシーンに配置します。

これら 2 つのコンポーネントの詳細については、3D Game Kit のアセットパッケージに含まれる「Component Reference Guide」を参照してください。

TransitionDestination の設定

最初にテレポーテーション先を設定して、後で開始点を設定するときに必要な情報を得られるようにしましょう。シーンにトランジションを追加するには、そのシーンを開き、Project ウィンドウに移動し、Prefabs > SceneControl > TransitionDestination に移動します。シーン内の、テレポーターが転送してくる場所に配置します。

TransitionDestinaton プレハブには、Scene Transition Destination コンポーネントが含まれています。

  • 最初に、Destination Tag に何か文字を設定します。

このシーンの中で、その文字を持つ唯一の Scene Transition Destination コンポーネントであれば、どの文字でも構いません。

次に、どのゲームオブジェクトを受け取るかを設定します。Hierarchy ウィンドウから、プレイヤーのゲームオブジェクト(Ellen)を Transitioning Game Object スロットにドラッグします。

最後に、エディターのビルド設定に目的の Scene があることを確認してください。

  • 設定を行うには、File > Build Settings に移動し、Add Open Scenes をクリックします。

TransitionStart の設定

これらの設定は、前のセクションで説明したものとほとんど同じですが、いくつか異なる点があります。

  • Transition Type を Differenct Zone に設定します。
  • New Scene Name を送信先のシーンの名前に設定します。
  • Transition Destination Tag を、Transition Destination Component で設定した Destination Tag の文字に設定します。
  • 再生ボタンを押して、トランジションがある場所まで歩きます。Level1 のスタート地点に飛ばされるはずです。

Complete this Tutorial