trybeetle

take it slow!!

Unityの使い方


Posted on May 16, 2018, 2:52 p.m.



Unityを基本操作について記載します。

参考URL

こちらに記載されているTutorialを元にしています。


Projectの作成

まず、Projectを作成します。
ProjectタブからNewをクリック
「Project name」、「Location」、「Template」を選択し、「Create Project」を押下

※Templateでは、3Dと2Dが選べます。今回のチュートリアルは、3Dゲームなので3Dを選択


GroundとPlayerの作成

まず最初にすることは、Sceneを保存します。
file -> save scenesを押下してください。
scene名は、MiniGameとしておきます。

続いて、Groundを作成します。
Hierarchyより、Create -> 3D object -> Planeを選択します。
Scaleを変更します。X:2, Y:1, Z:2

Groundの色の変更には、Materialを使用します。
Projectに新しくフォルダを作成します。フォルダ名:Materials
フォルダ内に、Materialを作成します。Create -> Material
名前をBackgroundとしておきます。
Albedoの色を適当な色に変更します。
作成したMaterialを、 Hierarchy内のGroundオブジェクトにドラッグ&ドロップします。

続いて、Playerを作成します。
このゲームのplayerは球体です。Hierarchyより、Create -> 3D object -> sphereを選択
Sphereの名前を変更します。選択した状態からF2を押下し、名前をPlayerに変更します。
まず、オブジェクトのTransform情報をResetしておきましょう。Transform欄の右上にあるギアをクリックし、Resetを選択します。
Positionを変更します。PositionをX:0, Y:0.5, Z:0とし、丁度Groundと接する様にします。

PlayerにRigidbody要素を付け加え、物理演算の対象とします。
Playerオブジェクトを選択し、Add component -> Physics -> Rigidbody
※Rigidbodyを付加しないと、物体が動くたびに位置情報がキャッシュされ、ゲームプレイ時に余計にリソースを消費することになります。Dynamicな動きがある場合は、Rigidbodyを付加します


Playerの移動

球体であるPlayerをキー操作によって動かします。

Project内に、Scriptsフォルダを作成します。
フォルダ内に、Scriptを作成します。Create - > C# Script
ファイル名を、PlayerControllerとします。
下記、Scriptに記載内容です。


    using UnityEngine;
    using System.Collections;

    public class PlayerController : MonoBehaviour {

        public float speed;

        private Rigidbody rb;

        void Start ()
        {
            rb = GetComponent();
        }

        void FixedUpdate ()
        {
            float moveHorizontal = Input.GetAxis ("Horizontal");
            float moveVertical = Input.GetAxis ("Vertical");

            Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);

            rb.AddForce (movement * speed);
        }
    }

publicにspeed変数を宣言しています。
Playerオブジェクト -> Player Controller -> Speed欄に数値をセットします。今回は10。


カメラの移動

Playerに合わせてカメラも移動するようにします。

CameraをPlayerオブジェクトの子要素にする方法もありますが、今回はPlayerが球体なので、転がるたびにCameraもRotationしてしまいます。それを防ぐために、今回は、Scriptにて制御します。
void startで予めPlayerとカメラとのOffsetを記録します。LateUpdateで毎フレーム毎に、カメラの位置をPlayer位置+Offsetで求めます。下記コードです。


    using UnityEngine;
    using System.Collections;

    public class CameraController : MonoBehaviour
    {

        public GameObject player;

        private Vector3 offset;

        void Start()
        {
            offset = transform.position - player.transform.position;
        }

        void LateUpdate()
        {
            transform.position = player.transform.position + offset;
        }
    }

ここでは、void updateではなくvoid LateUpdateを使用しています。毎フレームごとのすべての処理が終わった段階でカメラの位置を調整するためです。


Play area の設定

壁を設置することで、Play Areaを制限します。

まず、Hierarchyより、壁用の空オブジェクトを作成します。create -> create empty
名前をwallsとします。walls内に、cubeオブジェクトを作成します。create -> 3D object -> cube
Position(-10,0,0)とScale(0.5,2,20.5)を調整しながら、壁を1つ作ります。
この壁のObjectを右クリックし、Duplicateを選択します。Positionを(10,0,0)とします。
残り2辺の壁を作成します。同様にDuplicateをし、PositionとScaleを変更することで壁を作成します。
1辺目:Position(0,0,10),Scale(20.5,2,0.5)、2辺目: Position(0,0,-10),Scale(20.5,2,0.5)


回収用オブジェクトの作成

Playerが触れて回収するオブジェクトを作成します。

