Unityのコードを整理してみよう ― 数値をフィールドへ、処理をメソッドへ分ける

広告

Unityでプログラムを書き始めたばかりのころは、「とりあえず動けばOK」という形でコードを書くことが多いと思います。

たとえば、左右の矢印キーを押したときに、プレイヤーを左右へ3ずつ動かすコードを考えてみます。

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    void Start()
    {
        Application.targetFrameRate = 60;
    }

    void Update()
    {
        if (Keyboard.current.leftArrowKey.wasPressedThisFrame)
        {
            transform.Translate(-3, 0, 0);
        }

        if (Keyboard.current.rightArrowKey.wasPressedThisFrame)
        {
            transform.Translate(3, 0, 0);
        }
    }
}

このコードでも、もちろん動作します。

しかし、プログラムが少しずつ大きくなってくると、次のような問題が起きてきます。

  • 「この 3 は何の数字だったかな?」
  • 「移動の処理はどこに書いてあったかな?」

そこで今回は、コードを少し整理してみます。

まず「3」をフィールドにしてみる

現在のコードでは、移動量として直接 3 を書いています。

transform.Translate(-3, 0, 0);
transform.Translate(3, 0, 0);

このようにコードの中へ直接書かれた数値は、あとから見たときに意味が分かりにくくなることがあります。

そこで、移動量をフィールドにしてみましょう。

[SerializeField] float moveDistance = 3f;

すると、移動処理は次のように書けます。

transform.Translate(-moveDistance, 0, 0);
transform.Translate(moveDistance, 0, 0);

3 だけでは「何の3?」となりますが、moveDistance なら「移動する距離なんだな」と名前から意味を判断できます。これだけでもコードがかなり読みやすくなります。

フィールドにするとInspectorから変更できる

[SerializeField] を付けているので、UnityのInspectorから値を変更できます。

[SerializeField] float moveDistance = 3f;

たとえば、次のようにプログラムを書き換えなくても調整できます。

  • 1なら少しだけ移動
  • 3なら普通に移動
  • 5なら大きく移動

ゲーム制作では、このような「あとから調整したくなる値」はフィールドとして分けておくと便利です。

次に、移動処理をメソッドへ分けてみる

次は、左右へ移動する処理そのものをメソッドに分けてみます。完成形は次のようになります。

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    [SerializeField] float moveDistance = 3f;

    void Start()
    {
        Application.targetFrameRate = 60;
    }

    void Update()
    {
        if (Keyboard.current.leftArrowKey.wasPressedThisFrame)
        {
            MoveLeft();
        }

        if (Keyboard.current.rightArrowKey.wasPressedThisFrame)
        {
            MoveRight();
        }
    }

    void MoveLeft()
    {
        transform.Translate(-moveDistance, 0, 0);
    }

    void MoveRight()
    {
        transform.Translate(moveDistance, 0, 0);
    }
}

Updateを見ると「何をしているか」が分かりやすくなる

整理する前のコードでは、Update() の中にこう書かれていました。

if (Keyboard.current.leftArrowKey.wasPressedThisFrame)
{
    transform.Translate(-3, 0, 0);
}

整理した後は、次のようになっています。

if (Keyboard.current.leftArrowKey.wasPressedThisFrame)
{
    MoveLeft();
}

日本語にそのまま読み替えると、次のようになります。

左矢印キーが押されたら
    左へ動く

右側も同じです。つまり Update() を読むだけで、「キー入力を調べて、左右に移動している」というプログラム全体の流れが分かるようになります。

「入力」と「動作」を分ける

今回の整理で重要なのは、単にコードを短くすることではありません。役割を分けていることです。

  • Update() … どんな入力があったかを判断する場所
  • MoveLeft() / MoveRight() … 実際にキャラクターを動かす場所
入力を判断する処理
        ↓
実際に動く処理

この考え方は、プログラムが大きくなってきたときに非常に役立ちます。

メソッドに名前を付けることには意味がある

メソッドを作るということは、単にコードを別の場所へ移動するだけではありません。処理に「名前を付ける」という意味があります。

transform.Translate(-moveDistance, 0, 0); を見ると、コードを読んで意味を考える必要があります。しかし MoveLeft(); なら、「左へ動く」という意味がすぐに分かります。

つまりメソッド名は、コードの説明にもなっているのです。

さらにまとめることもできる

ここまで理解できたら、左右の処理がよく似ていることにも気付くかもしれません。

void MoveLeft()
{
    transform.Translate(-moveDistance, 0, 0);
}

void MoveRight()
{
    transform.Translate(moveDistance, 0, 0);
}

違うのは、ほぼ - が付いているかどうかだけです。そこで、方向を引数として渡す方法もあります。

void Move(float direction)
{
    transform.Translate(moveDistance * direction, 0, 0);
}

左へ動く場合は Move(-1);、右へ動く場合は Move(1); と書けます。完成形は次のようになります。

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    [SerializeField] float moveDistance = 3f;

    void Start()
    {
        Application.targetFrameRate = 60;
    }

    void Update()
    {
        if (Keyboard.current.leftArrowKey.wasPressedThisFrame)
        {
            Move(-1);
        }

        if (Keyboard.current.rightArrowKey.wasPressedThisFrame)
        {
            Move(1);
        }
    }

    void Move(float direction)
    {
        transform.Translate(moveDistance * direction, 0, 0);
    }
}

こちらのほうがコードは短くなります。ただし、プログラミングを勉強し始めたばかりなら、MoveLeft(); と MoveRight(); に分けた形から理解するほうがおすすめです。

最初から短いコードを目指さなくてもよい

初心者のうちは、「同じような処理があるなら、すぐに1つにまとめなければならない」と考える必要はありません。

まず、MoveLeft(); と MoveRight(); のように、処理の意味がはっきり分かる形で書きます。そして「この2つはほとんど同じ処理だな」と気付いたら、Move(float direction) のようにまとめていけばよいでしょう。

プログラムは、最初から完璧な形を書く必要はありません。

  1. まず動かしてみる
  2. 次に読みやすくしてみる
  3. さらに共通部分を見つけて整理してみる

この流れも大切なプログラミング学習です。

まとめ

数値をフィールドにし、処理をメソッドに分けてコードを読みやすくする3ステップの図解

最初は transform.Translate(3, 0, 0); と直接書いていました。そこから、次の2段階で整理しました。

数値に名前を付ける(フィールド)
        ↓
処理に名前を付ける(メソッド)

プログラムを書くときは、「どうすれば短く書けるか」だけでなく、「あとから見たときに、何をしているコードなのか分かるか」も考えてみてください。読みやすいコードを書くための第一歩になります。

訪問数 1 回, 今日の訪問数 1回

広告

Unity

Posted by hidepon