【unity + C#】パズルゲームの開発 – その2 オブジェクトの回転

こんにちは、竹上です。

前回の続きを書いていきます

[>>>前回の記事のリンク Unity + C# パズルゲーム開発 その1 フリックイベント]

前回はフリックイベントの発行と
フリック情報をQueを使って
アニメーションを行うMonoBehavierに渡す処理を書きました。

今回はイベントの受信した後にCubeを回転させるコードを書いていきます。

MainCameraの

GameMessenger.Instance.SendMessage(l_fInfo);

で発行したイベントを
GameLayerのUpdate()でエンキューし、
受け取った情報をもとにダイスをまわします。


public class GameLayer : MonoBehaviour {

    // アニメーション中フラグ
    private bool _isRolling = false;
    private GameObject _target        = null;
    private FlickInfo  _targetInfo_f  = null;
    private short      _animCount     = 0;
    private Vector3    _rollDirection;

    protected void Update () {
        
        if(this._isRolling) {
            this._onFlickDice(
                this._target, this._targetInfo_f);
        } else {
            this._receiveMessage();
        }
    }

    // メッセージ受信イベント
    private void _receiveMessage() {

        if(GameMessenger.Instance.Count > 0) {

            // メッセージ受信
            object l_msg = GameMessenger.Instance.RecvMessage(); 
            FlickInfo l_fInfo = l_msg as FlickInfo;

            if(l_fInfo != null) {

                // フリック開始位置からダイスを取得
                GameObject l_dice = 
                    GameLayerInfo.Instance.getDiceAt(
                            l_fInfo.StartX, l_fInfo.StartY);

                if(l_dice != null) {

                    // 回転フラグ立てる
                    this._isRolling    = true;
                    this._target       = l_dice;
                    this._targetInfo_f = l_fInfo;
                }
            }
        }
    }

    // 回転スピード
    static private int _ROLL_SPEED = 10;
    // 一イベントで回転する量
    static private int _ROLL_MAX   = 90;

    // さいころ回転
    private void _onFlickDice(GameObject p_dice, FlickInfo p_info) {

        // ダイスのアニメーション
        if(this._animCount < (_ROLL_MAX / _ROLL_SPEED)) {

            if(this._animCount == 0 ) {

                int l_y = this._roundAngle(
                            p_dice.transform.localEulerAngles.y);
                    int l_x = this._roundAngle(
                            p_dice.transform.localEulerAngles.x);
                    int l_z = this._roundAngle(
                            p_dice.transform.localEulerAngles.z);

                    int Direction = DiceUtility.getDiceDirection(l_y);
                    int State = DiceUtility.getDiceState(l_x, l_z);

                    // 回転する方向を取得
                    this._rollDirection = DiceUtility.getRotateVector(
                        State, Direction, p_info.Direction);
            }
            
            // ダイスを回転させる
            p_dice.transform.Rotate(
                    this._rollDirection.x,
                    this._rollDirection.y,
                    this._rollDirection.z);

            this._animCount++;

        // アニメーション終了
        } else {

            this._isRolling = false;
            this._animCount = 0;
            this._rollDirection.x = 0;
            this._rollDirection.y = 0;
            this._rollDirection.z = 0;

            this.onDiceStateChanged(p_dice);
        }
    }
}

と、こんな感じなんです。
DiceUtilityとか突然出てきたクラスがいますが、
面倒な計算はこの中でやっています。

前に投稿したときから大分進んでしまったので、
端折った部分も多いですが、
ダイスを作る->回す->消す->消したところに足す
までできました。

が、しかし、

しばらく触ることができず、
改めてコードをみたらなんじゃこりゃ…
って感じです。ごめんなさい。

https://github.com/honeytrap15/DiceDice

うまいことフレーム化したいなぁ

コメントを残す

メールアドレスが公開されることはありません。