Unityチーム開発チュートリアル:シンプルなサンプルプロジェクトの技術資料

2024年10月18日

この技術資料では、Git、Unity、C#の基礎を3か月学習した中級者向けに、GitHub Desktopを活用したチーム開発のプロセスを具体的なサンプルプロジェクト「Coin Collector」を通じて学びます。6日間にわたり、プロジェクトのセットアップから最終ビルドまでをチームで協力しながら進めていきます。


対象者: Git、Unity、C#を3か月学習経験がある中級者
期間: 6日間
ツール: Unity、GitHub Desktop、Visual Studio (または任意のC#対応エディター)
プロジェクト: 2Dコレクティブルゲーム「Coin Collector」


目次

プロジェクト概要

プロジェクト名: Coin Collector

ジャンル: 2Dアクション/コレクション

説明: Unityで開発されたシンプルな2Dコレクタブルゲーム

概要: プレイヤーキャラクターを操作し、ステージ内に散らばったコインを収集するシンプルな2Dゲーム。収集したコインの数が画面上に表示され、一定数集めるとゲームクリアとなる。

チームメンバーの役割:

  • プログラマー: プレイヤーの動作、コイン収集ロジックの実装
  • デザイナー: キャラクターとコインのアートアセットの作成
  • UIデベロッパー: ユーザーインターフェースの実装
  • サウンドエンジニア: 効果音とBGMの追加

1日目:プロジェクトのセットアップとチーム構成

1. プロジェクトのセットアップ

a. Unityプロジェクトの作成

  • プロジェクト名: CoinCollector
  • テンプレート: 2D
  • 初期コミット:
    • GitHubDesktopにプロジェクトフォルダをドラッグ&ドロップする方法でGitを作成すると、初期コミットは自動的に行われます

b. リポジトリの作成

  • GitHubで新規リポジトリを作成:
    • リポジトリ名: CoinCollector
    • 説明: Unityで開発されたシンプルな2Dコレクタブルゲーム
    • Public/Private: プライベート(チームメンバーのみアクセス可能)
    • Initialize with README: チェックしない
  • リポジトリをクローンする方法 GitHubリポジトリをローカル環境にクローンする方法は以下の2つがあります。
    • 方法1: GitHub Desktopからクローン
      1. GitHub Desktopを開きます。
      2. メニューから「Clone a repository from the Internet」を選択します。
      3. リストからCoinCollectorリポジトリを選択します。
      4. ローカルパスを指定して「Clone」ボタンをクリックします。
    • 方法2: GitHubウェブサイトからクローン
      1. GitHubウェブサイトでCoinCollectorリポジトリのページに移動します。
      2. 緑色の「Code」ボタンをクリックします。
      3. ドロップダウンメニューから「Open with GitHub Desktop」を選択します。
      4. GitHub Desktopが自動的に開き、クローン先のローカルパスを確認後、「Clone」ボタンをクリックします。 GitHubウェブサイトのCodeボタン

以上の手順で、CoinCollectorリポジトリをローカル環境にクローンすることができます。チームメンバーはこれらの方法を利用してリポジトリにアクセスし、プロジェクトの開発を開始できます。

2. チーム構成と役割分担

  • 役割の明確化:
    • 各メンバーの役割を再確認し、具体的なタスクを割り当てる。
  • コミュニケーションツールの設定:今回は使いません
    • Slack/Discordのチャンネル作成:
      • #general: 一般連絡
      • #development: 開発関連
      • #design: デザイン関連
      • #sound: サウンド関連

3. タスク管理の設定

  • GitHub Projectsの作成:オプション
    • プロジェクトボード名: CoinCollector Development
    • カンバンボードを設定し、To Do、In Progress、Doneのカラムを作成。
  • 初期タスクの追加:
    • 各メンバーに対して初期タスクを作成し、担当を割り当てる。

4. 実践課題

  • リポジトリのクローンとセットアップ確認:
    • 全メンバーがリポジトリをクローンし、Unityプロジェクトを開いて正しくセットアップできていることを確認。
  • READMEの更新:
    • プロジェクト概要、チームメンバーの役割、初期タスクをREADME.mdに記載。

まとめ

初日はプロジェクトのセットアップとチームの役割分担、コミュニケーションとタスク管理の準備を行いました。これにより、チーム全体が統一された環境で効率的に開発を進める基盤が整いました。明日はプレイヤーキャラクターの実装に取り組みます。


2日目:プレイヤーの実装

1. プレイヤーキャラクターの作成

a. アートアセットの準備(デザイナー担当)

  • キャラクタースプライトの作成:
    • 簡単な2Dキャラクターのスプライトを作成し、Assets/Sprites/Playerに保存。
  • アニメーションの準備:
    • 移動アニメーション用のスプライトシートを作成。

b. プレイヤーオブジェクトの設定(プログラマー担当)

  • シーンの準備:
    • MainSceneを作成し、保存。
  • プレイヤーオブジェクトの追加:
    • GameObject > 2D Object > Spriteで新規スプライトを作成。
    • 名前をPlayerに変更。
    • デザイナーから提供されたスプライトを割り当て。
  • コライダーとリジッドボディの追加:
    • PlayerオブジェクトにBox Collider 2DRigidbody 2Dを追加。
    • Rigidbody 2DのBody TypeDynamicに設定。

2. プレイヤーの動作スクリプト

a. スクリプトの作成(プログラマー担当)

  • スクリプトの追加:
    • Assets/Scripts/PlayerController.csを作成。
  • PlayerController.csの内容:
   using UnityEngine;

   public class PlayerController : MonoBehaviour
   {
       public float moveSpeed = 5f;
       private Rigidbody2D rb;
       private Vector2 movement;

       void Start()
       {
           rb = GetComponent<Rigidbody2D>();
       }

       void Update()
       {
           movement.x = Input.GetAxisRaw("Horizontal");
           movement.y = Input.GetAxisRaw("Vertical");
       }

       void FixedUpdate()
       {
           rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
       }
   }
  • スクリプトの適用:
    • PlayerオブジェクトにPlayerControllerスクリプトをアタッチ。

3. テストと調整

  • プレイヤーの動作確認:
    • プレイモードでプレイヤーがキーボード入力に応じて移動するか確認。
    • 必要に応じてmoveSpeedを調整。

4. GitHubへのコミットとプッシュ

  • 変更の確認:
    • GitHub Desktopで変更点を確認。
  • コミットメッセージ:
    • プレイヤー移動スクリプトの実装
  • コミットおよびプッシュ

5. 実践課題

  • プレイヤーアニメーションの追加:
    • デザイナーと連携し、アニメーションスプライトを設定。Animatorコンポーネントを追加し、移動時のアニメーションを実装。
  • コードレビュー:
    • プログラマーが他のメンバーのコードをレビューし、フィードバックを提供。

まとめ

2日目はプレイヤーキャラクターの実装に集中しました。プレイヤーの基本的な動作をスクリプトで制御し、実際に動くキャラクターをシーンに配置できました。次はコインの実装と収集メカニクスに取り組みます。


3日目:コインの実装と収集メカニクス

1. コインアートアセットの準備(デザイナー担当)

  • コインスプライトの作成:
    • 簡単なコインの2Dスプライトを作成し、Assets/Sprites/Coinに保存。

2. コインオブジェクトの設定(プログラマー担当)

  • コインプレハブの作成:
    • シーンにコインスプライトを配置し、Coinオブジェクトを作成。
    • CoinオブジェクトにCircle Collider 2DIs Triggerを設定。
    • CoinオブジェクトにタグCoinを設定。
    • プレハブとしてAssets/Prefabs/Coin.prefabに保存。
  • コインの配置:
    • MainSceneに複数のコインをランダムに配置。

3. コイン収集スクリプトの作成(プログラマー担当)

  • スクリプトの追加:
    • Assets/Scripts/Coin.csを作成。
  • Coin.csの内容:
   using UnityEngine;

   public class Coin : MonoBehaviour
   {
       void OnTriggerEnter2D(Collider2D other)
       {
           if (other.CompareTag("Player"))
           {
               GameManager.Instance.AddCoin();
               Destroy(gameObject);
           }
       }
   }
  1. GameManagerの作成:

Assets/Scripts/GameManager.csを作成。

GameManager.csの内容:

using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;
    public int coinCount = 0;
    public Text coinText;

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    public void AddCoin()
    {
        coinCount++;
        UpdateCoinUI();
    }

    void UpdateCoinUI()
    {
        if (coinText != null)
        {
            coinText.text = "Coins: " + coinCount;
        }
    }
}
  • GameManagerのシーンへの配置:
    • シーンに空のGameManagerオブジェクトを作成。
    • GameManagerスクリプトをアタッチ。
    • UIの実装で後述するコインテキストを割り当て。

