【Unity8】ジョイスティック(バーチャルパッド)でモバイル対応!Sample Asset【横スクロールユニティちゃん14】
Unity5.1.0f3 Personal(2015年6月)
このコンテンツは、『ユニティちゃんライセンス』で提供されています
今回はキーボード操作から、画面上にコントローラーを表示するバーチャルパッドに変更しようと思います〜
Unityのゲームにスマホ向けなバーチャルパッドを追加する - テラシュールブログ
こちらのサイトを参考にさせて頂きました〜ありがとうございます!
【目標】バーチャルパッドを付けてモバイル対応する!
①Sample Assetのダウンロード
まずはAsset StoreからSample Asset(beta) for Unity 4.6というアセットをダウンロードします〜Asset Storeについては以下エッセンスをご参照下さい〜
Sample Asset (beta) for Unity 4.6をダウンロード
ダウンロードが完了したらそのままImportしますが、今回ImportするのはCrossPlatformInputというフォルダだけで大丈夫なので、それ以外のチェックは外して下さい〜
CrossPlatformInput以外のチェックは外す
②パッドを配置する
それではPadを配置してみましょう〜Projectビューに置かれたSample Assetsの中の、CrossPlatformInput > Prefabs > MobileSingleStickControlRigをHierarchyビューにドラッグ&ドロップします〜
ドラッグ&ドロップ!
すると画面にバーチャルパッドが配置されます〜
※Build SettingsにてAndroidもしくはiOSに切り替えないと表示されません!
バーチャルパッド配置
③JoyStickの設定
この状態でゲームを開始してJoyStickをドラッグすると既にバーチャルパッドとして機能するのですが、変な挙動をしてしまいます〜
JoyStickを触ると
画面左下へ移動してしまう
これはMobileSingleStickControlRigの中にあるMobileJoystickの、Joystickスクリプトの中の、OnEnableメソッドの名前を、Startに修正することで防ぐことができます〜
また、JoyStickのInspectorビューにあるMovement RangeでJoyStickの可動域を設定できるのですが、今回は10くらいでいいかと思います〜また、Axes To Useにて使う方向を設定できるのですが、今回はHorizontalしか使わないので、Only Horizontalにしましょう〜
JoyStickの設定
また、今のままだとスマートフォンで見た時、画面に表示されているより小さなパッドが表示されてしまいます〜
MobileSingleStickControlRigのInspectorビューからAdd Componentを行い、Layout > Canvas Scalerを選択し、Canvasに設定しているのと同じ設定にすることで防ぐことができます〜
Canvas Scalerを付ける
④Shotボタンの追加
ジャンプ用のボタンがはじめからついていますが、SHOT用のボタンがありません〜
これは単純に、JumpButtonオブジェクトをコピーしてやればOKです〜
コピペして
名前はShotButtonに変更
続いて、ボタンの画像がジャンプボタンのままなので、下の画像をImportして付け替えて下さい〜
ショットボタン用の画像
次に、ShotButtonオブジェクトについているEvent Triggerの設定を変えます〜下の赤枠部分を、left ctrlに変更して下さい〜
最後に各ボタンの位置を、自分の使いやすいように調整して下さい〜
バーチャルパッドの位置調整
⑤バーチャルパッド用にスクリプト修正
バーチャルパッドの用意ができましたので、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に変更しています〜
【結果】
バーチャルパッドでも無事動かすことができました〜
ひとまず横スクロールユニティちゃんについてはここで終わりです〜
ありがとうございました〜
【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】