恋愛シミュレーションゲームでは、好感度管理と会話システムがゲーム体験の質を大きく左右します。
「会話は表示できたが、分岐管理が複雑になった」
「好感度の増減ルールが曖昧で、ゲームバランスが崩れる」
このような悩みに直面しやすいジャンルでもあります。
恋愛シミュレーションでは、選択肢ひとつで関係性が変化し、その積み重ねがエンディングへつながる設計が不可欠です。
この記事では、Unity(C#)を使って、実際にゲームで使える恋愛シミュレーション向けの会話・好感度・分岐システムを、実装例付きで解説します。
✨ この記事でわかること
- キャラクターごとに管理できる好感度システムの実装方法
- 選択肢によって分岐する会話システムの基本構造
- 好感度条件によるイベント分岐の考え方
- エンディング分岐を実装するための設計例
- 実際のゲーム制作を想定したコード例

選択肢・好感度・分岐を一貫した仕組みとして実装することが重要です。
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 |
using UnityEngine; using System.Collections.Generic; [System.Serializable] public class RomanceAffectionData { public string characterName; public int affection = 0; // 好感度(0〜100) public int trust = 0; // 信頼度(0〜100) public int intimacy = 0; // 親密度(0〜100) public int GetTotalAffection() { return affection + trust + intimacy; } public RelationshipLevel GetRelationshipLevel() { int total = GetTotalAffection(); if (total >= 240) return RelationshipLevel.Lover; else if (total >= 180) return RelationshipLevel.Close; else if (total >= 120) return RelationshipLevel.Friend; else if (total >= 60) return RelationshipLevel.Acquaintance; else return RelationshipLevel.Stranger; } } public class RomanceAffectionManager : MonoBehaviour { private Dictionary<string, RomanceAffectionData> affectionData = new Dictionary<string, RomanceAffectionData>(); public void ChangeAffection(string characterName, AffectionChange change) { if (!affectionData.ContainsKey(characterName)) { affectionData[characterName] = new RomanceAffectionData { characterName = characterName }; } RomanceAffectionData data = affectionData[characterName]; data.affection = Mathf.Clamp(data.affection + change.affectionChange, 0, 100); data.trust = Mathf.Clamp(data.trust + change.trustChange, 0, 100); data.intimacy = Mathf.Clamp(data.intimacy + change.intimacyChange, 0, 100); } public RomanceAffectionData GetAffectionData(string characterName) { if (!affectionData.ContainsKey(characterName)) { affectionData[characterName] = new RomanceAffectionData { characterName = characterName }; } return affectionData[characterName]; } } |
このコードでは、キャラクターごとに好感度・信頼度・親密度を個別に管理できます。
会話やイベントの選択結果に応じて各数値を変化させることで、単なる数値ではなく、段階的な関係性の変化を表現できます。
3つの値の合計から関係性レベルを判定し、イベント分岐やエンディング条件として利用します。
この仕組みが、会話・イベント・エンディングをつなぐ基盤になります。
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
using UnityEngine; using System.Collections.Generic; [System.Serializable] public class DialogueNode { public string nodeID; public string speakerName; public string dialogueText; public List<DialogueChoice> choices = new List<DialogueChoice>(); public string nextNodeID; // 選択肢がない場合 } [System.Serializable] public class DialogueChoice { public string choiceText; public AffectionChange affectionChange; public string nextNodeID; } public class DialogueSystem : MonoBehaviour { public RomanceAffectionManager affectionManager; public Dictionary<string, DialogueNode> dialogueNodes = new Dictionary<string, DialogueNode>(); private string currentNodeID; private string currentCharacterName; public void StartDialogue(string characterName, string startNodeID) { currentCharacterName = characterName; currentNodeID = startNodeID; ShowDialogue(); } void ShowDialogue() { if (!dialogueNodes.ContainsKey(currentNodeID)) { Debug.LogError($"Dialogue node not found: {currentNodeID}"); return; } DialogueNode node = dialogueNodes[currentNodeID]; // 会話を表示 DisplayDialogue(node); // 選択肢を表示 if (node.choices.Count > 0) { DisplayChoices(node.choices); } else { // 選択肢がない場合は自動で次へ MoveToNextNode(node.nextNodeID); } } public void OnChoiceSelected(int choiceIndex) { if (!dialogueNodes.ContainsKey(currentNodeID)) return; DialogueNode node = dialogueNodes[currentNodeID]; if (choiceIndex >= node.choices.Count) return; DialogueChoice choice = node.choices[choiceIndex]; // 好感度を変更 affectionManager.ChangeAffection(currentCharacterName, choice.affectionChange); // 次のノードへ MoveToNextNode(choice.nextNodeID); } void MoveToNextNode(string nextNodeID) { if (string.IsNullOrEmpty(nextNodeID)) { EndDialogue(); return; } currentNodeID = nextNodeID; ShowDialogue(); } void DisplayDialogue(DialogueNode node) { // 会話を表示 // 実装は省略 } void DisplayChoices(List<DialogueChoice> choices) { // 選択肢を表示 // 実装は省略 } void EndDialogue() { currentNodeID = null; currentCharacterName = null; } } |
このコードで、会話選択肢システムが実装できます。
選択肢に応じて、好感度が変化し、会話が分岐します。

会話システムは、選択肢の数が重要です。3〜4択が標準です。多すぎると、選択が難しくなります。
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 |
using UnityEngine; using System.Collections.Generic; [System.Serializable] public class RomanceEvent { public string eventID; public string eventTitle; public string eventDescription; public AffectionCondition condition; public List<EventChoice> choices = new List<EventChoice>(); } [System.Serializable] public class AffectionCondition { public int minAffection = 0; public int maxAffection = 100; public RelationshipLevel minLevel = RelationshipLevel.Stranger; } public class RomanceEventSystem : MonoBehaviour { public RomanceAffectionManager affectionManager; public List<RomanceEvent> allEvents = new List<RomanceEvent>(); public List<RomanceEvent> GetAvailableEvents(string characterName) { List<RomanceEvent> availableEvents = new List<RomanceEvent>(); RomanceAffectionData data = affectionManager.GetAffectionData(characterName); foreach (var evt in allEvents) { if (CheckEventCondition(data, evt.condition)) { availableEvents.Add(evt); } } return availableEvents; } bool CheckEventCondition(RomanceAffectionData data, AffectionCondition condition) { if (data.affection < condition.minAffection) return false; if (data.affection > condition.maxAffection) return false; if (data.GetRelationshipLevel() < condition.minLevel) return false; return true; } public void TriggerEvent(string characterName, RomanceEvent evt) { // イベントを発生 // 実装は省略 } } |
このコードで、イベント分岐システムが実装できます。
好感度と関係性レベルに応じて、発生するイベントが変わります。
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 60 61 |
using UnityEngine; using System.Collections.Generic; public enum RomanceEndingType { Good, // 良いエンディング Normal, // 普通のエンディング Bad, // 悪いエンディング True // 真エンディング } [System.Serializable] public class RomanceEndingCondition { public RomanceEndingType endingType; public string endingName; public string endingDescription; public List<AffectionCondition> characterConditions = new List<AffectionCondition>(); } public class RomanceEndingSystem : MonoBehaviour { public RomanceAffectionManager affectionManager; public List<RomanceEndingCondition> endingConditions = new List<RomanceEndingCondition>(); public RomanceEndingType DetermineEnding() { foreach (var ending in endingConditions) { if (CheckEndingCondition(ending)) { return ending.endingType; } } return RomanceEndingType.Normal; } bool CheckEndingCondition(RomanceEndingCondition ending) { foreach (var condition in ending.characterConditions) { // 全キャラクターの条件をチェック // 実装は省略 } return true; } public void ShowEnding(RomanceEndingType endingType) { RomanceEndingCondition ending = endingConditions.Find(e => e.endingType == endingType); if (ending != null) { Debug.Log($"エンディング:{ending.endingName}"); // エンディングを表示 } } } |
このコードで、エンディング分岐システムが実装できます。
好感度の組み合わせで、エンディングが決まります。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実装例:完全な恋愛シミュレーションシステム

ここまで紹介してきた各システムを組み合わせることで、実際のゲームとして動作する恋愛シミュレーションを構築できます。
この実装例は、好感度管理・会話分岐・イベント発生・エンディング判定を1つの管理クラスから制御するシンプルな構成になっています。
|
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 |
using UnityEngine; public class CompleteRomanceSimSystem : MonoBehaviour { [Header("システム")] public RomanceAffectionManager affectionManager; public DialogueSystem dialogueSystem; public RomanceEventSystem eventSystem; public RomanceEndingSystem endingSystem; public void StartConversation(string characterName, string startNodeID) { dialogueSystem.StartDialogue(characterName, startNodeID); } public void CheckEvents(string characterName) { List<RomanceEvent> availableEvents = eventSystem.GetAvailableEvents(characterName); if (availableEvents.Count > 0) { // ランダムにイベントを選択 RomanceEvent selectedEvent = availableEvents[Random.Range(0, availableEvents.Count)]; eventSystem.TriggerEvent(characterName, selectedEvent); } } public void CheckEnding() { RomanceEndingType ending = endingSystem.DetermineEnding(); endingSystem.ShowEnding(ending); } } |
このクラスは、ゲーム全体の流れをまとめるハブ(司令塔)の役割を担います。
この実装例で実現できるゲーム進行の流れ
このシステムを使うことで、恋愛シミュレーションに必要な一連の流れを自然に構築できます。
会話開始時には StartConversation() を呼び出し、プレイヤーの選択によって好感度が変化します。
一定の条件を満たすと CheckEvents() によりイベントが発生し、物語に変化を与えながら関係性が深まっていきます。
ゲーム終盤では CheckEnding() を実行し、それまでの選択と好感度の積み重ねに応じたエンディングが決定されます。
初心者がつまずきやすいポイント
この構成はシンプルですが、実装時に混乱しやすい点もあります。
特に多いのが、「どのタイミングでイベント判定やエンディング判定を行うのか」が曖昧になるケースです。
まずは、
- 会話終了後にイベント判定を行う
- ゲーム最終日にエンディング判定を行う
など、判定タイミングを固定して実装するのがおすすめです。
この実装例をベースにした応用アイデア
このシステムは、拡張しやすい設計になっています。
たとえば、
- キャラクターごとに個別のエンディング条件を追加する
- イベント発生をランダムではなく優先度順にする
- 好感度の増減量を難易度別に調整する
といった発展も容易です。
まずはこの形で一度ゲームを完成させ、そこから少しずつ自分なりの要素を足していくと、理解が一気に深まります。

好感度管理・会話・イベント・エンディングを統合することで、「遊べる恋愛シミュレーション」が完成します。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

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

恋愛シミュレーションは、会話システムが核心です。
選択肢に応じて、好感度が変化する仕組みを実装しましょう。
✅ 今日から始める3ステップ
- ステップ1:好感度管理システムを実装する(所要2時間)
- ステップ2:会話選択肢システムを実装する(所要3時間)
- ステップ3:エンディング分岐システムを実装する(所要2時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント