在这次模块的构建将基于 unity ui 组件 和 C#代码实现一个从excel 文件中按照相应规则读取数据并展示的逻辑。这套代码不仅能实现正常的对话,也实现了对话中可以通过选择不同选项达到不同效果的分支对话功能。
整一套代码分为分为两部分,一部分和库存模块一样通过 Collider 2D 和 Unity Event 构建了一个范围内可互动的功能,这一部分可以参考之前的库存模块。
从上图中,可以看出整个对话框可以分为五个部分:头像、说话人名字、普通对话内容、跳转到下一句的按钮、和 选择对话框。可以简单将 普通对话内容和跳转按钮 划分成一个逻辑组件,而选择对话框划分成另一个逻辑组件,这样划分的原因在于两者实现方式不一样。
整一个Excel的内容分为了五个部分,如下图所述,分别是、
对话的id,用来快速定位到一个对话类,可以方便我们进行查找和使用
说话人的名字,用来展示在 对话框中的UI组件
说话人的头像,也是用来展示在对话框中的 UI 和 名字不同的是他是代表一个文件的路径
对话内容,用来展示在 对话框中的UI组件
下一句对话id,用来做跳转使用
定义好具体数据的Excel之后,需要将Excel导出成Unity可以识别的编码格式,否则在Unity中会被识别成乱码(这一步可以通过 txt 文本另存为的方式进行变更)。将另存为的文本保存在unity 项目中的 Assets/Resources/Dialogue/路径下,以便项目能够读取到。
接下来,在C#中定义一个对应的class,用来接住Excel读取出的数据,并在C#中通过Resources.Load的方法来读取。Resoruces.Load的方法会将整个文本以 string的方式进行读取,所以还需要对每一行文本进行拆分,才能处理成我们需要的对话类。最终,将 对话 id 和 对话实体保存到一个 dictionary里,方便后面的步骤进行调用。
// 对话类
class Dialogue
public int dialogueId;
public string characterName;
public string characterIcon;
public string dialogue;
public List<int> toDialogueIdList;
public Dialogue(int dialogueId, string characterName, string characterIcon, string dialogue, List<int> toDialogueIdList)
this.dialogueId = dialogueId;
this.characterName = characterName;
this.characterIcon = characterIcon;
this.dialogue = dialogue;
this.toDialogueIdList = toDialogueIdList;
public void eventDialogueFileProcess(int eventId)
// 文件处理成 对话 id 和 对话对象 的映射
dialogueDictionary.Clear();
string filePath = dialogueFilePrefix + eventId;
TextAsset textFile = Resources.Load<TextAsset>(filePath);
processDialogueFile(textFile); }
private void processDialogueFile(TextAsset dialogueFile)
string[] dialogueArrays = dialogueFile.text.Split("\r\n");
foreach(string strDialogue in dialogueArrays)
if(string.IsNullOrEmpty(strDialogue))
continue;
string[] cols = strDialogue.Split(',');
string[] strToDialogueIds = cols[4].Split('|');
List<int> toDialogueIdList = new List<int>();
foreach(string strToDialogueId in strToDialogueIds)
if(string.IsNullOrEmpty(strToDialogueId))
break;
Debug.Log(strToDialogueId);
toDialogueIdList.Add(int.Parse(strToDialogueId));
Dialogue dialogue = new Dialogue(int.Parse(cols[0]), cols[1], cols[2], cols[3], toDialogueIdList);
dialogueDictionary.Add(dialogue.dialogueId, dialogue);