4. UIの準備(UIデベロッパー担当)

  • コインカウント表示の作成:
    • Canvasを作成し、Textオブジェクトを追加。
    • テキストの位置を画面上部に配置。
    • テキストの初期値をCoins: 0に設定。
    • GameManagercoinTextにこのテキストをドラッグ&ドロップで割り当て。

5. テストと調整

  • コイン収集の動作確認:
    • プレイモードでプレイヤーがコインに接触すると、コインが消え、カウントが増えるか確認。

6. GitHubへのコミットとプッシュ

  • 変更の確認:
    • GitHub Desktopで変更点を確認。
  • コミットメッセージ:
    • コイン収集メカニクスの実装
  • コミットおよびプッシュ

7. 実践課題

  • コインのエフェクト追加:
    • コイン収集時に簡単なパーティクルエフェクトを追加。
  • タスクのドキュメント化:
    • 新しく追加した機能やスクリプトについて、READMEやWikiにドキュメントを追加。

まとめ

3日目はコインの実装と収集メカニクスを完成させました。プレイヤーがコインを収集することでスコアが増加し、UIに反映される仕組みを構築しました。次はユーザーインターフェースの強化とフィードバック機能の追加に取り組みます。


4日目:ユーザーインターフェース(UI)の実装

1. UIデザインの計画(UIデベロッパー担当)

  • UI要素の洗い出し:
    • コインカウント表示
    • ゲームクリアメッセージ
    • スタートボタン

