万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

Unity Advent Calendar 2012 16日目 Title:「GoKit応用 TimeScale試す」

URL: http://atnd.org/events/34621

@komachireader さんがコメントくださったので、再度GoKitやってみた。
「iTweenで言うところのignoreTimeScaleのようなフラグが無い」
「ポーズ中の画面でTweenを使いたいときがある」

早速、サンプルの「1. Simple Tween」シーンの主なクラスのある「SimpleTween.cs」を見てみた。

・SimpleTween.cs
AwakeのTimeScaleを0にしてみる!

    void Awake ()
    {
        Time.timeScale = 0;
    }

あれ?普通に動くよ?

Goクラスを見てみる。
→それにしても英単語1つをクラス名にして強気だ。他と被りそうだわな。
・Go.cs

    #region Monobehaviour

    private void Update ()
    {
        if (_tweens.Count == 0)
            return;
        
        handleUpdateOfType (UpdateType.Update, Time.deltaTime);
    }
    
    private void LateUpdate ()
    {
        if (_tweens.Count == 0)
            return;
        
        handleUpdateOfType (UpdateType.LateUpdate, Time.deltaTime);
    }
    
    private void FixedUpdate ()
    {
        if (_tweens.Count == 0)
            return;
        
        handleUpdateOfType (UpdateType.FixedUpdate, Time.deltaTime);
    }
    
    #endregion

Update, LateUpdate, FixedUpdateのUpdate3兄弟全部使ってるwwww
UpdateはTimeScaleの影響をうけませんね。



ちなみに、regionってなんだ?って調べたらコードを折りたためるだけ?
http://msdn.microsoft.com/ja-jp/library/9a1ybwek(v=vs.80).aspx

「#region Monobehaviour」から「#endregion」までを折りたためる。
これが↓

こうなる↓

これもアドベントカレンダーのために置いといても良かったかも?


よってUpdateのとこをコメントアウトすればTime.timeScaleが0だと止まる。

    private void Update ()
    {
        if (_tweens.Count == 0)
            return;
        
//        handleUpdateOfType (UpdateType.Update, Time.deltaTime);
    }

じゃあ、Gameシーン中の左のトグルはなんですか?
↓こいつをかえるときちんとスピードに影響が出ます。

気になってサンプルコードの親クラス「BaseDemoGUI.cs」のOnGUI()メソッドをみてみると、

・「BaseDemoGUI.cs」のOnGUI()メソッド下方を抜粋

        GUILayout.Label ("Time Scale: " + string.Format ("{0:0.##}", _tween.timeScale));
        var newTweenTimeScale = GUILayout.HorizontalSlider (_tweenTimeScale, 0, 3);
        if (newTweenTimeScale != _tweenTimeScale) {
            _tweenTimeScale = newTweenTimeScale;
            _tween.timeScale = _tweenTimeScale;
        }
        
        easeTypesGUI ();
    }

このコードがAbstractTweenのインスタンスのtimeScaleプロパティの代入をしている。

_tween.timeScale = _tweenTimeScale;

つまり、SimpleTween.cs

    void Start ()
    {
        // setup a position and color tween that loops indefinitely. this will let us play with the
        // different ease types
        _tween = Go.to (cube, 4, new TweenConfig ()
            .position (new Vector3 (9, 4, 0))
            .materialColor (Color.green)
            .setIterations (-1, LoopType.PingPong));

        _tween.timeScale = 2; // これで2倍のスピード!
    }

【結論】
Tween以外はTime.timeScale = 0でポーズ止めておいて、
TimeScaleプロパティを0とか1にして適宜オフ・オン切り替えられますね!



では、Advent Calendar次の方へ!