Unityで何かを作ってみる その5

Unity

野菜を回転させる

回転ボタンを押下すると回転させるようにします。
GameManagerにRotateClickというメソッドを作り、そちらを呼び出すようにしてみます。

//回転をクリック
public void RotateClick(){
    //30度回転させる
    _vegetableSprite.transform.Rotate(new Vector3(0,0,30));
}

ヒエラルキーでRoteteButtonを選択し、ButtonコンポーネントのOnClick()に、ヒエラルキーからGameObjectをドラッグ&ドロップします。

FunctionにGameObjectのRotateClickが選択出来るようになるので、選択します。
これで、ボタンを押すとRotateClickが呼ばれるようになります。

ボタンを押した時に画面全体のタッチイベントが動かないようにする

ただし、このままだと、ボタンをおした時に画面全体のタッチイベントも動いてしまうので、どうにかしたいところです。
おそらくTouchScriptを駆使すれば大丈夫な気がしますが、早さ優先で一旦安易な方法を取ります。あとでもっと良い実装が思いついたら変えます。
・GameManagerにボタンがクリックされたかどうかのフラグを持たせる
・タッチイベントで、GameManagerのフラグが立っていたら処理をしない
ここで、GameManagerの参照の取り回しを考え直そうと思います。
TouchScriptのTouchManagerがシングルトンなので、同じようにシングルトンにして参照させるよう変更します。
GameManager.cs

---略---
static GameManager _instance;
public static GameManager Instance {
    get {
        if (_instance == null) {
            Debug.Log("GameManagerインスタンスがありません");
        }
        return _instance;
    }
}
//ボタンクリックのフラグ
bool _buttonClicked;
public bool ButtonClicked {
    get {
        return _buttonClicked;
    }
    set {
        _buttonClicked = value;
    }
}
---略---
//回転をクリック
public void RotateClick(){
    _buttonClicked = true; //ボタンがクリックされたフラグ
    _vegetableSprite.transform.Rotate(new Vector3(0,0,30));
}

タッチの処理を書いている、TouchDisplayクラスで、ボタンを押した状態だったら、タッチの処理を行わないようにします。
GameManagerがGameManager.Instanceで取得できますので、関連箇所も書き換えました。
TouchDisplay.cs

---略---
void pointersPressedHandler(object sender, PointerEventArgs e) {
    if (GameManager.Instance.ButtonClicked == true) {
        return;
    }
    touchFlug = true;
}
void pointersUpdatedHandler(object sender, PointerEventArgs e) {
    if (GameManager.Instance.ButtonClicked == true){
        return;
    }
    if (touchFlug == true) {
        foreach (var pointer in e.Pointers) {
            Vector3 screenToWorldPointPosition = Camera.main.ScreenToWorldPoint(pointer.Position);
            GameManager.Instance.VegetableSprite.transform.position = new Vector3(screenToWorldPointPosition.x, GameManager.Instance.VegetableSprite.transform.position.y, GameManager.Instance.VegetableSprite.transform.position.z);
        }
    }
}
void pointersReleasedHandler(object sender, PointerEventArgs e) {
    touchFlug = false;
    if (GameManager.Instance.ButtonClicked == true) {
        GameManager.Instance.ButtonClicked = false;
        return;
    }
    //野菜を落とす
    GameManager.Instance.VegetableSprite.Rigidbody2d.gravityScale = 1;
}
---略---

これで、ボタン押下時には画面全体のタッチイベントに書かれた処理は実行されなくなります。

Unity
スポンサーリンク
northprintをフォローする
おおよそ北の方向から

コメント