Hierarchyより、Cubeオブジェクトを作成します。名前をPick Upとします。
アイテム風の見た目にするためにTransform情報を書き換えます。
Position(0,0.5,0), Rotate(45,45,45), Scale(0.5,0.5,0.5)

回収用オブジェクトが回転する様にScriptを追加します。
Scriptsフォルダ内に、Rotator.csを作成します。下記の様に記載します。


    using UnityEngine;
    using System.Collections;

    public class Rotator : MonoBehaviour
    {

        void Update()
        {
            transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
        }
    }

これで動的なObjectとなったので、Rigidbody要素を追加します。Add component -> Physics -> Rigidbody
このままだと重力により落下してしまうので、Is Kinematic?にチェックを入れます。

次にこのオブジェクトを量産化したいので、Prefabに格納します。Projectタブで、Prefabsフォルダを作成します。
Pick UpオブジェクトをPrefabsフォルダにドラッグ&ドロップしPrefab化します。
プレハブ化したPick Upを画面にドラッグ&ドロップすることで配置させます。10個ほど。
最後にHierarchyタブを整理するために、Pick Upsというからオブジェクトを作成します。Create -> create empty
Pick Ups内に、配置したPick Upsを全て格納します。


PlayerとPick Upの接触判定

接触判定には、OnTriggerEnterを使用します。
下記コードです。Player.cs内に記載します。


    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag ("Pick Up"))
        {
            other.gameObject.SetActive (false);
        }
    }

ここでは、Tagを利用して、対象のオブジェクトか否かを判断しています。
Prefabs内のPick Upを選択。Tag -> Add Tagを選択。+マークを選択し、タグ名をPick Upとし保存します。
再度Tagより、Pick Upを選択。Prefabなので、全てのPick Upにタグ変更が反映されます。

Box ColliderのIs Triggerにチェックを入れます。これにより、OnTriggerEnterの対象オブジェクトとなります。


Scoreとテキストの表示

回収したPick Upオブジェクトの数を画面上に表示させます。

Hierarchyタブより、create -> UI -> textを選択します。
親要素のCanvas、New Text、EventSystemが作成されます。
New Textを編集します。まずファイル名をCountTextとします。
Transform情報を初期化しておきます。Transform欄の右上にあるギアをクリックしResetを選択
テキストの色をcolorより白色に変更します。
テキスト表示位置を画面右上にします。Rect Transfrom欄のAnchor Presetより、右上の図を選択します。
※この時、ShiftとAltを押下しながら、選択します。ShiftによりPivotを、AltによりPositionを設定できます。

続いてScriptにより、表示内容(カウント数)を動的に変更させます。
Player.cs内で、変数を宣言します。


    public Text countText;
    private int count;

SetCountText()関数を作成します。


    void SetCountText()
    {
        countText.text = "Count: " + count.ToString();
    }

void Start()では下記を記載します。


    count = 0;
    SetCountText();

void OnTriggerEnter()では下記を記載します。


    count = count + 1;
    SetCountText();

Playerオブジェクトを選択し、Player Controller(Script)欄を見ます。Count Textが追加されているので、Count Textオブジェクトをドラッグ&ドロップします。


続いて、全てのPick Up回収時に表示されるテキストを作成します。

CountTextと同様に、create -> UI -> textでテキストオブジェクトを作成します。
オブジェクト名をWin Textとします。
テキストの色や位置、サイズを調整します。
下記、Player.cs内の記載内容です。

まず変数の宣言


    public Text winText;

続いて、void Start()内には、何も記載しない様にします。


    winText.text = "";

SetCountText()内。Pick Upオブジェクトを12個配置した場合の記載例です。Countが12に達したときにテキストが更新されるようにします。


    if (count >= 12)
    winText.text = "You Win!!";

最後に、Count Textと同様に、PlayerオブジェクトのPlayer Controller(Script)欄のWin Textに、Win Textオブジェクトをドラッグ&ドロップして追加します。


作成したゲームをビルド

作成したゲームをビルドします。
File -> Build Settingsを選択します。
Scenes in Buildに対象のSceneをドラッグ&ドロップで追加できます。何も選択しなければ、Current sceneが追加されます。
アプリのプラットフォームを変更する場合は、対象のPlatformを選択し、Switch Platformを押下。
Player settingsでアイコンなど変更ができます。
問題なければ、Buildをクリックし、アプリが作成できます。

以上、Unityの使い方でした。


Category:Unity
Tag: Unity C_Sharp
May 16, 2018, 2:52 p.m.

Comments