2. UIの実装

a. コインカウント表示の改善

  • テキストのスタイリング:
    • フォントサイズ、色、位置を調整し、視認性を向上。

b. ゲームクリアメッセージの追加

  • ゲームクリアの条件設定:
    • 例えば、10コイン収集でゲームクリア。
  • スクリプトの更新:
    • GameManager.csにゲームクリアロジックを追加。
   public int coinsToWin = 10;
   public GameObject gameClearUI;

   public void AddCoin()
   {
       coinCount++;
       UpdateCoinUI();
       if (coinCount >= coinsToWin)
       {
           GameClear();
       }
   }

   void GameClear()
   {
       gameClearUI.SetActive(true);
       Time.timeScale = 0f; // ゲームを一時停止
   }
  • ゲームクリアUIの作成:
    • CanvasGameClearTextオブジェクトを追加。
    • テキストの内容を"Game Clear!"に設定。
    • GameClearTextを非表示に設定し、GameManagergameClearUIに割り当て。

c. スタートボタンの追加

  • スタートボタンの作成:
    • CanvasStartButtonを追加。
    • ボタンのテキストを"Start Game"に設定。
  • スクリプトの作成:
    • Assets/Scripts/UIManager.csを作成。
   using UnityEngine;
   using UnityEngine.SceneManagement;

   public class UIManager : MonoBehaviour
   {
       public void StartGame()
       {
           Time.timeScale = 1f;
           // 必要に応じてシーンをリロード
       }
   }
  • UIManagerの設定:
    • Canvasに空のUIManagerオブジェクトを作成し、スクリプトをアタッチ。
    • StartButtonOnClickイベントにUIManager.StartGameを割り当て。

3. テストと調整

  • ゲームクリアの動作確認:
    • プレイモードで10コインを収集し、ゲームクリアメッセージが表示されるか確認。
  • スタートボタンの動作確認:
    • ゲームクリア後にスタートボタンを押して、ゲームがリセットまたは再開するか確認。

4. GitHubへのコミットとプッシュ

  • 変更の確認:
    • GitHub Desktopで変更点を確認。
  • コミットメッセージ:
    • UI要素とゲームクリアロジックの実装
  • コミットおよびプッシュ

5. 実践課題

  • 追加のUIフィードバック:
    • コイン収集時にカウントアップアニメーションを追加。
  • UIのレスポンシブデザイン:
    • 異なる画面サイズに対応するため、UIのレイアウトを調整。

まとめ

4日目はユーザーインターフェースの実装と強化に集中しました。コインカウントの視認性を高め、ゲームクリアのフィードバックを提供することで、ユーザー体験を向上させました。次はサウンドとフィードバック機能の追加に取り組みます。


5日目:サウンドとフィードバックの追加

