Creating Collectable Objects
プレイヤーが獲得するアイテムを作成します。
まずは、「GameObject」-「3DObject」-「Cube」で立方体を作成します。
名前を「PickUp」とする。
Transformについては、Potiosion(0,0.5,0)、Rotation(45,45,45)、Scale(0.5,0.5,0.5)とする。
また、「Add Compornent」から新たにスクリプトを作成します。
名前は、「Rotator」とします。
「Rotator」スクリプトを「Project」-「Script」フォルダの配下に置きます。
次に、作成したアイテムを目立たせるために回転させます。
「Rotator」スクリプトを開きます。
アイテムを回転させるスクリプトを作成します。
プレイ中にずっとアイテムを回転させるため、Update()の中に記述します。
以下が記述したコードです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotator : MonoBehaviour
{
// Update is called once per frame
void Update()
{
transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
}
}
これで、アイテムが回転するようになりました。
実際に再生ボタンを押して、実行してみてください。
では、アイテムが回転することを確認できたなら次へいきます。
次は、この作成したアイテムを量産します。
まずは、「Project」の配下に「Prefabs」フォルダを新規に作成します。
作成した「Prefabs」フォルダの配下に先ほど作成した「PickUp」をドラッグして入れます。
次に、「GameObject」-「CreateEmpty」で新規に「PickUps」を作成します。
新規に作成した「PickUps」の配下に「PickUp」をいれます。
これで、量産する準備が完了です。
まずは、視点を真上から見るように変更し、空間を「Local」から「Global」に変更します。
これで、アイテムをコピーして配置します。(「Edit」-「Duplicate」もしくは、「Ctrl+d」でコピーできます。)
これで、配置ができました。
アイテムが白だと壁と同じ色のため、色を変更します。
「Project」-「Create」から「Material」で新規に「PickUp」の名前で作成します。
作成したマテリアルの色を黄色に設定します。
その後、作成した「PickUp」マテリアルを「Prefabs」配下の「PickUp」にドラッグで適応させます。
これで、全部のアイテムの色が変化しました。
Collecting the Pick Up Objects
プレイヤーがアイテムに衝突した際に、アイテムを取得できるようにします。
まずは、プレイヤーのスクリプト「PlayerController」を開きます。
今回は、プレイヤーがアイテムを通り抜けてたら、取得します。そのため、通り抜けたら、実行するOnTriggerEnter()の中に記述します。
中身は、通り抜けたものが「PickUp」タグのものであれば非表示にするというものです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
public float speed;
private void Start()
{
rb = GetComponent<Rigidbody>();
}
private void FixedUpdate() //物理演算を実行する直前に呼び出される
{
float moveHorizontal = Input.GetAxis("Horizontal"); //水平軸
float moveVertical = Input.GetAxis("Vertical"); //垂直軸
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement*speed);
}
void OnTriggerEnter(Collider other)
{
if(other.gameObject.CompareTag("PickUp"))
{
other.gameObject.SetActive(false);
}
}
}
次に、アイテムにタグを作ります。
「Tag」-「Add Tag」で新たにタグを作成します。
「List is empty」と記述されているところに、先ほど設定したタグと同名の「PickUp」を記述します。
新たにタグを作成したので、「Tag」の中から作成した「PickUp」タグを選択して、設定します。
また、「Box Collider」の「Is Trigger」にチェックを入れます。
次に、「Add Component」-「Physics」-「Rigidbody」を選択して、追加します。
追加した「Rigidbody」-「Use Gravity」のチェックを外します。
これで、設定が終わりました。
再生ボタンを押して、実行してみてください。
プレイヤーを動かして、アイテムを取得することができます。
Displaying the Score and Text
取得したアイテムを数える機能とゲームを終わらせる機能を作成します。
まず、取得したアイテムを数える機能を作成します。
「GameObject」-「UI」-「Text」を新規に作成します。
名前を「CountText」とします。
こちらが、Canvasの設定です。
※このの設定で、私は詰まりました。
ここで、詰まった方は、
CanvasとTextをまとめましたのでを参考にしてください。
CanvasとTextについて
こちらが、Textの設定です。
Rect Transformでは、図を選択後、「Shift+Alt」を押して、左上を選択してください。
これで、Game画面の左上に「Count Text」という文字が表示できました。
これで、再生ボタンを押して、ゲームをプレイしていてもずっと左上に文字があることがわかります。
次に、「PlayerController」スクリプトに取得した数をカウントするコードを記述します。
以下が追加で記述したコードです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
private int count;
public float speed;
public Text countText;
private void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
SetCountText();
}
private void FixedUpdate() //物理演算を実行する直前に呼び出される
{
float moveHorizontal = Input.GetAxis("Horizontal"); //水平軸
float moveVertical = Input.GetAxis("Vertical"); //垂直軸
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement*speed);
}
void OnTriggerEnter(Collider other)
{
if(other.gameObject.CompareTag("PickUp"))
{
other.gameObject.SetActive(false);
count = count + 1;
SetCountText();
}
}
void SetCountText()
{
countText.text = "Count: " + count.ToString();
}
}
これで、アイテムの取得したカウントができます。
あとは、先ほど作成した「CountText」をドラッグで、「Player」のCount Textにドラッグで入れます。
これで、プレイするとアイテムを取得する度にカウントされます。
最後に、アイテムをすべて取得した際に「You Win」というメッセージが表示されるようにします。
「Count Text」を作成した手順でWinTextを作成して、文字の位置を真ん中にします。
「PlayerController」の中は以下の様に記述します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
private int count;
public float speed;
public Text countText;
public Text winText;
private void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
SetCountText();
winText.text = "";
}
private void FixedUpdate() //物理演算を実行する直前に呼び出される
{
float moveHorizontal = Input.GetAxis("Horizontal"); //水平軸
float moveVertical = Input.GetAxis("Vertical"); //垂直軸
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement*speed);
}
void OnTriggerEnter(Collider other)
{
if(other.gameObject.CompareTag("PickUp"))
{
other.gameObject.SetActive(false);
count = count + 1;
SetCountText();
}
}
void SetCountText()
{
countText.text = "Count: " + count.ToString();
if (count >= 12)
{
winText.text = "You Win!";
}
}
}
最後に、作成した「Win Text」をドラッグで「Player」のWin Textの中にいれます。
これで、「Roll-a-Ball」の完成です。
Building the Game
「Roll-a-Ball」ゲームをビルドして、実行ファイルにします。
「File」-「Build Setting」を選択します。
選択すると下の画面が表示されます。
そこで、「Add Open Scenes」で作成したゲームのシーンを追加します。
追加の方法は、ドラッグで持ってくることもできます。
「Build」ボタンを押して、ビルドします。
これで、フォルダを選択して、ビルドしたファイルの保存先を選択します。
(ここでは、「Build」フォルダを新規作成して選んでいます。)
これで、ビルドができました。
先ほど保存したフォルダを開きます。
「Roll-a-Ball」を選んで、実行します。
実際に実行した画面です。
無事に実行することができました。
おわりに
今回は、Unity Learnの「Roll-a-Ball」を実施しました。
難易度は優しいですが、Unityの開発で大事な要素が多く詰まっていたと感じます。
これから、Unityに触れようと考えている方におすすめです。
コメント