Skip to content

2.プレイヤーの移動

pollenjp edited this page Oct 5, 2018 · 7 revisions

2.プレイヤーの移動

プレイヤーの移動を作成します。 プレイヤーを移動させるには、以下の操作を考える必要があります。

  1. 「プレイヤー」を作成する
  2. 「動かす機能」を「プレイヤー」へ追加する

今回は物理演算を利用しての位置を調整する機能をプレイヤーへ追加します。

プレイヤーの追加

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

  1. HeirarchyビューのCreateボタンをクリックします。
  2. "3D Object" -> "Sphere" を選択します。
  3. Inspectorビューで名前を"Player"へ変更します。

Spere作成

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

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

ゲームを再生する

コンポーネントを追加する前に、現状の機能を確認しておきましょう。 Unityは「ゲーム再生ボタン」をクリックすることで、ゲームの挙動を確認することが出来ます。

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

ゲームの内容を確認したらゲームの再生を終了します。もう一度「ゲーム再生ボタン」をクリックします。

ゲーム再生

コンポーネント(部品)の追加

ではコンポーネントを追加します。

コンポーネントとは、GameObjectを構成する部品(コンポーネント)です。 GameObjectはこのコンポーネントの挙動に従い、自身を稼働させたり、他のオブジェクトへ影響をあたえることが出来ます。

コンポーネントGameObjectを選択する事でInspectorビューにて確認する事ができます。

例えば「Spherer Collider(球状の当たり判定)」のコンポーネントは以下のとおりです。

コンポーネントの機能について

では早速、Playerへコンポーネントを追加しましょう。 コンポーネントを追加するには、Inspectorビューの「Add Component(コンポーネントの追加)」ボタンで行います。

  1. HierarchyビューでPlayerを選択します。
  2. InspectorビューでAdd Componentボタンをクリックします。
  3. Physics > Rigidbody を選択します。

コンポーネント追加

追加したらゲームを再生して下さい。 物理演算の機能が追加された事で、Playerオブジェクトが落下する事が確認出来ます。

Rigidbodyを追加

プレイヤーを任意の方向へ転がす機能の追加

転がすゲームを追加するには、入力を受けPlayerオブジェクトを転がす機能が必要です。 この機能はUnityの標準では用意されていないため、自身でコンポーネントを作成する必要があります。

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

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

  1. HierarchyビューでPlayerをオブジェクトを選択します。
  2. InspectorビューでAdd Componentボタンをクリックします。
  3. New Scriptをクリックします。
  4. Nameに「PlayerController」、Scriptに「CSharp」を選択します。
  5. 「Create And Add」ボタンをクリックします。

これでPlayerオブジェクトに「何も機能を持たないコンポーネント」が追加されました。

PlayeControllerコンポーネント追加

同様に、ProjectブラウザのAssetsフォルダ直下に、"PlayerController.cs"ファイルが作成されます。 これが今回作成したコンポーネントの本体のスクリプトとなります。フォルダが散らかるのは良くないので、Scriptフォルダを作成し中へ移動させましょう。

  1. ProjectブラウザのCreateボタンをクリックします。
  2. フォルダ名をScriptと変更します。
  3. PlayerControllerを選択し、Assets/Scriptフォルダへドラッグ&ドロップします。

Scriptフォルダへ格納

コンポーネントのスクリプト変更

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

スクリプトを変更するには、先ほど作成した"PlayerController.cs"をダブルクリックし、Monodevelopを起動させます。

スクリプトを編集 monodevelop

まずはサンプルコードとして提供されているコードを削除し、クラス定義のみにします。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour 
{
}

では考えてみましょう。今回作成するスクリプトは「ボタンを押したら転がる」機能を持っています。 機能として分解すると、以下の通りになりそうです。

  1. 毎フレーム入力を受け付ける
  2. 物理演算前で動く前に、入力内容を元にプレイヤーのrigidbody(剛体)に力を加える

