画面のタッチを取得するためにTouchScriptを導入する
続いてキャベツを落としたり、回転させたいのですが、落とすには画面をタッチして指を離したタイミングになりますので、画面タッチの判定が必要です。
画面タッチを取得するためにアセット「TouchScript」を導入します。
TouchScriptをダウンロードしてインポートします。
インポートすると、バージョンによってはエラーが出ます。
TouchScriptSettingsWindow.csの146行目、
mouseDown→MouseDownにして、修正します。これでOKです。
TouchManagerを作る
画面のタップを取得するためのゲームオブジェクトを作ります。
TouchManagerという名前で、空のGameObjectを作成し、Touch ManagerとFullscreen Layerを追加します。Touch ManagerのPointer LayersがFullscreen@Main Cameraになっていれば大丈夫です。
タップをコントロールするためのスクリプト、TouchDisplayというクラスを作成し、追加しています。
Touchの動作をスクリプトで制御する
TouchDisplayというクラスを作成しています。イベントハンドラを作成して、イベントに処理を記述します。
今回は、PointerPressed(タップした時)、PointerUpdated(動かした時)、PointerReleased(離した時)の3つのイベントを使います。
TouchDisplay.cs
using UnityEngine; using TouchScript; using VegetableTower.Managers; using System; namespace VegetableTower { public class TouchDisplay : MonoBehaviour { [SerializeField] GameManager gameManager; Boolean touchFlug; //タップしたかどうかのフラグ void OnEnable() { if (TouchManager.Instance != null) { //イベントハンドラの登録 TouchManager.Instance.PointersPressed += pointersPressedHandler; TouchManager.Instance.PointersUpdated += pointersUpdatedHandler; TouchManager.Instance.PointersReleased += pointersReleasedHandler; } } void OnDisable() { if (TouchManager.Instance != null) { TouchManager.Instance.PointersPressed -= pointersPressedHandler; TouchManager.Instance.PointersUpdated -= pointersUpdatedHandler; TouchManager.Instance.PointersReleased -= pointersReleasedHandler; } } void pointersPressedHandler(object sender, PointerEventArgs e) { touchFlug = true; } void pointersUpdatedHandler(object sender, PointerEventArgs e) { if (touchFlug == true) { foreach (var pointer in e.Pointers) { Vector3 screenToWorldPointPosition = Camera.main.ScreenToWorldPoint(pointer.Position); gameManager.vegetableSprite.transform.position = new Vector3(screenToWorldPointPosition.x, gameManager.vegetableSprite.transform.position.y, gameManager.vegetableSprite.transform.position.z); } } } void pointersReleasedHandler(object sender, PointerEventArgs e) { touchFlug = false; //重力を加え、野菜を落とす gameManager.vegetableSprite.Rigidbody2d.gravityScale = 1; } } }
GameManagerを参照し、野菜の挙動を操作しています。
Camera.main.ScreenToWorldPointで座標変換をしているところがポイントです。
野菜の参照を取得するため、GameManagrを少し変更しました。
GameManager.cs
using UnityEngine; using VegetableTower.Prefabs; namespace VegetableTower.Managers { public class GameManager : MonoBehaviour { VegetableSprite _vegetableSprite; public VegetableSprite vegetableSprite { get { return _vegetableSprite; } } void Start(){ CreateVegetable(); } //野菜を生成する void CreateVegetable(){ //prefabを取得 VegetableSprite prefab = (VegetableSprite)Resources.Load("Prefabs/VegetableSprite", typeof(VegetableSprite)); //インスタンスを生成 _vegetableSprite = Instantiate(prefab) as VegetableSprite; _vegetableSprite.transform.position = Vector3.zero; _vegetableSprite.Rigidbody2d.gravityScale = 0; _vegetableSprite.SetImage(); //画像を読み込んでから、当たり判定を追加 _vegetableSprite.gameObject.AddComponent(); } } }
こちらを実行すると、タップしたx座標に野菜が移動し、タップを話すと落ちる動作になります。
今回、回転まで行こうと思いましたが、次回に回します。
コメント