Unity3Dでボールを転がしてモノを拾うゲームの作り方、パート2(回転、収集、テキスト表示)

Unity3Dでボールを転がしてモノを拾うゲームの作り方の続きです。

前回で地面を作ってボールを動かして視点もボールと一緒についていくまでを作成しました。今回でボールを転がしゲームを完成させます。

5.壁と拾うモノを設置する

Project: Roll-a-Ball CREATING PICK-UP OBJECTS

壁を作ります。
GameObject → Create Empty
作成されたGameObjectをWallsという名前に変更します。

Wallsを選択して、Inspectorのギアのマークをクリック、そしてResetをクリック。
Wallsの位置が0,0,0の位置になります。

GameObject → Create Other → Cube
CubeをWest Wallという名前に変更します。
West Wallの位置をリセットして0,0,0にします。
West WallをWallsにドラッグします。
Scaleを変更します X:0.5 Y:2 Z:20.5
Positionを変更します X:-10 Y:0 Z:0

Groundの大きさを間違えていたようです。
GroundのScaleを変更します X:2 Y:1 Z:2

West WallををDuplicateして名前をEast Wallに変更します。
East WallのPositionを変更します X:10 Y:0 Z:0

West WallををDuplicateして名前をNorth Wallに変更します。
North WallのPositionを変更します X:0 Y:0 Z:10
North WallのScaleを変更します X:20.5 Y:2 Z:0.5

North WallををDuplicateして名前をSouth Wallに変更します。
South WallのPositionを変更します X:0 Y:0 Z:-10

拾い集めるモノを作ります。
GameObject → Create Other → Cube
CubeをPickUpという名前に変更します。
PickUpの位置をリセットして0,0,0にします。
Positionを変更します X:0 Y:0.5 Z:0
Rotationを変更します X:45 Y:45 Z:45
Scaleを変更します X:0.5 Y:0.5 Z:0.5

PickUpを回転させるためにスクリプトを書きます。
PickUpを選択して、InspectorのAdd Componentをクリック → New Script → 名前Rotator、CSharpを選択してスクリプトを作成します。できあがったRotatorをScriptsフォルダに投げ込んで、Rotatorをダブルクリックしてエディタを開いて編集します。

Rotator

using UnityEngine;
using System.Collections;

public class Rotator : MonoBehaviour {

	// Update is called once per frame
	void Update () {
		transform.Rotate(new Vector3(15,30,45) * Time.deltaTime);
	}
}

プログラムを実行してみると、立方体がその場で回転しています。

PickUpオブジェクトを複数設置するので、
PickUpをPrefab(プレハブ、発音的にはプリファブ)にします。

プレハブは日本語のイメージと同じです。
基本的な要素だけを備えた小屋みたいな感じです。
プレハブに変更を加えると、プレハブで作った全てのオブジェクトにも影響を受けるみたいな。

AssetsにPrefabフォルダを作成します。
PickUpをドラッグしてPrefabフォルダにドロップします。

PickUpオブジェクトを整理するのに、PickUpsをHierarchyに作成します。
GameObject → Create Empty
作成されたGameObjectをPickUpsという名前に変更する。
PickUpsをリセットして位置を0,0,0にします。

Hierarchy中
PickUpをPickUpsの中に投げ込みます。
PickUpをDuplicateしていきます。
とりあえずPickUpを8個作って、Playerを取り囲むようにPositionを配置します。

とりあえずココまででこんな感じになっています。

6.モノを拾って数える

Project: Roll-a-Ball COLLECTING AND COUNTING

PlayerがPickUpにぶつかったときに、PickUpをDisableにする。
まずはPlayerControllerを編集します。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{
	public float speed;

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

		Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
		
		rigidbody.AddForce(movement * speed * Time.deltaTime);
	}

	void OnTriggerEnter(Collider other)
	{
		if (other.gameObject.tag == "PickUp")
		{
			other.gameObject.SetActive(false);
		}
	}
}

PlayerがオブジェクトにぶつかったときにOnTriggerEnterが呼び出されて、タグがPickUpになっているオブジェクトの場合、そのオブジェクトをDisableにしています。

続いてPickUpに”PickUp”というタグを追加します。
PrefabのPickUpを選択します。
InspectorのTagからAdd Tagを選択します。
Element0にPickUpを入力します。
PrefabのPickUpに戻ります。
InspectorのTagからPickUpを選択します。

