(Roll-a-Ball)...3 3. プロジェクトダイアログが表示されますので、 Project Name...

72
1 Unity 入門チュートリアル 「玉転がし」 (Roll-a-Ball) HDRP version

Transcript of (Roll-a-Ball)...3 3. プロジェクトダイアログが表示されますので、 Project Name...

  • 1

    Unity 入門チュートリアル

    「玉転がし」 (Roll-a-Ball) HDRP version

  • 2

    プロジェクトを作成す

    る まずはプロジェクトを作成しましょう。

    プロジェクトを作成するには、以下の操作を行います。

    1. Unityエディタを起動します。既に起動している場合はメニューバー

    の Fileから New Project...を選択します。 (以降この操作は

    File→New Project...のように表記します。

    2. 右上の New を選択します。

  • 3

    3. プロジェクトダイアログが表示されますので、 Project Name に作成

    するゲーム名を入力します。今回は"Roll-a-Ball"とします。

    4. Locationにプロジェクトを保存するフォルダを指定します。

    5. Template は High-Definition RP を設定します。

    6. 最後に Create Project をクリックしてプロジェクトを作成します。

  • 4

    シーンを保存する 次にシーンを保存します。 シーンを作成するには、以下の操作を行

    います。操作が完了後、シーンの情報を保存したシーンファイル(*

    **.unity)が作成されます。

    1. File→New Sceneを選択します。

    2. File→Saveを選択します。

    3. 新規保存の場合はシーン名を指定します。今回は stage01としま

    す。

    プロジェクトとシーン

    Unity では、ゲーム全体の構成を「プロジェクト」、ゲームの各部を

    構成する独立した各場面や各ステージを「シーン」と呼びます。 商

    用になるような手の込んだゲームはたくさんのシーンを含み、とき

    には複数のシーンを 1度に組み合わせることもあります。

  • 5

    エディターのレイアウトを統一

    する 最後にゲーム作りを行う前に、このチュートリアルで UIの位置を分

    かりやすく説明するためにエディタの UI 表示を統一します。

    ● 右上の Layout を選択し、2 by 3を選択します。

    ● Gameタブを選択し、Free Aspectを選択、4:3へ変更します。

    ● Project ビューの下のバーを左へずらします

  • 6

    インターフェースの使い方 Unityを起動すると、下記のような画面が表示されます。 Unityはこの

    画面でスクリプト制作以外の殆どの操作を行うことが出来ます。

    各要素は以下のとおりです。

    1. シーン(Scene)ビュー

    シーンビューには製作中のゲーム世界(シーン)が表示され、自由な

    位置・角度から眺めることができます。

    2. ゲーム(Game)ビュー

    ゲームビューはゲーム画面です。 ゲームプレイヤーは基本的にこの画

    面を見ながらゲームをプレイします。 また UI等の操作はこの画面で

    行います。

  • 7

    3. インスペクター(Inspector)ビュー

    シーンビューやプロジェクトビューで選択したオブジェクトについ

    て、それらが持つ属性を表示・編集するためのビューです。 属性には

    座標やメッシュといった外見上のものから、衝突判定や物理制御に関

    するパラメーターなどもあり、その他ユーザー定義のものもここに表

    示されます。

    4. ヒエラルキー(Hierarchy)ビュー

    シーン内に存在するオブジェクトの一覧が表示されます。 編集中のシ

    ーン内でオブジェクトをコピー/ペーストしたり、適切な名前をつけて

    整理することもできます。

    5. プロジェクト(Project)ビュー

    製作中のプロジェクト(ゲーム全体)に含まれるシーン、スクリプ

    ト、グラフィックやサウンドなどのデータ、その他のリソースがファ

    イル単位で表示されます。ここに出来合いのスクリプトセット、アー

    トアセット、シェーダーなどを「パッケージ」単位でインポートする

    こともできます。

  • 8

    Sceneビューの移動方法 Sceneビューは以下の操作で自由に移動する事ができます。 この操作

    を行うためには Sceneビューへフォーカスがあたっている必要があり

    ます。

    Hierarchyビューに Cube を作成するなどした後に以下の操作を試して

    みましょう。

    操作 動作

    マウスホイール Sceneビューの拡大・縮小

    右クリックを押しながらドラッグ 視点を回転させる

    真ん中クリックを押しながらドラッグ Sceneビューの平行移動

    オブジェクトをダブルクリック 指定のオブジェクトにフォーカスを当てる

  • 9

    地面の作成 まずは地面を作成します。地面を作るには以下の操作を行います。 こ

    れで、シーン内に Panelの役割を持ったゲームオブジェクト

    (GameObject)が作成されます。

    1. Hierarchyの Createをクリックします。

    2. "3D Object" → "Plane" を選択します。

  • 10

    GameObject(ゲームオブジェ

    クト)とは? Unity では、シーン内に配置される全ての要素を「ゲームオブジェク

    ト」と呼びます。 ゲームオブジェクトには、目に見える 3D メッシ

    ュ、ライト(照明)、物理オブジェクト、 あるいは目に見えないサウ

    ンド、トリガーなど様々な形がありますが、Unity によって挙動が管

    理され、 任意にスクリプトを割り当てて制御できる物という共通点が

    あります

    地面を並べる 大きさを調整したいと思います。この大きさを調整するには 2 つのア

    イディアがあります。すなわち、Panelを並べるか、Panelを引き伸

    ばすかです。特に理由はないですが、今回は並べるを選択します。

    1. Hierarchyビューで Panelを選択した状態で、右クリック→Duplicate

    を選択します。

    2. 新しく作成した Panel の位置を選択し、左上のパネルから操作モー

    ドを「オブジェクト移動」モードへ変更します。操作モードの詳細

    については、シーンビューの操作のハンドツールを参照してくださ

    い。

    https://docs.unity3d.com/jp/current/Manual/SceneViewNavigation.html

  • 11

    3. 表示中の矢印を操作することで Panel の位置を調整することができ

    ます。

    この作業で 4枚の Panelで地面を構築します。

    また名称も変更しておきましょう。Panelを Ground1、以降 Ground2,

    Ground3, Ground4といった形にオブジェクト名を変更します。オブ

    ジェクト名の変更は、インスペクタービューの上にある名称を変更す

    ることで行います。

  • 12

    四枚の Panel を設定 では実際に座標を調整します。 座標の管理は Transformコンポーネン

    トが行っています。Positionが座標、Rotationが回転、Scaleがサイズ

    を管理します。今回は各パネルを以下の位置に調整します。

    ● Ground1 (x:5, y:0, z:-5) ● Ground2 (x:5, y:0, z:5) ● Ground3 (x:-5, y:0, z:-5) ● Ground4 (x:-5, y:0, z:5)

  • 13

    床の色を塗る 床に色を設定します。

    Unityでモデルに色を塗る方法は 2つ用意されています。一つはテク

    スチャを設定する、もうひとつはモデル全体の色を設定することで

    す。 これらの「色」や「反射」といった材質は、Material(材質)フ

    ァイルで管理しています。

    Material ファイルを作成する 1. Project ビューの Create ボタンをクリックします。

    2. 一覧から Material を選択します。

    3. Material の名前を GroundMaterial に変更します。

  • 14

    Material に模様と色を設定 次に Material の模様を設定します。

    1. 先ほど作成した GroundMaterial を選択します。

    2. Surface Inputs グループの Base Map の 左側にある ◎を選択し、

    「Default-Checker」を選択します。

    3. 右側の枠の部分をクリックして色を設定します。

  • 15

    Ground に Material を設定 次に作成した Material 情報を利用して Ground に色を塗ります。

    Ground を Hierarchy ビューの Ground (1〜4) へドラッグ&ドロップしま

    す。

  • 16

    壁の作成 四方を壁で囲うステージを用意します。 壁は四方に設定されてお

    り、ボールが Ground の外へ逃げることを防ぐ役割を持っています。

    では壁を作成しましょう。

    1. Hierarchy ビューの Create ボタンをクリックします。

    2. 3D Object > Cube より Cube を作成します。

    3. 作成した Cube の名前を Wall に変更します。

    壁の色を設定する 壁の色も変更します。

    1. Project ビューの Create ボタンをクリックします。

    2. Material を選択します。

    3. 名前は WallMaterial とします。

    4. WallMaterial を選択します。

    5. Surface Inputs グループの Base Map の右側にある白枠をクリックし

    ます。

    6. カラーピッカーが表示されるので、色を赤に近い色に設定します。

    7. 先ほど作成した WallMaterial を、 Wall オブジェクトへドラッグ&ド

    ロップします。

  • 17

    壁の配置 次に作成した壁のサイズを変更する必要がありますが、今回は引き伸

    ばす方法を選択します。

    引き伸ばすには、左上のパネルよりスケールモードを選択した状態で

    オブジェクトを選択し、引き延ばしたい方向に伸びているブロックを

    ドラッグします。

  • 18

    次に、作成した Cube を移動モードで選択し、Vを押しながら移動させ

    ます。Vを押しながら移動させることで、他モデルの頂点に吸い付く

    ように移動しますので、楽に調整することが出来ます。

    今回は完全を期すためインスペクタービューでも調整します。Panel

    の大きさは Cubeの 10x10 に該当しますので、以下のようなサイズへ

    変更します。名前は Wallに変更します。

    ● Position (x:-0.5, 0.5, -9.5) ● Scale (x:19, y:1, z:1)

    反対にも配置します。 作成した Wall を Duplicate し、向かい側に

    配置します。名前は Wall 1 に変更します。

    ● Position (x:0.5, 0.5, 9.5) ● Scale (x:19, y:1, z:1)

  • 19

    オブジェクトの回転 両端の壁を配置するのは2つのアイディアがあります。一つは「伸ば

    した Cube の棒」を「90 度傾ける」方法、もう一つは「(x:1, y:1,

    z:19)のように異なる方向へ伸びる棒を作成する事です。

    今回は回転の説明も兼ねて、90度傾ける方法について紹介します。

    回転させるには、rotation モードを選択し、表示された外枠をドラ

    ッグします。Ctrl(Command)を押しながら操作すると、45 度ずつ回

    転します。

    ただし今回は Inspector ビューで設定します。 まず 「Wall」の一つを

    Duplicate して複製し、 Wall 2 を作ります。次に、Wall 2 の Position

    と Rotation を以下のように設定します。

    ● Position (x:-9.5, y:0.5, z:0.5) ● Rotation (x:0, y:90, z:0)

    Wall 2を複製し Wall 3 を作成、位置は以下のように調整します。

    ● Position(x:9.5, y:0.5, z:-0.5)

  • 20

  • 21

    オブジェクトの整理 このままではシーンやプロジェクト内にオブジェクトが乱雑して把握

    する事が面倒になります。 そこで、空のオブジェクトを使用してオブ

    ジェクトを整理します。

    Material の設定 Mateial 一覧を格納する Materials フォルダを作成し、Material 一

    覧をここに格納します。

    1. Project ビューの Create ボタンをクリックします。

    2. Folder を選択します。

    3. フォルダ名を Materials に変更します。

    4. 作成した GroundMaterial 及び WallMaterial を選択し、Materialフ

    ォルダへドラッグ&ドロップします。

    空の Stage オブジェクト作成 次に Hierarchy ビューのオブジェクト群を整理します。 空の Stage

    オブジェクトを作成します。

    1. Hierarchy ビューの Create ボタンをクリックします。

    2. Create Empty を選択し、「GameObject」という名前のゲームオブ

    ジェクトを作成します。

    3. GameObject を選択します。

    4. インスペクタービューの一番上にある Transform コンポーネントの

    右上にある歯車アイコンをクリックします。

  • 22

    5. Reset を選択すると Position、Rotation、Scaleが初期値になりま

    す。

    6. GameObject のオブジェクトの名前を Stage に変更します。

    7. Hierarchy ビューで先ほど作成した「Wall」及び「Ground」の一覧を

    選択し、Stage オブジェクトへドラッグ&ドロップします。

    プレイヤーの追加 まず最初にプレイヤーに登場いただきます。

    1. Hierarchy ビューの Create ボタンをクリックします。

    2. 3D Object -> Sphere を選択します。

    3. Inspector ビューで名前を Player へ変更します。

  • 23

    座標はステージ中央高めに配置します。

    ● Position (x:0, y:1.5, z:0)

    コンポーネント(部品)

    の追加 では早速、Player へコンポーネントを追加しましょう。 コンポーネン

    トを追加するには、Inspector ビューの「Add Component(コンポー

    ネントの追加)」ボタンで行います。

    1. Hierarchy ビューで Player を選択します。

    2. Inspector ビューで Add Component ボタンをクリックします。

    3. Physics -> Rigidbody を選択します。

  • 24

  • 25

    ゲームを再生する Unityは「ゲーム再生ボタン」をクリックすることで、ゲームの挙動

    を確認することが出来ます。

    ゲームを再生して下さい。ゲームの再生中はゲーム再生ボタンが青く

    光ります。

    物理演算の機能が働き、Player オブジェクトが落下する事が確認出

    来ます。

    ゲームの内容を確認したらゲームの再生を終了します。もう一度「ゲ

    ーム再生ボタン」をクリックします。

    ※Unity 上で編集作業を行う時は必ず、ゲームの再生が終了している

    状態で行うようにして下さい。ゲームの再生中に行った編集は再生が

    終わると再生前の状態に戻ってしまいます。

  • 26

    プレイヤーを任意の方

    向へ転がす機能の追加 転がすゲームを追加するには、入力を受け Player オブジェクトを転が

    す機能が必要です。 この機能は Unity の標準では用意されていないた

    め、自身でコンポーネントを作成する必要があります。

    このコンポーネントは C# で記述する事ができます。

    まず Player オブジェクトにコンポーネントを追加します。

    1. Hierarchy ビューで Player オブジェクトを選択します。

    2. Inspector ビューで Add Component ボタンをクリックします。

    3. New Scripts をクリックします。

    4. Name に PlayerController と入力します。

    5. Create And Add ボタンをクリックします。

    これで Playerオブジェクトに「何も機能を持たないコンポーネント」

    が追加されました。

  • 27

    同様に、Project ビューの Assets フォルダ直下に、

    PlayerController.cs ファイルが作成されます。 これが今回作成した

    コンポーネントの本体のスクリプトとなります。フォルダが散らかる

    のは良くないので、スクリプトファイルは Scripts フォルダに移動さ

    せましょう。PlayerController を選択し、Assets/Scripts フォルダへド

    ラッグ&

    ドロップします。

    コンポーネントのスク

    リプト変更 次はこのコンポーネントのスクリプトを書き換えます。

    スクリプトを変更するには、先ほど作成した PlayerController.cs をダ

    ブルクリックし、Visual Studio などのコードエディタを起動させま

    す。

  • 28

    エディタが起動します。

    まずはサンプルコードとして提供されているコードを削除し、クラス

    定義のみにします。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class PlayerController : MonoBehaviour

    {

    }

  • 29

    では考えてみましょう。今回作成するスクリプトは「ボタンを押した

    ら転がる」機能を持っています。 機能として分解すると、以下の通り

    になりそうです。

    1. 毎フレーム入力を受け付ける

    2. 物理演算前で動く前に、入力内容を元にプレイヤーの rigidbody

    (剛体) に力を加える

    入力機能の追加 まずは「毎フレーム動作する」の部分を解決します。 Unity のスクリ

    プトは、特定のメソッドを定義すると自動的にメソッドを特定のタイ

    ミングで呼び出します。

    例えば、クラス内に void Update() と記述すると、{ から } 内に記述

    した処理を毎フレーム更新時に呼び出しますし、 void FixedUpdate()

    と記述すると物理演算でキャラクターが動く度に呼ばれる処理を設定

    する事ができます。

    今回は物理演算を使用するので、FixedUpdate 内に処理を記述しま

    す。 コードを以下のように変更します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class PlayerController : MonoBehaviour

    {

    void FixedUpdate()

    {

    }

    }

  • 30

    次に入力(Input)を FixedUpdate 内で取得します。 以下のコードを

    記述すると、x と z の中にキーボード入力の内容が入ります。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class PlayerController : MonoBehaviour

    {

    void FixedUpdate()

    {

    // 入力を xと zに代入

    float x = Input.GetAxis("Horizontal");

    float z = Input.GetAxis("Vertical");

    }

    }

  • 31

    物理演算機能の追加 後は取得したキー入力を元に rigidbody コンポーネントに力を加え

    ます。 同一オブジェクトのコンポーネントを取得するには

    GetComponent を使用します。 今回は Rigidbody を取得するので、

    「GetComponent()」を記述します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class PlayerController : MonoBehaviour

    {

    void FixedUpdate()

    {

    float x = Input.GetAxis("Horizontal");

    float z = Input.GetAxis("Vertical");

    // 同一の GameObjectが持つ Rigidbodyコンポーネントを取

    Rigidbody rigidbody = GetComponent();

    }

    }

    最後に取得した rigidbody に入力の力を加えます。 力を加える API

    は何を使えば良いのでしょうか。APIを検索してみましょう。

    http://docs.unity3d.com/jp/current/ScriptReference/Rigidbody.html

    APIマニュアルによると、「AddForce(Rigidbodyオブジェクトに力

    を加えます。力を加えることでオブジェクトを動かすことが出来ま

    す)」を使うのが良さそうです。

    http://docs.unity3d.com/jp/current/ScriptReference/Rigidbody.html

  • 32

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class PlayerController : MonoBehaviour

    {

    void FixedUpdate()

    {

    float x = Input.GetAxis("Horizontal");

    float z = Input.GetAxis("Vertical");

    Rigidbody rigidbody = GetComponent();

    // rigidbodyの x軸(横)と z軸(奥)に力を加える

    rigidbody.AddForce(x, 0, z);

    }

    }

    これで機能はひと通り作成しました。それではゲームを再生してみま

    しょう。プレイヤーの挙動は非常にゆっくり動作します。 これは単純

    に「押す力」が弱い為に発生します。

    これの簡単な解決法は、rigidbody.AddForceに与える押す力を強化す

    る事です。試しに 10倍くらいにしてみましょう。

  • 33

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class PlayerController : MonoBehaviour

    {

    void FixedUpdate()

    {

    float x = Input.GetAxis("Horizontal");

    float z = Input.GetAxis("Vertical");

    Rigidbody rigidbody = GetComponent();

    // xと zに 10をかけて押す力をアップ

    rigidbody.AddForce(x * 10, 0, z * 10);

    }

    }

    かなりスムーズになりました。しかし、本当にこのゲームに相応しい

    速度でしょうか? ゲームバランスに直結する項目なので、よくよく調

    整したい所です。

    この値をスクリプトを変更し調整するのも良いですが、Inspectorから

    サクっと調整出来るようにします。

    まずは PlayerControllerクラスに speed変数を追加します。 その後、

    speed変数を xと zに掛けるよう変更します。

  • 34

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class PlayerController : MonoBehaviour

    {

    // speedを制御する

    public float speed = 10;

    void FixedUpdate()

    {

    float x = Input.GetAxis("Horizontal");

    float z = Input.GetAxis("Vertical");

    Rigidbody rigidbody = GetComponent();

    // xと zに speedを掛ける

    rigidbody.AddForce(x * speed, 0, z * speed);

    }

    }

    これで Inspectorビューに speed設定項目が追加され、Inspectorビュ

    ーから調整しながらゲームを作成することが出来るようになりまし

    た。

  • 35

    カメラを動かす 最も容易なカメラを動かす方法は、カメラを Player の子オブジェク

    トに設定することです。

    Unity のオブジェクトは親オブジェクトとの相対座標で保持している

    ため、Player の子に Main Camera を配置すれば、 Player が動作した

    際にカメラも追随する事になります。早速やってみましょう。

    1. Hierarchy の Main Camera を選択

    2. 同じく Hierarchy の Player へドラッグ&ドロップ

    ゲームを再生せず Player オブジェクトを動かしてみましょう。カメラ

    はプレイヤーを追尾して移動しています。

  • 36

    ではゲームを再生してみてください。世界がグルングルン回っていま

    す。

    これは Player 自体が転がって移動しているため、親子関係にあるカメ

    ラも転がっています。 これを解決する選択肢は 2つ、「Playerが転が

    らないように移動」するか、「プレイヤーを追跡するコンポーネント

    を作るか」です。今回は後者を選択肢します。

    その前に Main Camera を Player オブジェクトから外しておきましょ

    う。

  • 37

    プレイヤーを追跡する

    コンポーネントの作成 プレイヤーを追跡するコンポーネントを作成します。 今回作るコンポ

    ーネントの機能は以下のとおりです。

    1. Player の位置を取得する

    2. 毎フレーム Player の位置へ座標を調整する

    まずは FollowPlayer コンポーネントを作成し、「Main Camera」へ追

    加します。

    1. Hierarchy ビューで Main Camera を選択します。

    2. Inspector ビューで Add Component ボタンをクリックします。

    3. New Scripts を選択し、FollowPlayer を追加します。

    4. Project ビューで Assets 以下の FollowPlayer.cs を Assets/Scripts フ

    ォルダへ移動します。

    次に FollowPlayer をダブルクリックし、Visual Studio などを起動

    します。

  • 38

    プレイヤーを追跡する プレイヤーを追跡する方法はいくつか思いつきます。 今回は Unity エ

    ディタでシーン上にある Player オブジェクトへの参照を事前に設定

    し、参照を元にオブジェクトの座標を取得する方法を選択します。

    まずはコードの設定です。 先ほどと同じように public で宣言します

    が、今度は Transform の変数を定義します。 これは Transform のコ

    ンポーネントを持つオブジェクトを登録するためです。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class FollowPlayer : MonoBehaviour

    {

    public Transform target; // ターゲットへの参照

    void Update()

    {

    // 自分の座標に targetの座標を代入する

    GetComponent().position =

    target.position;

    }

    }

    コードを記述したら Unity エディタへ戻り、MainCamera が持つコン

    ポーネント一覧を確認しましょう。 すると FollowCamera に Target

    の項目が追加されています。

    この項目へ登録したいオブジェクト(Player)をドラッグ&ドロップ

    します。

  • 39

    さて再生してみましょう。 唐突にカメラの位置が変更となり、まるで

    FPSのような画面になってしまいました。

    Offsetを設定する

  • 40

    これはこれで面白いのですが、出来ればある程度距離を離した TPS

    のような状態でプレイ出来るようにしたい所です。

    そこで、「起動時にあるカメラとプレイヤー距離を維持する」機能を

    追加します。 これはゲーム再生時に「PlayerとMainCameraの相対

    距離」を求めて保持しておき、毎フレーム「Playerの位置+相対距離

    でカメラの位置を設定」する事で実現します。

    まず target である player の座標は position(x:0, y:1.5, z:0) ですので

    MainCamera の座標は以下のとおりにします。

    ● Position(x:0, y:9, z:-5) ● Rotation(x:60, y:0, z:0)

    次に FollowPlayer コンポーネントのコードを変更します。

    Start はコンポーネントの起動時に 1度だけ呼び出されるメソッドで

    す。ここで offsetへ相対距離を取得しておきます。相対距離を使用

    し、常に一定の距離を離して Playerを追随します。

  • 41

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class FollowPlayer : MonoBehaviour

    {

    public Transform target; // ターゲットへの参照

    private Vector3 offset; // 相対座標

    void Start()

    {

    //自分自身と targetとの相対距離を求める

    offset = GetComponent().position -

    target.position;

    }

    void Update()

    {

    // 自分自身の座標に、targetの座標に相対座標を足した値を

    設定する

    GetComponent().position =

    target.position + offset;

    }

    }

  • 42

    ゲームを再生してみてください。ステージ内を自由に走り回ります。

    Itemオブジェクトの追

    加 まず Item の元となるアイテムを作成します。

    1. Hierarchy ビューの Create をクリックします

    2. 3D Object -> Capsule を クリックします

    3. 生成した Capsule を選択し名前を Item に設定します

    少し大きすぎるので、Item の大きさと位置を調整します。

    ● Position:(x:0, y:1: z:0) ● Scale:(x:0.5, y:0.5, z:0.5)

  • 43

    Itemオブジェクトの構

    成を Prefabへ書き出

    す この作成したアイテムですが、量産し易いようにオブジェクト構築情

    報を prefab(プレハブ)として書き出します。

    今回もファイルを整理するため、専用フォルダを作成して、そこに格

    納しましょう。

    1. Project ビューで Create をクリックし、Folder を選択します。

    2. 新しく作成したフォルダ名を Prefabs とします。

    あとは Item オブジェクトを Prefab として書き出します。青いアイコ

    ンの「Item」オブジェクトが出来れば成功です。

    1. Hierarchy ビューの Item を選択します。

    2. Project ビューの Prefab フォルダへ Item オブジェクトをドラッグ

    &ドロップします。

  • 44

    プレハブ化すると以下のように表示されます。

  • 45

    Itemオブジェクトの配置 先ほどファイルへ書きだしたアイテムをシーンへ配置します。

    1. Project ビューの Prefab フォルダの Item を選択します。

    2. Scene ビューへドラッグ&ドロップします。

    これで、先ほどセットアップしたオブジェクトと同様にセットアップ

    されたオブジェクトがシーンへ配置されました。簡単に円形に配置し

    てみます。

  • 46

    Player と Item の接触

    判定 Item に接触判定を追加します。この機能も標準では用意されていない

    機能ですので、新しくコンポーネントを追加します。

    1. Hierarchy ビューで Item オブジェクトを選択します。

    2. Inspector ビューで Add Component -> New Script を選択します。

    3. Nameに「Item」と指定し「Create And Add」ボタンをクリックしま

    す。

    ● OnTriggerEnter:判定のみの Triggerとの接触判定

    ● OnCollisionEnter:物理的な反射を持つ Collider との接触判定

    今回はどちらかと言えば、アイテム回収時にスルっと抜けて欲しいの

    で OnTriggerEnter を選択します。

    MonoBehaviour.OnTriggerEnter(Collider)を参考に Item.cs にコールバ

    ックを追加します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class Item : MonoBehaviour

    {

    // トリガーとの接触時に呼ばれるコールバック

    void OnTriggerEnter(Collider hit)

    {

    }

    }

    http://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.OnTriggerEnter.html

  • 47

    Itemの接触判定を

    Triggerに変更 また、判定方式を Trigger にしたため、接触判定も Trigger に設定する

    必要があります。 Unityエディタへ戻り、Item の Collider の設定を

    Trigger に設定します。

    1. Hierarchyビューの Itemオブジェクトを選択します。

    2. Inspectorビューの CapsuleColliderコンポーネントの IsTriggerにチ

    ェックを入れます。

  • 48

    Playerとの接触判定 先ほどの処理で、あらゆる Triggerとの接触判定を行うことが出来る

    ようになりました。しかし、本来当たり判定は Player のみと行いた

    い所です。

    ここでいくつかのアイディアがあります。例えば、Playerへの参照を

    事前に登録しておき接触時に比較する、接触したオブジェクト名を確

    認する、接触したオブジェクトのタグを確認する、接触対象が指定コ

    ンポーネントを持っているか確認する、メッセージを送信する(自発

    的に動いてもらう)等です。

    今回はシンプルで汎用的な「タグを確認する」方法を採用します。

    OnTriggerEnterの引数である hitには、接触対象の情報が含まれま

    す。この接触対象のタグを調べ、Player ならば特別な処理を行うよう

    に Itemコンポーネントを以下のように修正します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class Item : MonoBehaviour

    {

    // トリガーとの接触時に呼ばれるコールバック

    void OnTriggerEnter (Collider hit)

    {

    // 接触対象は Playerタグですか?

    if (hit.CompareTag ("Player"))

    {

    // 何らかの処理

    }

    }

    }

  • 49

  • 50

    Playerにタグを設定す

    る Playerオブジェクト側も設定しましょう。先ほど「Playerタグを持つ

    オブジェクトと接触した場合」の処理を記述したため、Playerオブジ

    ェクトにも Playerタグが必要です。

    1. Hierarchyビューで Playerオブジェクトを選択します。

    2. Inspectorビューの Tagを Playerへ変更します。

  • 51

    接触判定時に Item を

    削除する 接触時にオブジェクトを削除するように設定します。削除は Destroy

    メソッドを使用します。

    Destroyはオブジェクトを削除するメソッドです。このメソッドで指

    定したオブジェクトは削除され、ゲームから消滅します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class Item : MonoBehaviour

    {

    // トリガーとの接触時に呼ばれるコールバック

    void OnTriggerEnter (Collider hit)

    {

    // 接触対象は Playerタグですか?

    if (hit.CompareTag ("Player")) {

    // このコンポーネントを持つ GameObjectを破棄する

    Destroy(gameObject);

    }

    }

    }

    これで Playerとの接触時に Itemオブジェクトが破棄されます。

    http://docs.unity3d.com/ja/current/ScriptReference/Object.Destroy.htmlhttp://docs.unity3d.com/ja/current/ScriptReference/Object.Destroy.htmlhttp://docs.unity3d.com/ja/current/ScriptReference/Object.Destroy.html

  • 52

    Prefabの更新 現状、セットアップした一つの Itemオブジェクトのみ消えるように

    なっています。 それでは Prefab として配置したオブジェクトも同様

    のセットアップになるように、Prefabの値を更新します。

    1. Hierarchy で Item オブジェクトを選択します。

    2. Inspector で Overrides ボタン、Apply All ボタンをクリックします。

  • 53

    アイテムの整理 最後にアイテムを整理します。 手順は Stage の設定時に行った内容

    と同じです。ただし、アイテムは Static なオブジェクトではありま

    せんので、Staticにチェックは入れません。

    1. Hierarchyビューで Createを選択します。

    2. 「Create Empty」を選択します。

    3. Transform コンポーネントの歯車アイコンから Reset を選択しま

    す。

    4. Inspectorビューで先ほど作成したオブジェクトの名前を「Items」に

    変更します。

    5. 先ほどから作成した Item オブジェクト全てを選択し、Items オブジ

    ェクトへドラッグ&ドロップします。

  • 54

    「残りのアイテム数」

    を表示する UIの準備 まずは UIを用意します。今回は余り凝ったことはせず、単純に画面左

    下に残りのアイテム数を表示する UIを作成します。

  • 55

    Canvasの設定 まずは UIを表示する Canvasを用意します。

    1. Hierarchyビューの Createボタンをクリックします。

    2. UI > Canvasを選択します。

    Canvasが生成されますので、想定サイズを設定します。

    1. Hierarchyビューで Canvasオブジェクトを選択します。

    2. CanvasScalerの「UI Scale Mode」を Scale With Screen Size に設

    定します。

  • 56

    テキストの設定 次にテキストを表示します。

    1. Hierarchyビューの Createボタンをクリックします。

    2. UI -> Text をクリックします。

    3. 作成した Canvas -> Text オブジェクトを Inspector ビューで

    ScoreLabel に名前を変更します。

    これで文字が表示されるようになりました。

    これを左下へ移動し、フォントの大きさを調整します。

    1. Hierarchy で Canvas -> ScoreLabel オブジェクトを選択します。

    2. RectTransform コンポーネントの値を以下のように設定します。 ● PosX : -230, PosY : -230, Width : 300, Height : 100

  • 57

    1. Hierarchy で Canvas -> ScoreLabel オブジェクトを選択します。

    2. Text コンポーネントの Font Size を 60 に設定します。

    3. Text を「0」に設定します。

    4. Color に白を指定します。

  • 58

    GameControllerの作

    成 次に、残りの Item 数を先ほど作成した ScoreLabel に通知する仕組

    みを用意します。

    この機能を実装する方法は無数にありますが、今回は一番簡単な

    GameControllerに管理させる方法を採用します。また Item 数のよう

    なゲーム全体の進行に関する機能は GameControllerが持つのが望ま

    しいです。 この GameController が Item の残数を数え、変更があれば

    通知する仕組みを持ちます。

    では GameController を作成していきましょう。

    1. Hierarchyビューの Createボタンをクリックします。

    2. 「Create Empty」を選択します。

    3. Transform コンポーネントの歯車アイコンから Reset を選択しま

    す。

    4. 作成したオブジェクト名を「GameController」に変更します。

    5. Tag を「GameController」へ変更します。

  • 59

    Itemをカウントする前

    準備

    タグの設定 今回は Item オブジェクトに Item タグを設定し、該当のタグを持つ

    オブジェクトの個数を計測する方法を使用します。

    1. メニューバーから Edit -> ProjectSettings を選択してウィンドウを表

    示します。

    2. Tags and Layers を選択します。

    3. +ボタンを押し、タグを表示します。

    4. 「New Tag」を「Item」に変更します。

  • 60

    Itemオブジェクトに Itemタグ

    を設定する 次に Item タグを設定します。 先ほど Item タグを登録したことで

    一覧に Itemタグが追加されましたので、Item オブジェクトにタグを

    設定します。

    1. Hierarchy ビューで Item オブジェクトを選択します。

    2. Inspector ビューで Tag を Item に変更します。

    3. Overrides ボタン、 Apply All ボタンを押し Prefab を更新します。

  • 61

    Itemをカウントする機

    能を追加 GameController に Item をカウントする機能を追加します。

    まずは GameController コンポーネントを作成します。

    1. Hierarchyビューで GameControllerを選択します。

    2. Inspectorビューで Add Component をクリックします。

    3. New Script を選択し、GameControllerを生成します。

    GameController に以下のようにコードを記述します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class GameController : MonoBehaviour

    {

    public void Update ()

    {

    int count = GameObject.FindGameObjectsWithTag("Item").Length;

    }

    }

  • 62

    残りのアイテム数を表

    示する 残りのアイテム数を先ほど作成した UIに表示するように変更しま

    す。

    まずは GameControllerから Textコンポーネントへアクセスする方法

    を考えます。 今回もエディタで Textコンポーネントへの参照を設定

    する方法を利用します。

    まずは参照に使用するコードを作成します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    using UnityEngine.UI;

    public class GameController : MonoBehaviour

    {

    public Text scoreLabel;

    public void Update ()

    {

    int count = GameObject.FindGameObjectsWithTag ("Item").Length;

    }

    }

  • 63

    次に取得した Item数を text に代入します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    using UnityEngine.UI;

    public class GameController : MonoBehaviour

    {

    public Text scoreLabel;

    public void Update ()

    {

    int count = GameObject.FindGameObjectsWithTag ("Item").Length;

    scoreLabel.text = count.ToString ();

    }

    }

  • 64

    GameController と

    ScoreLabel の紐付け 最後に Unity エディタへ戻り、GameController と ScoreLabel を紐

    付けます。

    1. Hierarchy ビューで GameController オブジェクトを選択します。

    2. Canvas/ScoreLabel オブジェクトを ScoreLabel へドラッグ&ドロッ

    プします。

    ゲームを再生してみてください。 ゲーム再生時に残りのアイテム数が

    左下に表示され、アイテムを取得する度に残り個数が減ることが分か

    ります。

  • 65

    クリア時の UIを作成

    ラベルの作成 まずはクリア時の UI を表示します。

    1. Hierarchy ビューの Createをクリックします。

    2. UI -> Text を選択します。

    3. 作成した Text の名前を Inspector ビューで WinnerLabel と変更し

    ます。

    ラベルの設定 続いて WinnerLabel オブジェクトの内容を設定します。

    1. Hierarchy ビューで WinnerLabel オブジェクトを選択します。

    2. Inspector ビューで RectTransform の値を以下の値に設定します。

    ● (PosX:0, PosY:0, Width:300, Height:100)

  • 66

    3. Text コンポーネントの Text を「YOU WIN」に変更します。

    Text コンポーネントの FontSize を 60 に設定します。

  • 67

    クリア条件の設定 続いて GameController に少し手を加えてクリア条件を設定します。

    今回のゲームではアイテムを全て回収する(残りのアイテムが 0 にな

    る)ことが勝利条件ですので、Itemが見つからなかったら勝利としま

    す。

    1. Project ビューで GameController.cs をダブルクリックし、

    Visual Studio などを起動します。

    2. コードを以下のように修正します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    using UnityEngine.UI;

    public class GameController : MonoBehaviour

    {

    public Text scoreLabel;

    void Update ()

    {

    int count = GameObject.FindGameObjectsWithTag ("Item").Length;

    scoreLabel.text = count.ToString ();

    if (count == 0)

    {

    // クリア時の処理

    }

    }

    }

  • 68

    GameControllerから

    WinnerLabelへの参照を設定 最後にクリア時に初めて「YOU WIN」の文字が表示されるようにしま

    す。

    今回も Winner Label への参照が必要ですが、今までと同様にエディ

    ター側で設定します。

    1. GameController.csを Visual Studioなどで開きます。

    2. コードを以下のように修正します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    using UnityEngine.UI;

    public class GameController : MonoBehaviour

    {

    public Text scoreLabel;

    public GameObject winnerLabelObject;

    void Update ()

    {

    int count = GameObject.FindGameObjectsWithTag ("Item").Length;

    scoreLabel.text = count.ToString ();

    if (count == 0) {

    // クリア時の処理

    }

    }

    }

  • 69

    設定後、Unity エディタへ戻り、GameController から WinnerLabel

    への参照を構築します。

    1. Hierarchy ビューで GameController を選択します。

    2. Hierarchy ビューの WinnerLabel を Inspector ビューの

    GameController コンポーネントの winner Label Object へドラッグ&

    ドロップします。

    「YOU WIN」を非表示にする 次は YOU WIN を非表示にします。

    Unity で描画されているものを非表示にする方法はいくつかあります

    が、今回は GameObject を非アクティブにする事で非表示にします。

    1. Hierarchy ビューで WinnerLabel を選択します。

    2. Inspector ビューでオブジェクトのチェックを外します。

  • 70

    「クリア時に「YOU WIN」と

    表示する クリア時に非アクティブの「Winner Label」をアクティブにすること

    で、ゲームクリア時に YOU WINと表示します。

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    using UnityEngine.UI;

    public class GameController : MonoBehaviour

    {

    public Text scoreLabel;

    public GameObject winnerLabelObject;

    public void Update ()

    {

    int count = GameObject.FindGameObjectsWithTag ("Item").Length;

    scoreLabel.text = count.ToString ();

    if (count == 0) {

    // オブジェクトをアクティブにする

    winnerLabelObject.SetActive (true);

    }

    }

    }

  • 71

    ゲームをプレイ ゲームをプレイしてみてください。 Playerを転がしてアイテムを回収

    し、最後に「YOU WIN」の文字が表示されます。

  • 72