Unityに関連する記事です

 前回の手順につづき、ソースコードの記法学習を行います。

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



目的


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

 計測方法については学習しましたので、今回は画面の表示について、様々なソースコードの記法を紹介します。

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


<実行時の処理の確認>



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


記法1 ー一般的な方法ー


 メソッドの引数に表示させたい時間の値を受け取り、それを描画します。

  [SerializeField]
  private Text txtTime;

  public void UpdateDisplayTime(float time){
      txtTime.text = time.ToString("F2");
  }


記法2 ーDOTween の活用ー

 
 DOTween の補間機能を活用することで、画面表示もアニメーションさせることが出来ます。

 int 型の整数(float 型の浮動小数)については Text.DOCounter() メソッド、DoVirtual.Float メソッド、
string 型の文字列については Text.DOText() メソッドが利用できます。

 なお TextMeshPro についても同メソッドが用意されていますが、こちらは DOTweenPro アセットが必要になります。
Text コンポーネントについては無料アセットで利用できます。

<DOCounter(int 型の整数) メソッド>

  [SerializeField]
  private Text txtTime;

  [SerializeField]
  private Ease ease; 

 private float oldTime;
  private float duration = 1.0f; 


  public void UpdateDisplayTime(int newTime){
      txtTime.DOCounter(oldTime, newTime, duration).SetEase(ease);
      oldTime = newTime;
  }

  public void UpdateDisplayTime(float newTime){
      txtTime.DOCounter((int)oldTime, (int)newTime, duration).SetEase(ease);
      oldTime = newTime;
  }

 時間のように小数で管理している値の場合には、整数にキャストして利用します。
ただし、正確に小数点の値を表示させたい場合には、次に紹介する DOVirtual.Float メソッドを活用してください。

 Ease の値を変更することで、補間のアニメーションが変化します。
色々なパターンを確認したい場合には、スクリプト内で Ease を指定するのではなく、
変数を用意し、それをインスペクターから変更できるようにすることでデバッグが容易になります。


<DOVirtual.Float(float 型の浮動小数) メソッド>

  [SerializeField]
  private Text txtTime;

  [SerializeField]
  private Ease ease; 

 private float oldTime;
  private float duration = 1.0f; 


  public void UpdateDisplayTime(float newTime){
      DOVirtual.Float(oldTime, newTime, duration, value => { txtTime.text = value.ToString("F2"); }).SetEase(ease);
      oldTime = value;
  }

 なお、内部計算は浮動小数であっても、画面上では整数表示させたい場合には、
ToString メソッド の引数を "F0" に指定して小数点をカットする方法と、value を int 型にキャストする方法があります。


<整数表示の例>
  // ToString メソッドの引数を変更して整数表示
  txtTime.text = value.ToString("F0");

 // value を int 型にキャスト
  txtTime.text = (int)value.ToString();


<DOText(string 型の文字列) メソッド>

  [SerializeField]
  private Text txtTime;

  private float duration = 1.0f; 


  public void UpdateDisplayMessage(string message){
      txtTime.DOText(message, duration).SetEase(Ease.Linear);
  }

 文字を一定の速度で表示させたい場合には、SetEase メソッドを Ease.Linear で指定することで、等速表示になります。


記法3 ーMV(R)P パターンの活用ー


 Model クラスにおいて ReactiveProperty を用意し、Presenter にて購読します。

 View クラスには記法1と同じように記述します。



<Model クラス>
 using UniRx;

  public ReactiveProperty<int> Time = new();



<View クラス>
  [SerializeField]
  private Text txtTime;

  public void UpdateDisplayTime(int time){
      txtTime.text = time.ToString();
  }



<Presenter クラス>
 using UniRx;

  [SerializeField]
  private Model model;

  [SerializeField]
  private View view;

  void Start() {
      model.Time.Subscribe(time => view.UpdateDisplayTime(time)).AddTo();
  }

 時間の計測方法自体は以前の教材にて紹介済であるため、割愛します。


記法4 ーMV(R)P パターンと DOTween の組み合わせー


 UniRx に用意されているオペレータのうち、 Zip() メソッドと Skip() メソッドを活用することで、
ReactiveProperty で購読している値を DOCounter() メソッドを利用してアニメ表示させることが出来ます。

 オペレータとは Subject によって OnNext メッセージが発行された際に、Subscribe する前に挟み込むことができる処理のことで、UniRx に用意されているメソッド群です。
たくさんのオペレータが用意されています。Linq のようにメソッド・チェーンさせて複数のオペレータを挟みこんで処理のロジックを構築できます。

 オペレータの種類については、下記のサイトに詳しくまとめられているので参考にしてください。

<参考サイト>
Qiita @toRisouP(株式会社 バーチャルキャスト)
UniRx オペレータ一覧




 記法2(DOTween)の View クラスと、記法3(MV(R)P パターン) Presenter クラスの処理を書き換えることで実装出来ます。


<View クラス>
  [SerializeField]
  private Text txtTime;

  [SeriallizeField]
  private Ease ease;

  private float duration = 1.0f; 


  public void UpdateDisplayTime(int oldTime, int newTime){
      txtTime.DOCounter(oldTime, newTime, duration).SetEase(ease);
  }



<Presenter クラス>
 using UniRx;

  [SerializeField]
  private Model model;

  [SerializeField]
  private View view;

  void Start() {
      model.Time
          .Zip(model.Time.Skip(1), (oldTime, newTime) => (oldTime, newTime))   // タプル型を利用します
          .Subscribe(x => view.UpdateDisplayTime(x.oldTime, x.newTime))
          .AddTo();
  }



 以上になります。
 
 他にも実装方法はありますので、色々なものを調べて試してみてください。



コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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