Unityチーム開発チュートリアル:シンプルなサンプルプロジェクトの技術資料
この技術資料では、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からクローン
- GitHub Desktopを開きます。
- メニューから「Clone a repository from the Internet」を選択します。
- リストから
CoinCollector
リポジトリを選択します。 - ローカルパスを指定して「Clone」ボタンをクリックします。
- 方法2: GitHubウェブサイトからクローン
- GitHubウェブサイトで
CoinCollector
リポジトリのページに移動します。 - 緑色の「Code」ボタンをクリックします。
- ドロップダウンメニューから「Open with GitHub Desktop」を選択します。
- GitHub Desktopが自動的に開き、クローン先のローカルパスを確認後、「Clone」ボタンをクリックします。
- GitHubウェブサイトで
- 方法1: GitHub Desktopからクローン
以上の手順で、CoinCollector
リポジトリをローカル環境にクローンすることができます。チームメンバーはこれらの方法を利用してリポジトリにアクセスし、プロジェクトの開発を開始できます。
2. チーム構成と役割分担
- 役割の明確化:
- 各メンバーの役割を再確認し、具体的なタスクを割り当てる。
- コミュニケーションツールの設定:今回は使いません
- Slack/Discordのチャンネル作成:
- #general: 一般連絡
- #development: 開発関連
- #design: デザイン関連
- #sound: サウンド関連
- Slack/Discordのチャンネル作成:
3. タスク管理の設定
- GitHub Projectsの作成:オプション
- プロジェクトボード名:
CoinCollector Development
- カンバンボードを設定し、To Do、In Progress、Doneのカラムを作成。
- プロジェクトボード名:
- 初期タスクの追加:
- 各メンバーに対して初期タスクを作成し、担当を割り当てる。
4. 実践課題
- リポジトリのクローンとセットアップ確認:
- 全メンバーがリポジトリをクローンし、Unityプロジェクトを開いて正しくセットアップできていることを確認。
- READMEの更新:
- プロジェクト概要、チームメンバーの役割、初期タスクをREADME.mdに記載。
まとめ
初日はプロジェクトのセットアップとチームの役割分担、コミュニケーションとタスク管理の準備を行いました。これにより、チーム全体が統一された環境で効率的に開発を進める基盤が整いました。明日はプレイヤーキャラクターの実装に取り組みます。
2日目:プレイヤーの実装
1. プレイヤーキャラクターの作成
a. アートアセットの準備(デザイナー担当)
- キャラクタースプライトの作成:
- 簡単な2Dキャラクターのスプライトを作成し、
Assets/Sprites/Player
に保存。
- 簡単な2Dキャラクターのスプライトを作成し、
- アニメーションの準備:
- 移動アニメーション用のスプライトシートを作成。
b. プレイヤーオブジェクトの設定(プログラマー担当)
- シーンの準備:
MainScene
を作成し、保存。
- プレイヤーオブジェクトの追加:
GameObject > 2D Object > Sprite
で新規スプライトを作成。- 名前を
Player
に変更。 - デザイナーから提供されたスプライトを割り当て。
- コライダーとリジッドボディの追加:
Player
オブジェクトにBox Collider 2D
とRigidbody 2D
を追加。- Rigidbody 2Dの
Body Type
をDynamic
に設定。
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
に保存。
- 簡単なコインの2Dスプライトを作成し、
2. コインオブジェクトの設定(プログラマー担当)
- コインプレハブの作成:
- シーンにコインスプライトを配置し、
Coin
オブジェクトを作成。 Coin
オブジェクトにCircle Collider 2D
とIs 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);
}
}
}
- 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
に設定。 GameManager
のcoinText
にこのテキストをドラッグ&ドロップで割り当て。
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の作成:
Canvas
にGameClearText
オブジェクトを追加。- テキストの内容を
"Game Clear!"
に設定。 GameClearText
を非表示に設定し、GameManager
のgameClearUI
に割り当て。
c. スタートボタンの追加
- スタートボタンの作成:
Canvas
にStartButton
を追加。- ボタンのテキストを
"Start Game"
に設定。
- スクリプトの作成:
Assets/Scripts/UIManager.cs
を作成。
using UnityEngine;
using UnityEngine.SceneManagement;
public class UIManager : MonoBehaviour
{
public void StartGame()
{
Time.timeScale = 1f;
// 必要に応じてシーンをリロード
}
}
- UIManagerの設定:
Canvas
に空のUIManager
オブジェクトを作成し、スクリプトをアタッチ。StartButton
のOnClick
イベントに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
)
- ゲーム全体の雰囲気に合ったBGM(例:
- アセットのインポート:
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
プレハブのcollectSound
にcoin_collect.wav
を割り当て。
b. ゲームクリアサウンドの追加(プログラマー担当)
- GameManagerへのAudioSource追加:
GameManager
オブジェクトにAudioSource
コンポーネントを追加。game_clear.wav
を割り当て、Play On Awake
をオフに設定。
- スクリプトの更新:
GameManager.cs
のGameClear
メソッドにサウンド再生を追加。
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; // ゲームを一時停止
}
- サウンドの割り当て:
GameManager
のgameClearSound
にgame_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
プレハブのcollectEffect
にCoinCollectEffect.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. ビルド設定の確認
- プラットフォームの選択:
Build Settings
でターゲットプラットフォーム(例: Windows、Mac)を選択。- 必要な場合はプラットフォームをインストール。
- シーンの追加:
Scenes In Build
にMainScene
を追加。
b. ビルドの実行
- ビルドの作成:
Build
ボタンをクリックし、ビルドフォルダを指定。- ビルドプロセスが完了するまで待機。
- ビルドのテスト:
- 生成された実行ファイルを起動し、全機能が正常に動作するか確認。
c. デプロイと共有
ビルド成果物の共有: GitHubのリリース機能を使用して、ビルド成果物を共有します。以下の手順でリリースを作成し、ビルドファイルをアップロードします。
- リリースの作成:
- GitHubリポジトリのページにアクセスします。
- 上部のメニューから「Releases」を選択し、「Draft a new release」ボタンをクリックします。
- リリース情報の入力:
- タグバージョン:
v1.0.0
など、適切なバージョン番号を入力します。 - リリースタイトル:
初回リリース
など、リリースのタイトルを入力します。 - 説明: リリースの内容や変更点を記載します。
- タグバージョン:
- ビルドファイルのアップロード:
- 「Attach binaries by dragging & dropping」セクションに、生成したビルドファイル(例:
CoinCollector.exe
)をドラッグ&ドロップしてアップロードします。
- 「Attach binaries by dragging & dropping」セクションに、生成したビルドファイル(例:
- リリースの公開:
- 設定が完了したら、「Publish release」ボタンをクリックしてリリースを公開します。
外部への公開(オプション): 必要に応じて、Itch.ioや他のプラットフォームで公開します。ただし、チーム内での共有や簡単な配布にはGitHubリリース機能が便利です。
4. プロジェクトの振り返りとフィードバック
a. 振り返りミーティング
- 成功点の共有:
- チーム全員でプロジェクトの成功点を共有。
- 改善点の検討:
- 開発プロセスやツール使用における改善点を話し合い。
b. フィードバックの収集
- 個別フィードバックの提供:
- 各メンバーが他のメンバーに対するフィードバックを提供。
- ドキュメントの更新:
- 振り返りの内容をREADMEやWikiに反映。
5. 今後の学習とプロジェクトの展望
- 継続的な学習計画:
- 新しい技術やツールの習得計画を立てる(例: アニメーション、AI、ネットワーキング)。
- 次のプロジェクトの計画:
- 今回の経験を基に、より複雑なプロジェクトに挑戦する計画を立てる。
6. 実践課題
- 最終ビルドの最適化:
- ビルドサイズやパフォーマンスを更に最適化。
- ドキュメントの完成:
- プロジェクトの全体像、使用技術、学んだことをドキュメント化。
まとめ
6日目はプロジェクトの最終統合とビルド、振り返りとフィードバックの時間を設けました。チーム全員が協力し合い、完成度の高いゲームを仕上げることができました。これにより、実践的なチーム開発の経験とスキルを大きく向上させることができました。
まとめ
この6日間のチュートリアルを通じて、Git、Unity、C#の基礎を3か月学習した中級者が、具体的なサンプルプロジェクト「Coin Collector」を通じて、実践的なチーム開発スキルを習得しました。プロジェクトのセットアップから最終ビルドまで、各役割を担いながら協力して進めることで、効率的かつ効果的な開発プロセスを体験できました。
継続的な学習と実践を通じて、さらなるスキルアップを目指してください。次のプロジェクトでは、より高度な機能や技術を取り入れ、チーム開発の幅を広げていきましょう。
参考資料
- Unity公式チュートリアル
- GitHub Desktopガイド
- GitHub ActionsによるCI/CD
- Unityのバージョン管理
- GitHub Flow
- Git Flow
- Unity Test Framework
- C#プログラミングガイド
- アドレス可能アセット
頑張ってください!チーム開発は協力とコミュニケーションが鍵です。各メンバーが自分の役割を果たし、共通の目標に向かって協力し合うことで、素晴らしいプロジェクトを完成させることができます。
ディスカッション
コメント一覧
まだ、コメントがありません