1. サウンドアセットの準備(サウンドエンジニア担当)

  • 効果音の選定:
    • コイン収集時のサウンド(例: coin_collect.wav
    • ゲームクリア時のサウンド(例: game_clear.wav
  • BGMの選定:
    • ゲーム全体の雰囲気に合ったBGM(例: background_music.mp3
  • アセットのインポート:
    • Assets/Audioフォルダを作成し、サウンドファイルをインポート。

2. サウンドの実装

a. コイン収集サウンドの追加(プログラマー担当)

  • AudioSourceの追加:
    • CoinプレハブにAudioSourceコンポーネントを追加。
    • coin_collect.wavを割り当て、Play On Awakeをオフに設定。
  • スクリプトの更新:
    • Coin.csにサウンド再生ロジックを追加。
   public AudioClip collectSound;
   private AudioSource audioSource;

   void Start()
   {
       audioSource = GetComponent<AudioSource>();
   }

   void OnTriggerEnter2D(Collider2D other)
   {
       if (other.CompareTag("Player"))
       {
           GameManager.Instance.AddCoin();
           audioSource.PlayOneShot(collectSound);
           Destroy(gameObject, collectSound.length);
       }
   }
  • サウンドの割り当て:
    • CoinプレハブのcollectSoundcoin_collect.wavを割り当て。

b. ゲームクリアサウンドの追加(プログラマー担当)

  • GameManagerへのAudioSource追加:
    • GameManagerオブジェクトにAudioSourceコンポーネントを追加。
    • game_clear.wavを割り当て、Play On Awakeをオフに設定。
  • スクリプトの更新:
    • GameManager.csGameClearメソッドにサウンド再生を追加。
   public AudioClip gameClearSound;
   private AudioSource audioSource;

   void Awake()
   {
       if (Instance == null)
       {
           Instance = this;
           DontDestroyOnLoad(gameObject);
       }
       else
       {
           Destroy(gameObject);
       }

       audioSource = GetComponent<AudioSource>();
   }

   void GameClear()
   {
       gameClearUI.SetActive(true);
       audioSource.PlayOneShot(gameClearSound);
       Time.timeScale = 0f; // ゲームを一時停止
   }
  • サウンドの割り当て:
    • GameManagergameClearSoundgame_clear.wavを割り当て。

c. BGMの追加(サウンドエンジニア担当)

  • BGMオブジェクトの作成:
    • シーンに空のGameObjectを作成し、BGMと命名。
    • AudioSourceコンポーネントを追加し、background_music.mp3を割り当て。
    • Loopをオンに設定し、Play On Awakeをオンに設定。

3. ビジュアルフィードバックの追加

a. コイン収集時のパーティクルエフェクト(プログラマー担当)

  • パーティクルシステムの作成:
    • Assets/Prefabsに新規パーティクルプレハブCoinCollectEffect.prefabを作成。
    • 簡単なパーティクルエフェクトを設定。
  • スクリプトの更新:
    • Coin.csにパーティクル再生ロジックを追加。
   public GameObject collectEffect;

   void OnTriggerEnter2D(Collider2D other)
   {
       if (other.CompareTag("Player"))
       {
           GameManager.Instance.AddCoin();
           audioSource.PlayOneShot(collectSound);
           Instantiate(collectEffect, transform.position, Quaternion.identity);
           Destroy(gameObject, collectSound.length);
       }
   }
  • エフェクトの割り当て:
    • CoinプレハブのcollectEffectCoinCollectEffect.prefabを割り当て。

4. テストと調整

  • サウンドとエフェクトの確認:
    • プレイモードでコイン収集時にサウンドとエフェクトが正しく再生されるか確認。
    • ゲームクリア時のサウンドが再生されるか確認。

5. GitHubへのコミットとプッシュ

  • 変更の確認:
    • GitHub Desktopで変更点を確認。
  • コミットメッセージ:
    • サウンドエフェクトとビジュアルフィードバックの追加
  • コミットおよびプッシュ

6. 実践課題

  • 追加のサウンドエフェクト:
    • プレイヤーの移動時やジャンプ時のサウンドを追加。
  • サウンド設定の最適化:
    • 各AudioSourceの音量やピッチを調整し、バランスを整える。

まとめ

5日目はサウンドとビジュアルフィードバックの追加により、ゲームの没入感とユーザー体験を向上させました。効果音やBGM、パーティクルエフェクトを適切に配置することで、ゲームプレイがより魅力的になりました。最終日はプロジェクトの最終統合とビルドに取り組みます。


6日目:最終統合とビルド

1. 機能の最終統合

a. ブランチのマージ(全員)

  • 各メンバーのブランチ確認:
    • 各メンバーが作業していたブランチをmainにマージ。
  • プルリクエストの作成とレビュー:
    • 各メンバーが自分のブランチからmainへのプルリクエストを作成。
    • 他のメンバーがコードレビューを実施し、承認後にマージ。

b. コンフリクトの解消

  • コンフリクトが発生した場合:
    • チームで話し合い、優先度の高い変更を維持。
    • 必要に応じてコードの調整を行い、再度プルリクエストを作成。

2. パフォーマンスの最終最適化

  • 不要なアセットの削除:
    • 使用していないスプライトやオーディオファイルを削除。
  • ビルドサイズの確認:
    • File > Build Settingsでビルドサイズを確認し、最適化。
  • プロファイリング:
    • Window > Analysis > Profilerを使用し、ランタイムパフォーマンスをチェック。
    • ボトルネックとなる部分を特定し、最適化。

3. 最終ビルドとデプロイ

a. ビルド設定の確認

  1. プラットフォームの選択:
    • Build Settingsでターゲットプラットフォーム(例: Windows、Mac)を選択。
    • 必要な場合はプラットフォームをインストール。
  2. シーンの追加:
    • Scenes In BuildMainSceneを追加。

b. ビルドの実行

  1. ビルドの作成:
    • Buildボタンをクリックし、ビルドフォルダを指定。
    • ビルドプロセスが完了するまで待機。
  2. ビルドのテスト:
    • 生成された実行ファイルを起動し、全機能が正常に動作するか確認。

c. デプロイと共有

ビルド成果物の共有: GitHubのリリース機能を使用して、ビルド成果物を共有します。以下の手順でリリースを作成し、ビルドファイルをアップロードします。

  1. リリースの作成:
    • GitHubリポジトリのページにアクセスします。
    • 上部のメニューから「Releases」を選択し、「Draft a new release」ボタンをクリックします。
  2. リリース情報の入力:
    • タグバージョンv1.0.0など、適切なバージョン番号を入力します。
    • リリースタイトル初回リリースなど、リリースのタイトルを入力します。
    • 説明: リリースの内容や変更点を記載します。
  3. ビルドファイルのアップロード:
    • 「Attach binaries by dragging & dropping」セクションに、生成したビルドファイル(例: CoinCollector.exe)をドラッグ&ドロップしてアップロードします。
  4. リリースの公開:
    • 設定が完了したら、「Publish release」ボタンをクリックしてリリースを公開します。

外部への公開(オプション): 必要に応じて、Itch.ioや他のプラットフォームで公開します。ただし、チーム内での共有や簡単な配布にはGitHubリリース機能が便利です。

4. プロジェクトの振り返りとフィードバック

a. 振り返りミーティング

  • 成功点の共有:
    • チーム全員でプロジェクトの成功点を共有。
  • 改善点の検討:
    • 開発プロセスやツール使用における改善点を話し合い。

b. フィードバックの収集

  • 個別フィードバックの提供:
    • 各メンバーが他のメンバーに対するフィードバックを提供。
  • ドキュメントの更新:
    • 振り返りの内容をREADMEやWikiに反映。

5. 今後の学習とプロジェクトの展望

  • 継続的な学習計画:
    • 新しい技術やツールの習得計画を立てる(例: アニメーション、AI、ネットワーキング)。
  • 次のプロジェクトの計画:
    • 今回の経験を基に、より複雑なプロジェクトに挑戦する計画を立てる。

6. 実践課題

  • 最終ビルドの最適化:
    • ビルドサイズやパフォーマンスを更に最適化。
  • ドキュメントの完成:
    • プロジェクトの全体像、使用技術、学んだことをドキュメント化。

まとめ

6日目はプロジェクトの最終統合とビルド、振り返りとフィードバックの時間を設けました。チーム全員が協力し合い、完成度の高いゲームを仕上げることができました。これにより、実践的なチーム開発の経験とスキルを大きく向上させることができました。


まとめ

この6日間のチュートリアルを通じて、Git、Unity、C#の基礎を3か月学習した中級者が、具体的なサンプルプロジェクト「Coin Collector」を通じて、実践的なチーム開発スキルを習得しました。プロジェクトのセットアップから最終ビルドまで、各役割を担いながら協力して進めることで、効率的かつ効果的な開発プロセスを体験できました。

継続的な学習と実践を通じて、さらなるスキルアップを目指してください。次のプロジェクトでは、より高度な機能や技術を取り入れ、チーム開発の幅を広げていきましょう。


参考資料


頑張ってください!チーム開発は協力とコミュニケーションが鍵です。各メンバーが自分の役割を果たし、共通の目標に向かって協力し合うことで、素晴らしいプロジェクトを完成させることができます。

C#,Unity,チーム開発

Posted by hidepon