前回まででビリヤードゲームの基本部分が出来上がりました。
前回の記事 :
第4回の今回は「スマホタップに対応させてモバイルゲームを作る」です。
では始めていきましょう。
スマホへの対応方法 BuildingSettingの設定方法
スマホへの対応ですが、まずプラットフォームの変更が必要になります。
Unityの上部のメニューから「File→BuildSetting」を開きます。
対応したいスマホのOSによって「IOS」か「Android」を選択して下さい。そして右下の「SwitchPlatform」をおします。
そしてビルドするシーンを登録していきます。
現在開いているシーンを登録する場合は「Add Open Scenes」をクリックすると登録されます。
もしくはエディター「ProjectView」にあるシーンファイルを「Scenes In Build」にドラック&ドロップすることでも登録できます。
登録ができると画像のようにシーンのパスが表示されます。左のチェックマークを外せばビルドから外すことができますが、今回は変更しないで下さい。
ビルドする際は、スマホを接続し下にあるボタン「Build」もしくは「Build And Run」を押してビルドします。
「Build」はビルドしファイルの作成を行い、「Build And Run」は作成終了後自動的に起動しゲームが始まります。
(IOSの場合UnityのビルドのあとにXCodeが開きXcodeでのビルドが始まります。このときに設定次第ではエラーになりますが、Xcodeの詳細はここでは解説しませんので「Unity Xcode ビルド」などで検索してみましょう)
タッチ操作への対応
では、ここまで作成したゲームをスマホで操作できるように変更していきます。
まず、もしすでにビルドしてみた方はお気づきかと思いますが、今のままのスクリプトでもスマホで操作できます。
今回使用している
1 |
Input.GetMouseButton( 0 ) |
という処理が、スマホでのタップをちゃんと取得しているので今回のゲームの操作では問題なく動きます。
しかし、スマホにはピンチイン・アウトなど2本指以上の指を使用して行う操作も有るため、そのときにこの方法では対応できなくなります。
そのためスマホ専用の方法をつかって今回のゲームのスクリプトを書き換えていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// タッチしている指の数が0より多い. if( Input.touchCount > 0 ) { // タッチしている指の最初の値を取得. Touch touch = Input.GetTouch(0); // タッチ処理. if( touch.phase == TouchPhase.Began ) { Debug.Log( "タッチ開始" ); } else if( touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary ) { Debug.Log( "タッチ中" ); } else if( touch.phase == TouchPhase.Ended ) { Debug.Log( "タッチ終了" ); } } |
これがタッチ操作の基本形になります。
1 |
Input.touchCount |
が、タッチされている指の数を取得しており、0より大きい、つまり1本でも画面に触れていると括弧内の処理を行います。
1 |
Touch touch = Input.GetTouch(0); |
「Input.GetTouch」でタッチしている指の「Touch」クラスを取得でき「( 0 )」でタッチしている中から一番はじめの指を選択しています。
1 |
if( touch.phase == TouchPhase.Began ) |
そして、取得した指の状況による条件分岐を行い、各フェイズ(Phase)で処理を行います。
TouchPhaseには下記のようなものがあります。
Began | 画面に指が触れ始めたとき、触れた瞬間 |
Moved | 画面で指が動いているとき |
Stationary | 画面に指が触れているが動いてはいないとき |
Ended | 画面から指が離れたとき、離した瞬間 |
Canceled | キャンセル時 |
これらを踏まえて、「BallController」を書き換えていきましょう。
全文です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
using System.Collections.Generic; using UnityEngine; public class BallController : MonoBehaviour { // メインボール. [SerializeField] GameObject mainBall = null; // 打つ力. [SerializeField] float power = 0.1f; // 方向表示用オブジェクトのトランスフォーム. [SerializeField] Transform arrow = null; // ボールリスト. [SerializeField] List<ColorBall> ballList = new List<ColorBall>(); // マウス位置保管用. Vector3 startTouch = new Vector3(); // メインボールのリジッドボディ. Rigidbody mainRigid = null; // リセット時のためにメインボールの初期位置を保管. Vector3 mainBallDefaultPosition = new Vector3(); void Start() { mainRigid = mainBall.GetComponent<Rigidbody>(); mainBallDefaultPosition = mainBall.transform.localPosition; arrow.gameObject.SetActive( false ); } void Update() { if( mainBall.activeSelf == true ) { // タッチしている指の数が0より多い. if( Input.touchCount > 0 ) { // タッチしている指の最初の値を取得. Touch touch = Input.GetTouch(0); // タッチ処理. if( touch.phase == TouchPhase.Began ) { Debug.Log( "タッチ開始" ); // 開始位置を保管. startTouch = touch.position; // 方向線を表示. arrow.gameObject.SetActive( true ); } else if( touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary ) { Debug.Log( "タッチ中" ); // 現在の位置を随時保管. Vector3 position = touch.position; // 角度を算出. Vector3 def = startTouch - position; float rad = Mathf.Atan2( def.x, def.y ); float angle = rad * Mathf.Rad2Deg; Vector3 rot = new Vector3( 0, angle, 0 ); Quaternion qua = Quaternion.Euler( rot ); // 方向線の位置角度を設定. arrow.localRotation = qua; arrow.transform.position = mainBall.transform.position; } else if( touch.phase == TouchPhase.Ended ) { Debug.Log( "タッチ終了" ); // 終了時の位置を保管. Vector3 upPosition = touch.position; // 開始位置と終了位置のベクトル計算から打ち出す方向を算出. Vector3 def = startTouch - upPosition; Vector3 add = new Vector3( def.x, 0, def.y ); // メインボールに力を加える. mainRigid.AddForce( add * power ); // 方向線を非表示に. arrow.gameObject.SetActive( false ); Debug.Log( "クリック終了" ); } } } } // --------------------------------------------------------------------- /// <summary> /// リセットボタンクリックコールバック. /// </summary> // --------------------------------------------------------------------- public void OnResetButtonClicked() { mainBall.SetActive( true ); mainRigid.velocity = Vector3.zero; mainRigid.angularVelocity = Vector3.zero; mainBall.transform.localPosition = mainBallDefaultPosition; foreach( ColorBall ball in ballList ) { ball.Reset(); } } } |
1 2 |
Vector3 mousePosition = new Vector3(); => Vector3 startTouch = new Vector3(); |
と変数名を変更し、
1 |
if( Input.touchCount > 0 ) |
を追加。
1 2 3 4 5 6 7 8 |
if( Input.GetMouseButtonDown(0) == true ) => if( touch.phase == TouchPhase.Began ) if( Input.GetMouseButton( 0 ) == true ) => else if( touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary ) if( Input.GetMouseButtonUp(0) == true ) => else if( touch.phase == TouchPhase.Ended )に |
のように変更し、また位置の取得を
1 2 |
Input.mousePosition => touch.position |
に変更しています。変数の名前も少し変わっていますが、これは自分のわかりやすい名前にしておけば問題ありません。
このタッチ処理は、複数のタッチを取得できますが、スマホ実機でしか動作しませんのでご注意下さい。
ただし、「UnityRemote5」というアプリを使えば、エディター上での再生をスマホで動作させることも可能です。
興味があれば、お手持ちのスマホで「UnityRemote5」をダウンロードしてみて使ってみてください。
関連記事:
また、スマホの端末の大きさ・解像度の違いに対応させたい場合は以下の記事を参考に実装してみてください。
以上で「ビリヤードゲーム」の完成です!お疲れ様でした!
次なるゲーム制作に入っていきましょう!
コメント