Unity × UMLで理解する「AppleCatch」

サンプル実装に直結する設計ドキュメント

TL;DR

  • 何がどのクラスの責務か、どこで衝突・生成・効果音・スコア更新が起こるかを、クラス図/コンポーネント図/ユースケース/状態遷移/アクティビティ/シーケンスで一望。 
  • そのまま実装できる設定チェックリスト最低限のコード断片付き。
  • クラス図の見直しポイントも併記(Updateの要否、参照取得の方針など)。

1. 目的

  • クラスの責務分担依存関係を明確化
  • Unityの典型処理(OnTriggerEnter、生成・破棄、SE再生)をUMLで俯瞰し、漏れを早期発見する。 

2. ゲーム概要(要約)

  • プレイヤーはバスケットを左右に操作し、Appleを取ってスコア加算、Bombを避けてライフ減を防ぐ
  • ItemGeneratorが一定間隔でりんご/爆弾を落下させる
  • 当たり判定はトリガー(OnTriggerEnter)
  • SEはAudioSource+AudioClip、スコア・ライフはGameDirectorで集中管理。  

3. 主要コンポーネントと責務

  • BasketController:入力・移動/OnTriggerEnterでタグ判定→GameDirectorへ通知/SE再生
  • GameDirector:スコア・ライフ・UI更新
  • ItemController:落下物の共通挙動(dropSpeed等)
  • Apple / Bomb:ItemControllerのデータ差分(見た目・タグ・出現比率)
  • ItemGenerator:一定間隔でApple/Bombを生成。  

4. 図で把握する

4.1 クラス図(ライフサイクル入り)

要点:BasketControllerはOnTriggerEnterでタグを見てGetApple/GetBombを呼び、SEを再生。ItemGeneratorは生成とパラメータ設定。ItemControllerは落下の共通処理。 

4.2 コンポーネント依存関係

BasketController→AudioSource/GameDirector、ItemGenerator→ItemController(Instantiate)など、シーン上の矢印関係を可視化。 

4.3 ユースケース

プレイヤー操作 → Apple取得/Bomb回避 → スコア/ライフ更新。 

4.4 状態遷移(ItemController)

生成→落下→捕捉→破棄(画面外・寿命破棄も許容)。 

4.5 生成アクティビティ(ItemGenerator)

一定間隔で生成タイミング判定→Apple/Bomb選択→Instantiate→初速設定→ループ。 

4.6 衝突時のシーケンス

OnTriggerEnter→タグ判定→SE→GetApple/GetBomb→(対象を)Destroy。 


5. 実装ガイド(設定チェックリスト)

  • タグ:Apple / Bomb を各Prefabに設定
  • コライダー:Basket側はIsTrigger = true、Item側は通常Collider+Rigidbody(2Dなら対応API)
  • オーディオ:BasketControllerにAudioSource、appleSE/bombSEを割当て
  • 参照取得:GameDirectorはFindよりSerializeField直参照推奨(リネーム耐性)
  • 破壊タイミング:SEはBasket側から鳴るため、Destroy(other.gameObject)は直後でOK
  • 最適化:生成/破棄が多い場合はオブジェクトプーリング検討。  

6. 最低限のコード断片(衝突処理)

void OnTriggerEnter(Collider other)
{
    // 例: Apple / Bomb をタグで判定
    if (other.gameObject.tag == "Apple")
    {
        audioSource.PlayOneShot(appleSE);
        director.GetApple();
    }
    else
    {
        audioSource.PlayOneShot(bombSE);
        director.GetBomb();
    }

    // 相手の追加処理(任意)
    // var item = other.GetComponent<ItemController>();
    // if (item != null) item.dropSpeed = 0;

    Destroy(other.gameObject);
}

7. よくある質問(抜粋・要点)

  • OnTriggerEnter後にGetComponentは使える? はい。相手コライダー側のコンポーネント取得が可能。
  • 全クラスにStart/Updateは必要? 不要。必要なクラスのみに実装。
  • Apple/Bombは別スクリプトに分ける? 振る舞いはItemControllerへ集約し、違いはデータで持つのがシンプル。  

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

C#,Unity

Posted by hidepon