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

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

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

いつもひよこのたまごをご利用下さいましてありがとうございます!
おかげ様でチュートリアル数も10ゲーム目となりました!
チュートリアル一覧は
こちら からどうぞ!


スポンサーリンク

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】