Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity8】ジョイスティック(バーチャルパッド)でモバイル対応!Sample Asset【横スクロールユニティちゃん14】

Unity5.1.0f3 Personal(2015年6月)

f:id:hiyotama:20150618122504p:plain


このコンテンツは、『ユニティちゃんライセンス』で提供されています

ユニティちゃんライセンス

前回の続きです〜

今回はキーボード操作から、画面上にコントローラーを表示するバーチャルパッドに変更しようと思います〜


Unityのゲームにスマホ向けなバーチャルパッドを追加する - テラシュールブログ


こちらのサイトを参考にさせて頂きました〜ありがとうございます!


【目標】バーチャルパッドを付けてモバイル対応する!

①Sample Assetのダウンロード
まずはAsset StoreからSample Asset(beta) for Unity 4.6というアセットをダウンロードします〜Asset Storeについては以下エッセンスをご参照下さい〜


hiyotama.hatenablog.com


f:id:hiyotama:20150619163934p:plain
Sample Asset (beta) for Unity 4.6をダウンロード


ダウンロードが完了したらそのままImportしますが、今回ImportするのはCrossPlatformInputというフォルダだけで大丈夫なので、それ以外のチェックは外して下さい〜

f:id:hiyotama:20150623204510p:plain
CrossPlatformInput以外のチェックは外す


②パッドを配置する
それではPadを配置してみましょう〜Projectビューに置かれたSample Assetsの中の、CrossPlatformInput > Prefabs > MobileSingleStickControlRigをHierarchyビューにドラッグ&ドロップします〜


f:id:hiyotama:20150623204947p:plain
ドラッグ&ドロップ!


すると画面にバーチャルパッドが配置されます〜
※Build SettingsにてAndroidもしくはiOSに切り替えないと表示されません!


f:id:hiyotama:20150623205040p:plain
バーチャルパッド配置


③JoyStickの設定
この状態でゲームを開始してJoyStickをドラッグすると既にバーチャルパッドとして機能するのですが、変な挙動をしてしまいます〜

f:id:hiyotama:20150623205519p:plain
JoyStickを触ると


f:id:hiyotama:20150623205559p:plain
画面左下へ移動してしまう


これはMobileSingleStickControlRigの中にあるMobileJoystickの、Joystickスクリプトの中の、OnEnableメソッドの名前を、Startに修正することで防ぐことができます〜


また、JoyStickのInspectorビューにあるMovement RangeでJoyStickの可動域を設定できるのですが、今回は10くらいでいいかと思います〜また、Axes To Useにて使う方向を設定できるのですが、今回はHorizontalしか使わないので、Only Horizontalにしましょう〜

f:id:hiyotama:20150623214159p:plain
JoyStickの設定


また、今のままだとスマートフォンで見た時、画面に表示されているより小さなパッドが表示されてしまいます〜
MobileSingleStickControlRigのInspectorビューからAdd Componentを行い、Layout > Canvas Scalerを選択し、Canvasに設定しているのと同じ設定にすることで防ぐことができます〜


f:id:hiyotama:20150623210232p:plain
Canvas Scalerを付ける


④Shotボタンの追加
ジャンプ用のボタンがはじめからついていますが、SHOT用のボタンがありません〜
これは単純に、JumpButtonオブジェクトをコピーしてやればOKです〜


f:id:hiyotama:20150623210534p:plain
コピペして


f:id:hiyotama:20150623210621p:plain
名前はShotButtonに変更


続いて、ボタンの画像がジャンプボタンのままなので、下の画像をImportして付け替えて下さい〜

f:id:hiyotama:20150623210724p:plain
ショットボタン用の画像


次に、ShotButtonオブジェクトについているEvent Triggerの設定を変えます〜下の赤枠部分を、left ctrlに変更して下さい〜

f:id:hiyotama:20150623213405p:plain


最後に各ボタンの位置を、自分の使いやすいように調整して下さい〜

f:id:hiyotama:20150623213557p:plain
バーチャルパッドの位置調整


⑤バーチャルパッド用にスクリプト修正
バーチャルパッドの用意ができましたので、PlayerScriptを修正してバーチャルパッド向けに変更しましょう〜以下ソースです〜

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
//********** 開始 **********//
using UnitySampleAssets.CrossPlatformInput;
//********** 終了 **********//

public class PlayerScript : MonoBehaviour {
	
	public float speed = 4f;
	public float jumpPower = 700;
	public LayerMask groundLayer;
	public GameObject mainCamera;
	public GameObject bullet;
	public LifeScript lifeScript;
	
	private Rigidbody2D rigidbody2D;
	private Animator anim;
	private bool isGrounded;
	private Renderer renderer;
	private bool gameClear = false;
	public Text clearText;
	
	void Start () {
		anim = GetComponent<Animator>();
		rigidbody2D = GetComponent<Rigidbody2D>();
		renderer = GetComponent<Renderer>();
	}

