Unityに関連する記事です

 プログラムにおいては、処理の結果が同じ内容になる場合であっても、記述するソースコードの内容が異なるケースがあります。
ここでは1つの目的(処理の結果)をベースに、異なるソースコードの記法を学習します。

 2つの手順で学習します。こちらは初心者向けの内容になっています。



目的


 ゲーム内時間を計測し、1秒ごとに画面の表示を更新する

 画面の表示については別の手順で行いますので、ここでは、ゲーム内時間の計測の仕方について
様々なソースコードの記法を紹介します。

 いずれの記法においても、処理内には Debug.Log メソッドを用いて、Console ビューにて時間が正常に計測できているかを確認します。


<実行時の処理の確認>



 各ソースコードを記述したら、必ずデバッグを行います。
上記のように Console ビューに Debug.Log メソッドの実行結果が表示されることを確認してください。


記法1 ーUpdate メソッドの活用ー


 最も一般的な方法になります。
この教材においては、ソースコード内の処理が見やすいように適宜改行を入れていますが、この辺りは任意です。


TimeSample_1.cs



処理のメソッド化


 ポイントは Update メソッド内に直接処理を書くのではなく、処理をまとめたメソッドを1つ作成し、そちらの呼び出し命令を実行するようにします。

 メソッド化するメリットは「処理をまとめておくことで繰り返し利用することを容易にする」という他に、2つあります。
1つは Update メソッド内に他の処理が増えていった場合に、処理が読みにくくなることを防ぐこと、
もう1つは、時間の計測処理を止めたデバッグを行いたいときに、メソッドの呼び出し命令を1行コメントアウトすれば、処理を停止することができる部分です。


<処理をメソッドとしてまとめずに Update 内に書いてある場合のコメントアウト>
    void Update() {
        //timer += Time.deltaTime;

        //if (timer >= interval) {
        //    timer = 0;
        //    totalTime++;

        //    Debug.Log($"経過時間 : {totalTime} 秒");
        //}
    }

 処理をメソッド化していない場合、処理を停止させるためには、該当するすべての処理に対してのコメントアウト(今回であれば6行分)が必要です。



<処理をまとめてメソッド化してある場合のコメントアウト>
    void Update() {
        //TimerUpdate();   // ← この1行だけコメントアウト
    }

  /// <summary>
    /// 時間の測定
    /// </summary>
    public void TimerUpdate() {

        timer += Time.deltaTime;

        if (timer >= interval) {
            timer = 0;
            totalTime++;

            Debug.Log($"経過時間 : {totalTime} 秒");
        }
    }

 メソッド化してあれば、上記のように Update メソッド内の呼び出し命令を1行だけコメントアウトすれば、
TimerUpdate メソッドの内部の処理は一切変更せずに、時間の計測処理を停止できます

 このように、デバッグすることも考えた上で処理を構築した方が、後々の効率化も図れます
使い慣れている Update メソッドでの処理ではありますが、こういったテクニックを覚えていくようにしましょう。


記法2 ーコルーチンメソッドと while 文の活用ー


 こちらも Update メソッドと同じく利用されるケースの多い処理です。
コルーチンメソッドと while 文を組み合わせることで、疑似的な Update メソッドを再現することが可能です。

 処理自体は非同期処理になりますので、長期間、繰り返し動作する機能に向いています。

Unity 公式マニュアル
コルーチン



TimeSample_2.cs



while 文の条件式

while 文の条件式を true にした場合には yield return の処理を忘れずに記述してください。

 条件式を true に設定した while 文は無限ループを引き起こします。気を付けるポイントです。
また while 文内に if 文などが用意されている場合、分岐の真偽に関わらず yield return の処理を通るようにしなければなりません。
そうしておかないと、いずれかの分岐において無限ループが発生することになります。

 万が一、無限ループしてしまった場合には、Unity の再生ボタンが押せない状態になります。
Unity エディター自体を閉じることも出来ませんので、タスク管理(Windows であればタスクマネージャー)から Unity エディターを強制終了してください。


フレーム単位ではなく秒単位で計測する場合


 yield return の処理には null 以外にも WaitForSeconds クラスのインスタンスも利用できます。
こちらの場合は秒数の指定が出来ます。


TimeSample_3.cs




 以上になります。

 中上級者向けの記法はこちらになります。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます