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) のようにまとめていけばよいでしょう。
プログラムは、最初から完璧な形を書く必要はありません。
- まず動かしてみる
- 次に読みやすくしてみる
- さらに共通部分を見つけて整理してみる
この流れも大切なプログラミング学習です。
まとめ

最初は transform.Translate(3, 0, 0); と直接書いていました。そこから、次の2段階で整理しました。
数値に名前を付ける(フィールド)
↓
処理に名前を付ける(メソッド)
プログラムを書くときは、「どうすれば短く書けるか」だけでなく、「あとから見たときに、何をしているコードなのか分かるか」も考えてみてください。読みやすいコードを書くための第一歩になります。








ディスカッション
コメント一覧
まだ、コメントがありません