jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

Unity C#で時間の取得

突然ですが実験的な研究のフレームワークとしてUnityを使い始めました。Unityはコーディングなしでも手軽にゲームを作成できる強力なツールです。(なんでUnityなのかはまた別の機会に書きます。)今回は、Unity内で時間を取得する方法をまとめておきます。

Unityは複数のプログラム言語に対応

UnityはC#JavaScript*1という二つの言語に対応しています。そして、実現したい機能によっては、2つの言語を使い分けることが大事なようです。今回の時間取得は、そのような例にもなっています。

JavaScriptで時間取得

Unityは時間を取得するためのクラスとしてTimeクラスが設定されています。これを利用すると簡単にプログラム起動からの経過時間をミリ秒単位で取得できます。以下の例では、プログラム開始時に一度時間を取得して、その後、画面が書きかわる度に時間を取得して、差分を計算しています。

var starttime: int;
var now: int;
var duration: int;

function Start(){
  //プログラム開始時に1回だけ行う
 starttime = Time.time;
}

function Update(){
  //画面の書き換えの度に行う
  now = Time.time;
  duration = now - starttime;
}

C#で時間取得

C#でもTimeクラスがあるので、これを使いたいところですが、うまくいかないことがありました。そこでDateTimeクラスを利用した書き方を紹介します。DateTimeクラスのNowのパラメータを見ると、現在時刻を取得できます。経過時間をミリ秒で計算するためには、時間、分、秒、ミリ秒のそれぞれをミリ秒単位に変換して合計しておけば良いでしょう。

using System;

public class GetTime: MonoBehaviour {
  
  private int starttime;
  private int now;
  private int duration;

  void Start (){
    starttime = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + 
    DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
  }
  
  void Update(){
    now = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + 
    DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
   
    duration = now - starttime;
  }
}

番外編:Unityっぽい書き方

上述したTimeクラスにはdeltatimeというパラメータがあって、前のフレームからの今のフレームの時間差が取得できます。これを累積していくと、経過時間を記録することができます。フレームの書き換え速度が可変であることをうまく考慮しているので、Unityっぽい書き方です。

var duration: float;

function Start(){
  //最初にdurationを0にする。
  duration = 0;
}

function Update(){
  //フレーム書き換えごとに経過時間を累積
  duration += Time.deltaTime;
}

*1:厳密にいうと、JavaScriptをベースにしたUnity独自のスクリプトでWebの標準的なJavaScriptとは仕様が違うみたいです