【Unity】初心者必見!開発がグッと楽になるスクリプトの書き方

プログラミング
記事内に広告が含まれています。

「コードがぐちゃぐちゃで、後から自分でも読めない…」「もっと効率よく書く方法が知りたい!」そんな悩みを持つプログラミング初心者や趣味でゲーム開発をしている方へ。

スクリプトの書き方ひとつで、ゲーム制作のスピードもクオリティも大きく変わります。

本記事では、初心者でも実践しやすい「効率的なスクリプトの書き方」のコツを分かりやすく解説します!

コードの整理と構造化

クラスとメソッドを適切に分ける

コードが長くなると、どこに何があるのか分かりづらくなります。
適切にクラスやメソッドを分けることで、見やすく管理しやすいコードになります。

悪い例(すべての処理がUpdate内にある)

using UnityEngine;

public class Player : MonoBehaviour {
    public float speed = 5f;

    void Update() {
        if (Input.GetKey(KeyCode.RightArrow)) {
            transform.position += new Vector3(speed * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.LeftArrow)) {
            transform.position += new Vector3(-speed * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.UpArrow)) {
            transform.position += new Vector3(0, speed * Time.deltaTime, 0);
        }
        if (Input.GetKey(KeyCode.DownArrow)) {
            transform.position += new Vector3(0, -speed * Time.deltaTime, 0);
        }
    }
}

良い例(処理を分ける)

using UnityEngine;

public class Player : MonoBehaviour {
    public float speed = 5f;

    void Update() {
        MovePlayer();
    }

    void MovePlayer() {
        Vector3 move = Vector3.zero;

        if (Input.GetKey(KeyCode.RightArrow)) {
            move.x += speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.LeftArrow)) {
            move.x -= speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.UpArrow)) {
            move.y += speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.DownArrow)) {
            move.y -= speed * Time.deltaTime;
        }

        transform.position += move;
    }
}

キャラクターを移動させるスクリプトなどはUpdateの中に多くの処理が入ることが多いです。
その場合は、ある程度の処理のかたまりをメソッド(例:MovePlayer())に分けることで可読性が良くなります。

コードの再利用性を高める

共通処理を関数化する

同じ処理を何度も書くとコードが冗長になり修正が大変になります。
共通処理は関数としてまとめましょう。

悪い例

void Update() {
    if (Input.GetKey(KeyCode.W)) {
        transform.position += new Vector3(0, 1, 0) * Time.deltaTime;
    }
    if (Input.GetKey(KeyCode.S)) {
        transform.position += new Vector3(0, -1, 0) * Time.deltaTime;
    }
}

良い例(関数化)

void Update() {
    HandleMovement();
}

void HandleMovement() {
    float moveY = 0;
    if (Input.GetKey(KeyCode.W)) moveY = 1;
    if (Input.GetKey(KeyCode.S)) moveY = -1;
    transform.position += new Vector3(0, moveY, 0) * Time.deltaTime;
}

悪い例ではWASDの4方向の移動となると更に冗長なコードとなってしまいます。
良い例のようにスッキリ書ける方法がないかを都度検討してみましょう。

パフォーマンスを意識したスクリプト

Update内での不要な処理を避ける

Update()は毎フレーム実行されるため、無駄な処理があるとパフォーマンスが低下します。

悪い例(毎フレームオブジェクト検索をしている)

void Update() {
    GameObject player = GameObject.Find("Player");
    player.transform.position += new Vector3(1, 0, 0) * Time.deltaTime;
}

良い例(Start()で一度だけ取得する)

private GameObject player;

void Start() {
    player = GameObject.Find("Player");
}

void Update() {
    player.transform.position += new Vector3(1, 0, 0) * Time.deltaTime;
}

最初に一度呼ぶだけでいい処理(GameObject.Find)をStart()の中で呼び出すようにしました。
呼び出さなくていいタイミングで呼び出している処理がないかを確認してみましょう。

可読性を高めるための工夫

変数・関数名を分かりやすくする

悪い例(意味の分かりにくい変数名)

float a = 1.5f;
void Move(float x) {
    transform.position += new Vector3(x, a, 0) * Time.deltaTime;
}

良い例(明確な変数名)

float jumpHeight = 1.5f;
void Move(float horizontalSpeed) {
    transform.position += new Vector3(horizontalSpeed, jumpHeight, 0) * Time.deltaTime;
}

ジャンプの高さを代入する変数を「jumpHeight」、水平方向の移動スピードを代入する変数を「horizontalSpeed」と命名しました。
このように最初の単語を小文字にして、そのあとの単語の先頭を大文字にする命名形式をキャメルケースと呼びます。

コメントを適切に入れる

コメントを適切に使うことでコードの意図を明確にできます。

// プレイヤーを上方向に移動させる
void MoveUp() {
    transform.position += new Vector3(0, 1, 0) * Time.deltaTime;
}

後から見たときに「これ何の処理だっけ…?」とならないように、こまめにコメントを書いておきましょう。

まとめ

効率的なスクリプトを書くためには、以下のポイントを意識しましょう。

  • クラスやメソッドを適切に分けてコードを整理する
  • 共通処理は関数化して再利用しやすくする
  • パフォーマンスを意識し、不要な処理を減らす
  • 変数名やコメントを適切に使い、可読性を向上させる

個人開発の場合は動けばOKという考え方もあるかなと思いますが、これらのポイントを押さえることでスムーズにゲーム開発を進めることができるので、意識して少しずつ実践していきましょう!

コメント

タイトルとURLをコピーしました