スケジュール管理は、育成ゲームにおける中核となるシステムです。
「どの曜日・どの時間帯に、どの行動を配置するか」という設計は、プレイヤーの選択そのものを戦略に変えます。
単なる行動選択ではなく、時間の使い方そのものがゲーム体験を左右する点が、育成ゲーム特有の面白さです。
本記事では、Unity(C#)を用いた育成ゲームを想定し、週単位のスケジュール管理と時間経過による行動実行をどのように実装するかを、具体的なコード例とともに解説します。
この記事でわかること
- 週・時間帯を軸にしたスケジュール選択システムの実装方法
- 育成ゲームに適したスケジュールUI構成の考え方
- スケジュール管理を支える内部データ構造の設計
- 行動実行によるステータス変化の仕組み
- 実際に組み合わせて使える実装例とコード

本記事では、両者をセットで設計・実装する流れを整理しています。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
スケジュール選択システムの実装

スケジュール選択は、週単位で行動を決めます。
実装方法を紹介します。
スケジュールデータの構造
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
using UnityEngine; using System.Collections.Generic; public enum DayOfWeek { Monday, // 月曜日 Tuesday, // 火曜日 Wednesday, // 水曜日 Thursday, // 木曜日 Friday, // 金曜日 Saturday, // 土曜日 Sunday // 日曜日 } public enum TimeSlot { Morning, // 朝 Afternoon, // 昼 Evening // 夕方 } [System.Serializable] public class ScheduleEntry { public DayOfWeek day; public TimeSlot timeSlot; public TrainingAction action; public bool isLocked = false; } [System.Serializable] public class WeeklySchedule { public List<ScheduleEntry> entries = new List<ScheduleEntry>(); public ScheduleEntry GetEntry(DayOfWeek day, TimeSlot time) { return entries.Find(e => e.day == day && e.timeSlot == time); } public void SetEntry(DayOfWeek day, TimeSlot time, TrainingAction action) { ScheduleEntry entry = GetEntry(day, time); if (entry != null) { entry.action = action; } else { entries.Add(new ScheduleEntry { day = day, timeSlot = time, action = action }); } } } public class ScheduleManager : MonoBehaviour { public WeeklySchedule currentSchedule = new WeeklySchedule(); public int currentWeek = 1; public DayOfWeek currentDay = DayOfWeek.Monday; public TimeSlot currentTime = TimeSlot.Morning; public void SetSchedule(DayOfWeek day, TimeSlot time, TrainingAction action) { currentSchedule.SetEntry(day, time, action); } public void ExecuteSchedule() { ScheduleEntry entry = currentSchedule.GetEntry(currentDay, currentTime); if (entry != null && entry.action != null) { GetComponent<CharacterTraining>().ExecuteTraining(entry.action); } } } |
このコードで、スケジュール選択システムが実装できます。
週単位で行動を設定し、時間が進むと自動で実行されます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
UI構成の設計

UI構成は、使いやすさを決めます。
設計方法を紹介します。
スケジュールUIのレイアウト
- 週間カレンダー:月〜日曜日を横に並べる
- 時間帯タブ:朝・昼・夕のタブで切り替え
- 行動選択ボタン:各スロットに行動を設定
- プレビュー表示:選択した行動の効果を表示
UI実装の例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
using UnityEngine; using UnityEngine.UI; public class ScheduleUI : MonoBehaviour { public ScheduleManager scheduleManager; public GameObject scheduleSlotPrefab; public Transform scheduleGrid; public List<TrainingAction> availableActions = new List<TrainingAction>(); void Start() { CreateScheduleUI(); } void CreateScheduleUI() { // 週間カレンダーを作成 foreach (DayOfWeek day in System.Enum.GetValues(typeof(DayOfWeek))) { foreach (TimeSlot time in System.Enum.GetValues(typeof(TimeSlot))) { GameObject slot = Instantiate(scheduleSlotPrefab, scheduleGrid); ScheduleSlotUI slotUI = slot.GetComponent<ScheduleSlotUI>(); slotUI.Initialize(day, time, this); } } } public void OnSlotClicked(DayOfWeek day, TimeSlot time) { // 行動選択UIを表示 ShowActionSelectionUI(day, time); } void ShowActionSelectionUI(DayOfWeek day, TimeSlot time) { // 行動選択UIを表示 // 実装は省略 } public void OnActionSelected(DayOfWeek day, TimeSlot time, TrainingAction action) { scheduleManager.SetSchedule(day, time, action); UpdateScheduleUI(); } void UpdateScheduleUI() { // UIを更新 // 実装は省略 } } |
このコードで、スケジュールUIが実装できます。
週間カレンダーと行動選択UIを組み合わせます。

UIは、直感的に操作できることが大切です。ドラッグ&ドロップで行動を設定できると、使いやすくなります。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
内部データ構造の設計

内部データ構造は、効率的な管理が重要です。
設計方法を紹介します。
効率的なデータ構造
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
using System.Collections.Generic; public class OptimizedScheduleData { // 辞書で高速検索 private Dictionary<string, TrainingAction> scheduleDict = new Dictionary<string, TrainingAction>(); private string GetKey(DayOfWeek day, TimeSlot time) { return $"{day}_{time}"; } public void SetAction(DayOfWeek day, TimeSlot time, TrainingAction action) { string key = GetKey(day, time); scheduleDict[key] = action; } public TrainingAction GetAction(DayOfWeek day, TimeSlot time) { string key = GetKey(day, time); if (scheduleDict.ContainsKey(key)) { return scheduleDict[key]; } return null; } public void ClearSchedule() { scheduleDict.Clear(); } public List<ScheduleEntry> GetAllEntries() { List<ScheduleEntry> entries = new List<ScheduleEntry>(); foreach (var kvp in scheduleDict) { string[] parts = kvp.Key.Split('_'); DayOfWeek day = (DayOfWeek)System.Enum.Parse(typeof(DayOfWeek), parts[0]); TimeSlot time = (TimeSlot)System.Enum.Parse(typeof(TimeSlot), parts[1]); entries.Add(new ScheduleEntry { day = day, timeSlot = time, action = kvp.Value }); } return entries; } } |
このコードで、効率的なデータ構造が実装できます。
辞書を使うことで、高速に検索できます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
行動によるステータス変化の仕組み

行動によるステータス変化は、ゲームの核心です。
実装方法を紹介します。
行動データの定義
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
[CreateAssetMenu(fileName = "NewTrainingAction", menuName = "Game/Training Action")] public class TrainingAction : ScriptableObject { [Header("基本情報")] public string actionName; public string description; public Sprite actionIcon; [Header("ステータス変化")] public int strengthGain = 0; public int intelligenceGain = 0; public int charmGain = 0; public int staminaGain = 0; public int luckGain = 0; [Header("コスト")] public int staminaCost = 0; public int moneyCost = 0; [Header("条件")] public int requiredStrength = 0; public int requiredIntelligence = 0; public int requiredCharm = 0; public bool CanExecute(CharacterStats stats, int currentStamina, int currentMoney) { // ステータス条件チェック if (stats.strength < requiredStrength) return false; if (stats.intelligence < requiredIntelligence) return false; if (stats.charm < requiredCharm) return false; // コストチェック if (currentStamina < staminaCost) return false; if (currentMoney < moneyCost) return false; return true; } } |
このコードで、行動データが実装できます。
ScriptableObjectで管理すれば、デザイナーも編集できます。
ステータス変化の適用
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public class ActionExecutor : MonoBehaviour { public CharacterTraining characterTraining; public ResourceManager resourceManager; public bool ExecuteAction(TrainingAction action) { CharacterStats stats = characterTraining.stats; // 実行可能かチェック if (!action.CanExecute(stats, characterTraining.currentStamina, resourceManager.money)) { Debug.Log("行動を実行できません"); return false; } // コストを支払う characterTraining.currentStamina -= action.staminaCost; resourceManager.money -= action.moneyCost; // ステータスを成長 characterTraining.stats.strength += action.strengthGain; characterTraining.stats.intelligence += action.intelligenceGain; characterTraining.stats.charm += action.charmGain; characterTraining.stats.stamina += action.staminaGain; characterTraining.stats.luck += action.luckGain; // 派生ステータスを再計算 characterTraining.stats.CalculateDerivedStats(); return true; } } |
このコードで、行動によるステータス変化が実装できます。
コストを支払い、ステータスを成長させます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実装例:完全なスケジュール管理システム

実際に使える、完全なスケジュール管理システムの実装例を紹介します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
using UnityEngine; public class CompleteScheduleSystem : MonoBehaviour { [Header("システム")] public ScheduleManager scheduleManager; public ScheduleUI scheduleUI; public ActionExecutor actionExecutor; public CharacterTraining characterTraining; void Start() { InitializeSchedule(); } void InitializeSchedule() { // スケジュールを初期化 scheduleManager.currentSchedule = new WeeklySchedule(); scheduleManager.currentWeek = 1; scheduleManager.currentDay = DayOfWeek.Monday; } public void ProcessWeek() { // 1週間の処理 for (int day = 0; day < 7; day++) { ProcessDay((DayOfWeek)day); } scheduleManager.currentWeek++; } void ProcessDay(DayOfWeek day) { scheduleManager.currentDay = day; // 各時間帯を処理 foreach (TimeSlot time in System.Enum.GetValues(typeof(TimeSlot))) { scheduleManager.currentTime = time; scheduleManager.ExecuteSchedule(); } // 1日の終了処理 EndDay(); } void EndDay() { // スタミナを回復 characterTraining.currentStamina = Mathf.Min( characterTraining.currentStamina + 20, characterTraining.maxStamina ); } } |
このコードで、完全なスケジュール管理システムが実装できます。
スケジュール選択、UI、ステータス変化を統合しています。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

スケジュール管理は、UIとデータ構造の両方が重要です。
使いやすいUIを設計し、効率的なデータ構造を実装しましょう。
✅ 今日から始める3ステップ
- ステップ1:スケジュールデータ構造を実装する(所要2時間)
- ステップ2:スケジュールUIを実装する(所要3時間)
- ステップ3:行動によるステータス変化を実装する(所要2時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント