← Unity C#

LESSON / ARTICLE

MonoBehaviourとTransform

MonoBehaviourのライフサイクル、Transform、時間に応じた移動処理を学びます。

MonoBehaviourとTransform

UnityではMonoBehaviourを継承したクラスをGameObjectに追加し、エンジンが呼び出すイベントメソッドを通じて振る舞いを実装します。この章では初期化と毎フレームの処理、Transformの操作を扱います。

Unityスクリプトの基本

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    void Start()
    {
        Debug.Log("Ready");
    }

    void Update()
    {
        // 毎フレーム呼び出される処理
    }
}

このクラスをPlayerController.csとして保存し、GameObjectへ追加します。Unityではファイル名とMonoBehaviourを継承するpublicクラス名を一致させるのが基本です。using UnityEngineはMonoBehaviour、Debug、TransformなどUnityのAPIを使うための宣言です。

ライフサイクル

  • Awake:スクリプトの初期化に使います。Startより前に呼び出されます。
  • OnEnable:Componentが有効になったときに呼び出されます。
  • Start:有効なスクリプトの開始時に一度呼び出されます。
  • Update:有効な間、フレームごとに呼び出されます。
  • FixedUpdate:物理演算の更新周期に合わせて呼び出されます。
  • OnDisable:Componentが無効になったときに呼び出されます。
  • OnDestroy:オブジェクトが破棄されるときに呼び出されます。

初期化や参照の取得はAwake、ゲーム開始時に一度だけ行う処理はStart、毎フレームの入力や状態確認はUpdate、物理演算に合わせる処理はFixedUpdateというように使い分けます。

Transformの基本

Transformは位置position、回転rotation、拡大縮小localScaleなどを管理します。positionはワールド座標、localPositionは親Transformを基準としたローカル座標です。親子関係がある場合、この違いが重要になります。

using UnityEngine;

public class TransformExample : MonoBehaviour
{
    void Start()
    {
        transform.position = new Vector3(0f, 1f, 0f);
        transform.localScale = new Vector3(1f, 2f, 1f);
    }
}

Vector3はx・y・zの3つのfloat値をまとめたUnityの構造体です。この例ではオブジェクトをワールド座標の(0, 1, 0)へ移動し、親を基準にY方向へ2倍に拡大します。

deltaTimeを使った移動

using UnityEngine;

public class MoveExample : MonoBehaviour
{
    [SerializeField] private float moveSpeed = 3f;

    void Update()
    {
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
    }
}

Time.deltaTimeは前のフレームから現在のフレームまでの経過時間(秒)です。移動速度にdeltaTimeを掛けることで、フレームレートが異なっても1秒あたりの移動距離をおおむね一定にできます。たとえばmoveSpeedが3なら、理想的には1秒で約3ワールド単位進みます。

SerializeFieldを付けたprivateフィールドはInspectorに表示されます。コード上の初期値を保ちながら、GameObjectごとにInspectorで調整できます。

TransformとRigidbodyの使い分け

Transformを直接変更する方法は、演出や物理演算を必要としない移動に向いています。一方、Rigidbodyで物理挙動を扱うオブジェクトを毎フレームTransformで直接動かすと、衝突判定や物理シミュレーションとの整合が崩れる場合があります。物理オブジェクトはRigidbodyのAPIを使い、物理更新周期に合わせて操作します。詳しくは次章で扱います。

よくある間違い

  • deltaTimeを掛けず、フレームレートによって移動速度が変わる。
  • 物理演算で動かすオブジェクトをTransformで直接移動する。
  • positionとlocalPositionの違いを無視する。
  • スクリプトをGameObjectに追加していない、またはファイル名とクラス名が一致していない。
  • Inspectorの参照や値が設定されていない。

この章の要点

MonoBehaviourのイベントメソッドはUnityが適切なタイミングで呼び出します。Transformは位置・回転・大きさを管理し、deltaTimeを使うと時間に応じた移動を表現できます。次章では入力と物理演算を組み合わせます。