U
タブ 01基礎11 レッスン — タップで開く
02 / 11 · 5 分
基礎

メソッドとゲームループ

ここまでのプロジェクト

まだプロジェクトはありません。今学んでいるのは Unity が代行してくれる 3 つのメソッド——レッスン 06 以降で実際に動くのを見ます。

メソッドとは、名前が付いていて、いつでも実行できるコードのまとまりです。Unity がそのうち三つを自動で呼んでくれます。

アニメーション図

Awake と Start はオブジェクトが生まれてから一度ずつだけ走り、Update は 1 秒間に 60 回ほど、何度もくり返されます。

毎日書く三つのメソッド

Lifecycle.cs
void Awake()  { /* set up my own references */ }
void Start()  { /* everything else exists now */ }
void Update() { /* runs every frame */ }
  • void は戻り値を返さないという意味です。( ) の中は入力を受け取る部分で、ここでは空になっています。

  • Awake は Start より前に、すべてのオブジェクトで走ります。だから Start なら他のオブジェクトを安全に使えます。

  • Update がゲームのループそのものです:入力を受け取る、移動させる、時間を測る、条件を確かめる。

Time.deltaTime——Update のただ一つのルール

PC が速いと Update の呼ばれる回数が遅いスマホより多くなります。Time.deltaTime(前のフレームから経過した秒数)を掛けておけば、どの端末でも同じ速さで動きます。

アニメーション図

それぞれの箱が Update() が呼ばれた一回です。上の半分は呼ぶたびに 5 HP 足すため、速いマシンは 1 秒の終わりに 50 HP に達します。下の半分は 5 HP × deltaTime なので、どの速さでも同じ 5 HP で揃います。

✖ 3 units per frame

frame-dependent
transform.position += Vector3.forward * 3f;

✓ 3 units per second

frame-independent
transform.position += Vector3.forward * 3f * Time.deltaTime;

自分のメソッドを書く

Damage.cs
int hp = 100;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
        TakeDamage(20);            // call it
}

void TakeDamage(int amount)        // amount = the input
{
    hp -= amount;
    Debug.Log("HP left: " + hp);   // prints to the Console
}