unity实现GalGame式的人物关系链
写在开头:我参加了2021 Global Gamejam全球游戏设计比赛
经过全员讨论最后决定根据主题《Lost and Found》做一个失物招领处的游戏。大概是小清新风格的
游戏大概玩法就是顾客过来陈述自己的想法,玩家给予顾客物品,顾客会根据获得的物品解锁不同的分支剧情。下图是关系链:
是的,树状结构是非常复杂的一种关系链,以及未来可能会出现非二叉树的情况
那么,正片开始:
**
人物关系链的树状结构如何建立舒适的数据结构:
**
首先我们的游戏关系是以物品建立联系的,即玩家根据顾客的需求选择自己的物品然后给予顾客,给的东西不一样会解锁不一样的分支。
举个例子,第一个顾客是小孩,你可以在相册和玩具中二选一 选择其中一个给顾客,如果给与相册则 会触发初恋的分支并且小孩会给你草戒指,,如果给玩具会触发青年的支线并且小孩会给你学生证。
对的,上述关系错综复杂。
--------- --------------- 小孩 ------------------ ----------
【相册】 ----------------------------【玩具】
初恋【草戒指】 --------------青年【学生证】
那么问题来了,如何很好的建立连接,并且要考虑到未来如果树不是只是二叉的情况呢?
首先为了方便识别顾客和物品的说明我们先定义NPC枚举类型和object物品枚举类型。
public enum object物品
{
相册=0,玩具,草戒指,结婚戒指,领带,学生证,练习册, 泫水密卷,NULL,领带结局, 结婚结局, 默认解决, 金榜题名
}
public enum NPC
{
小孩,青年,中年,初恋,End,高中生,初中生,NULL
}
然后我们需要知道一个关系链,下一个npc和玩家给与的物品和玩家获得的物品,这三个是一个绑定的关系
比如:
故,可以定义一个包含这三个数据的类
【这里咱们称这个类叫获得物品以及下一个NPC】,这样可以知道下一个npc所需要的所有信息。
public class 获得物品以及下一个NPC
{
public NPC NPC下一个 { get; private set; }
public object物品 Object玩家给允 { get; private set; }
public object物品 Object玩家获得 { get; private set; }
public 获得物品以及下一个NPC(object物品 玩家给允, NPC nPC,object物品 玩家获得)
{
Object玩家给允 = 玩家给允;
NPC下一个 = nPC ;
Object玩家获得 = 玩家获得;
}
}
如果要考虑多分支树的结构,即一个玩家可能有n个选择的物品的时候,那么存储玩家和下一个npc触发支线的关系可以用字典来存储。
因为我们可以轻松的获取到玩家给与的顾客的物品是什么,
所以将玩家给予的物品和 获得物品以及下一个NPC 类作为值键对。
public Dictionary<object物品,获得物品以及下一个NPC> Dic物品对应关系;
这样一个完整的玩家信息类就包括
{
玩家自身的名字
和n个关系链的字典。
和通过当前给与物品直接返回字典里面的下一个npc的所有数据的公共方法。
就能实现一句话建一个NPC了
}
public class NPCInformation
{
public NPC NPCName;
public Dictionary<object物品,获得物品以及下一个NPC> Dic物品对应关系;
public CustomerLogic customerLogic;
public NPCInformation(NPC npcName,List<获得物品以及下一个NPC> NPCs)
{
Dic物品对应关系 = new Dictionary<object物品, 获得物品以及下一个NPC>();
foreach(获得物品以及下一个NPC NPC in NPCs)
{
Dic物品对应关系.Add(NPC.Object玩家给允, NPC);
}
}
public 获得物品以及下一个NPC ShowResult(object物品 currentobject)
{
if(Dic物品对应关系.ContainsKey(currentobject))
return Dic物品对应关系[currentobject];
else
{
Debug.LogError("找不到此物品的分支");
return new 获得物品以及下一个NPC(currentobject,NPC.End,object物品.默认解决);
}
}
}
然后初始化的时候只需要一条语句就能添加一个npc
public static void InitNPCInformation()
{
NPCInformations.Clear();
//小孩
NPCInformations.Add(NPC.小孩,new NPCInformation(NPC.小孩,
Add获得物品以及下一个NPC(
new 获得物品以及下一个NPC(object物品.相册,NPC.初恋, object物品.草戒指)
, new 获得物品以及下一个NPC(object物品.玩具,NPC.青年, object物品.学生证))));
//初恋
NPCInformations.Add(NPC.初恋,new NPCInformation(NPC.初恋,
Add获得物品以及下一个NPC(
new 获得物品以及下一个NPC(object物品.草戒指, NPC.End, object物品.结婚结局)
, new 获得物品以及下一个NPC(object物品.玩具, NPC.青年, object物品.学生证))));
//青年
NPCInformations.Add(NPC.青年, new NPCInformation(NPC.青年,
Add获得物品以及下一个NPC(
new 获得物品以及下一个NPC(object物品.相册, NPC.中年, object物品.领带)
, new 获得物品以及下一个NPC(object物品.学生证, NPC.高中生, object物品.练习册))));
//中年
NPCInformations.Add(NPC.中年, new NPCInformation(NPC.中年,
Add获得物品以及下一个NPC(
new 获得物品以及下一个NPC(object物品.领带, NPC.End, object物品.领带结局)
, new 获得物品以及下一个NPC(object物品.学生证, NPC.高中生, object物品.练习册))));
//高中生
NPCInformations.Add(NPC.高中生, new NPCInformation(NPC.高中生,
Add获得物品以及下一个NPC(
new 获得物品以及下一个NPC(object物品.练习册, NPC.初中生, object物品.泫水密卷)
, new 获得物品以及下一个NPC(object物品.相册, NPC.初恋, object物品.草戒指))));
//初中年
NPCInformations.Add(NPC.初中生, new NPCInformation(NPC.初中生,
Add获得物品以及下一个NPC(
new 获得物品以及下一个NPC(object物品.相册, NPC.初恋, object物品.草戒指)
, new 获得物品以及下一个NPC(object物品.泫水密卷, NPC.End, object物品.金榜题名))));
}
最后说一下中英文适配的问题:
由于我们游戏的主要英文切换部分在于玩家的物品查看说明时显示的文字不一样,所以需要定义两个字典
public Dictionary<object物品, string> _物品中文说明;
public Dictionary<object物品, string> _物品英文说明;
来存放物品和说明的中英文,而其他的中英文其实是改变Image来切换所以没啥技术含量。哈哈哈
如果可以的话,非常希望读者可以试玩一下我做的
《Lost and Found》
源码链接:git