入力機能の追加

まずは「毎フレーム動作する」の部分を解決します。 Unityのスクリプトは、特定のメソッドを定義すると自動的にメソッドを特定のタイミングで呼び出します。

例えば、クラス内に「void Update(){}」と記述すると、{から}内に記述した処理を毎フレーム更新時に呼び出しますし、「void FixedUpdate(){}」と記述すると物理演算でキャラクターが動く度に呼ばれる処理を設定する事ができます。

今回は物理演算を使用するので、FixedUpdate内に処理を記述します。 コードを以下のように変更します。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour 
{
	void FixedUpdate ()
	{
	}
}

次に入力(Input)をFixedUpdate内で取得します。 以下のコードを記述すると、xとzの中にキーボード入力の内容が入ります。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour 
{
	void FixedUpdate ()
	{
		//  入力をxとzに代入
		float x = Input.GetAxis("Horizontal");
		float z = Input.GetAxis("Vertical");
	}
}

物理演算機能の追加

後は取得したキー入力を元にrigidbodyコンポーネントに力を加えます。 同一オブジェクトのコンポーネントを取得するにはGetComponentを使用します。 今回はRigidbodyを取得するので、「GetComponent<Rigidbody>()」を記述します。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour 
{
	void FixedUpdate ()
	{
		float x =  Input.GetAxis("Horizontal");
		float z = Input.GetAxis("Vertical");

		// 同一のGameObjectが持つRigidbodyコンポーネントを取得
		Rigidbody rigidbody = GetComponent<Rigidbody>();
	}
}

最後に取得したrigidbodyに入力の力を加えます。 力を加えるAPIは何を使えば良いのでしょうか。APIを検索してみましょう。

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

APIマニュアルによると、「AddForce(Rigidbodyオブジェクトに力を加えます。力を加えることでオブジェクトを動かすことが出来ます)」を使うのが良さそうです。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour 
{
	void FixedUpdate ()
	{
		float x =  Input.GetAxis("Horizontal");
		float z = Input.GetAxis("Vertical");

		Rigidbody rigidbody = GetComponent<Rigidbody>();

		// rigidbodyのx軸(横)とz軸(奥)に力を加える
		rigidbody.AddForce(x, 0, z);
	}
}

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

プレイヤーの挙動は非常にゆっくり動作します。 これは単純に「押す力」が弱い為に発生します。

PlayerControllerの挙動1

これの簡単な解決法は、rigidbody.AddForceに与える押す力を強化する事です。試しに10倍くらいにしてみましょう。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour 
{
	void FixedUpdate ()
	{
		float x =  Input.GetAxis("Horizontal");
		float z = Input.GetAxis("Vertical");

		Rigidbody rigidbody = GetComponent<Rigidbody>();

		// xとzに10をかけて押す力をアップ
		rigidbody.AddForce(x * 10, 0, z * 10);
	}
}

かなりスムーズになりました。しかし、本当にこのゲームに相応しい速度でしょうか? ゲームバランスに直結する項目なので、よくよく調整したい所です。

PlayerControllerの挙動2

この値をスクリプトを変更し調整するのも良いですが、Inspectorからサクっと調整出来るようにします。

まずはPlayerControllerクラスにspeed変数を追加します。 その後、speed変数をxとyに掛けるよう変更します。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour 
{
	// speedを制御する
	public float speed = 10;
	
	void FixedUpdate ()
	{
		float x =  Input.GetAxis("Horizontal");
		float z = Input.GetAxis("Vertical");

		Rigidbody rigidbody = GetComponent<Rigidbody>();

		// xとyにspeedを掛ける
		rigidbody.AddForce(x * speed, 0, z * speed);
	}
}

これでInspectorビューにspeed設定項目が追加され、Inspectorビューから調整しながらゲームを作成することが出来るようになりました。

PlayerControllerコンポーネント

次はカメラを動かす方法について説明します。