	void Update ()
	{
		isGrounded = Physics2D.Linecast (
			transform.position + transform.up * 1,
			transform.position - transform.up * 0.05f,
			groundLayer);
		
		if (!gameClear) {
//********** 開始 **********//
			if (CrossPlatformInputManager.GetButtonDown("Jump")) {
//********** 終了 **********//
				if (isGrounded) {
					anim.SetTrigger ("Jump");
					isGrounded = false;
					rigidbody2D.AddForce (Vector2.up * jumpPower);
				}
			}
		}
		
		float velY = rigidbody2D.velocity.y;
		bool isJumping = velY > 0.1f ? true : false;
		bool isFalling = velY < -0.1f ? true : false;
		anim.SetBool ("isJumping", isJumping);
		anim.SetBool ("isFalling", isFalling);

		if (!gameClear) {
//********** 開始 **********//
			if (CrossPlatformInputManager.GetButtonDown("left ctrl")) {
//********** 終了 **********//
				anim.SetTrigger ("Shot");
				Instantiate (bullet, transform.position + new Vector3 (0f, 1.2f, 0f), Quaternion.identity);
			}
		
			if (gameObject.transform.position.y < Camera.main.transform.position.y - 8) {
				lifeScript.GameOver ();
			}
		}
	}
	
	void FixedUpdate ()
	{
		if (!gameClear) {
//********** 開始 **********//
			int x = 0;
			if (CrossPlatformInputManager.GetAxisRaw ("Horizontal") >= 0.01f) {
				x = 1;
			} else if (CrossPlatformInputManager.GetAxisRaw ("Horizontal") <= -0.01f) {
				x = -1;
			}

//********** 終了 **********//
			if (x != 0) {
				rigidbody2D.velocity = new Vector2 (x * speed, rigidbody2D.velocity.y);
				Vector2 temp = transform.localScale;
				temp.x = x;
				transform.localScale = temp;
				anim.SetBool ("Dash", true);
				if (transform.position.x > mainCamera.transform.position.x - 4) {
					Vector3 cameraPos = mainCamera.transform.position;
					cameraPos.x = transform.position.x + 4;
					mainCamera.transform.position = cameraPos;
				}
				Vector2 min = Camera.main.ViewportToWorldPoint (new Vector2 (0, 0));
				Vector2 max = Camera.main.ViewportToWorldPoint (new Vector2 (1, 1));
				Vector2 pos = transform.position;
				pos.x = Mathf.Clamp (pos.x, min.x + 0.5f, max.x);
				transform.position = pos;
			} else {
				rigidbody2D.velocity = new Vector2 (0, rigidbody2D.velocity.y);
				anim.SetBool ("Dash", false);
			}
		} else {
			clearText.enabled = true;
			anim.SetBool ("Dash", true);
			rigidbody2D.velocity = new Vector2 (speed, rigidbody2D.velocity.y);
			Invoke("CallTitle", 5);
		}
	}

	void OnCollisionEnter2D (Collision2D col)
	{
		if (!gameClear) {
			if (col.gameObject.tag == "Enemy") {
				StartCoroutine ("Damage");
			}
		}
	}
	
	IEnumerator Damage ()
	{
		gameObject.layer = LayerMask.NameToLayer("PlayerDamage");
		int count = 10;
		while (count > 0){
			renderer.material.color = new Color (1,1,1,0);
			yield return new WaitForSeconds(0.05f);
			renderer.material.color = new Color (1,1,1,1);
			yield return new WaitForSeconds(0.05f);
			count--;
		}
		gameObject.layer = LayerMask.NameToLayer("Player");
	}
	
	void OnTriggerEnter2D (Collider2D col)
	{
		if (col.tag == "ClearZone") {
			gameClear = true;
		}
	}
	
	void CallTitle ()
	{
		Application.LoadLevel("Title");
	}
}

PlayerScript.cs


バーチャルパッドを使う時は、先頭にusing UnitySampleAssets.CrossPlatformInputを追加します〜


基本的に、今までInputと書いてきた部分をCrossPlatformInputManagerに変更するだけで、バーチャルパッドとして機能します〜


GetAxisRawはキーボード入力だと1か-1しか返さないのですが、バーチャルパッドだと小数点になってしまうため、0.01以上の時は1に、-0.01以下の時は-1に変更しています〜

【結果】

f:id:hiyotama:20150623215000p:plain

バーチャルパッドでも無事動かすことができました〜


ひとまず横スクロールユニティちゃんについてはここで終わりです〜
ありがとうございました〜


【Unity開発8】ユニティちゃんを表示させる【横スクロールユニティちゃん1】

【Unity開発8】ユニティちゃんを歩かせる【横スクロールユニティちゃん2】

【Unity開発8】カメラにユニティちゃんを追いかけさせる【横スクロールユニティちゃん3】

【Unity開発8】ユニティちゃんをジャンプさせる【横スクロールユニティちゃん4】

【Unity開発8】ユニティちゃんバスターで攻撃する【ユニティちゃん横スクロール5】

【Unity開発8】走っている時やジャンプ中にも弾を撃つ【横スクロールユニティちゃん6】

【Unity開発8】弾を当てて敵を倒す【横スクロールユニティちゃん7】

【Unity開発8】uGUIでライフを作り、ダメージを実装する【横スクロールユニティちゃん8】

【Unity開発8】ダメージを食らった時、一定時間無敵状態にする【横スクロールユニティちゃん9】

【Unity開発8】アイテムを取得して体力回復する【横スクロールユニティちゃん10】

【Unity開発8】敵キャラを倒した時にアイテムを落とさせる【横スクロールユニティちゃん11】

【Unity開発8】Main Cameraに映るまで敵キャラを待機させておく【横スクロールユニティちゃん12】

【Unity開発8】タイトル・ステージ紹介・ゲームオーバー・ゲームクリアー画面を作る【横スクロールユニティちゃん13】

【Unity開発8】バーチャルパッドを付けてモバイル対応する【横スクロールユニティちゃん14】