これで8個のPickUpの全てに”PickUp”タグがついた状態になります。

PrefabのPickUpを選択して、BoxColliderのIs Triggerをチェックします。
これでOnTriggerEnterが呼び出されてぶつかったPickUpをDisableにして消します。

最後にパフォーマンスを上げます。
今のままでも動くんですが余分に力を使ってしまっています。

よくわかりませんがStatic ObjectをできるだけDynamic Objectに変更することで、Unityが内部でする計算の負担が少なくなるそうです。

8個のPickUpにRigidbodyを加えることでDynamicにします。
PrefabのPickUpを選択します。
Add ComponentからPysics→Rigidbodyを選択します。

このまま実行するとPicUpが重力にしたがって下に落ちていきます。
Use Gravityのチェックをはずすことでも落ちなくなりますが、PickUpに物理的に反応が生じるそうです。
一番良い方法はUse Gravityをチェックしたまま、Is Kinematicにチェックを入れることです。
理由はよくわかりませんが、それが最適なんだそうです。

7.テキストを表示する

Project: Roll-a-Ball DISPLAYING TEXT

PlayerがPickUpを回収した回数を数えるようにします。
PlaerControllerを編集します。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{
	public float speed;
	public GUIText countText;
	public GUIText winText;
	private int count;

	void Start()
	{
		count = 0;
		SetCountText();
		winText.text = "";
	}

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

		Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
		
		rigidbody.AddForce(movement * speed * Time.deltaTime);
	}

	void OnTriggerEnter(Collider other)
	{
		if (other.gameObject.tag == "PickUp")
		{
			other.gameObject.SetActive(false);
			count = count + 1;
			SetCountText();
		}
	}

	void SetCountText()
	{
		countText.text = "Count: " + count.ToString ();
		if (count == 8)
		{
			winText.text = "YOU WIN";
		}
	}
}

countを設定して、PickUpをDisableするごとにカウントアップしていきます。
上記のコードには回収した回数を表示するテキストと全て回収し終えたことを知らせるためのテキストを用意しています。

countを表示するテキストを作成します。
GameObject → Create Empty
名前をDisplay Textに変更します。
位置をリセットします。

GameObject → Create Other → GUI Text
名前をCount Textに変更します。
位置をリセットします。
Count TextをDisplay Textに放り込みます。
Positionを0,1,0にします。
Pixel OffsetをX:10 Y:-10にします。
Playerを選択します。
Count TextをドラッグしてPlayerのInspectorのスクリプトにあるCount Textという項目にドロップします。

GameObject → Create Other → GUI Text
名前をWin Textに変更します。
位置をリセットします。
Win TextをDisplay Textに放り込みます。
Positionを0.5,0.75,0にします。
Anchorをmiddle centerにします。
Alignmentをcenterにします。
Playerを選択します。
Win TextをドラッグしてPlayerのInspectorのスクリプトにあるWin Textという項目にドロップします。

これで回収した回数と全て回収したときYOU WINというテキストが画面に表示されるようになります。

8.ゲームを公開する

Project: Roll-a-Ball PUBLISHING THE GAME

最後に作成したゲームをWebで公開します。

File → Build Settings
PlatformにWeb Playerを選択します。
Build-roll-a-ballを作ってにしてそのフォルダを選択します。

これでWeb用にBuildしてくれます。
Buildが完了するとBuild-roll-a-ball.unity3dというファイルがあるのでそれを自分のホームページにアップロードします。Wordpressなんかだとunitydogというプラグインを使うととても楽にゲームをWebに公開することができます。

wordpressのメディアのアップロードでBuild-roll-a-ball.unity3dをアップロード。
あとは下記のコードを記事に追加するだけです。

<unitydog width="640" height="480" src="http://denshikousaku.net/wp-content/uploads/2014/10/Build-roll-a-ball.unity3d.zip"></unitydog>

以上がUnity3Dでボールを転がしてモノを拾うゲームの作り方でした。
Unity3Dが少しわかったきがする、そんなレベルです。

ちなみに私はとりあえずチュートリアルをコツコツやっていて、それが終わったらUnity3Dの辞書みたいなのを買って、チュートリアルの経験と辞書とネットをさまよいながら、自分のゲームを作ろうと思っています。

がんばろー。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください