【Unity】2D 对话模块的实现

对话模块主要参考 【Unity教程】剧情对话系统 实现。

在这次模块的构建将基于 unity ui 组件 和 C#代码实现一个从excel 文件中按照相应规则读取数据并展示的逻辑。这套代码不仅能实现正常的对话,也实现了对话中可以通过选择不同选项达到不同效果的分支对话功能。

整一套代码分为分为两部分,一部分和库存模块一样通过 Collider 2D 和 Unity Event 构建了一个范围内可互动的功能,这一部分可以参考之前的库存模块。

剩下一部分就是对话框模块整体逻辑,先看一下效果:

在这里插入图片描述

在这里插入图片描述

从上图中,可以看出整个对话框可以分为五个部分:头像、说话人名字、普通对话内容、跳转到下一句的按钮、和 选择对话框。可以简单将 普通对话内容和跳转按钮 划分成一个逻辑组件,而选择对话框划分成另一个逻辑组件,这样划分的原因在于两者实现方式不一样。

接下来内容将分为三个段落,我将自下而上一一实现:从Excel中读取对话内容的方式、普通对话实现 和 选择对话 这三个步骤:

从Excel中读取对话内容的方式

整一个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();
          
### 如何用 Unity 2D 开发文本冒险游戏 #### 创建项目结构 为了构建一个基本的文本冒险游戏,在 Unity 中设置项目的初始文件夹和脚本非常重要。首先,创建一个新的 Unity 2D 项目并命名。 #### 定义物品类 定义游戏中使用的物品对于管理玩家可以拾取或交互的对象至关重要。通过 `ScriptableObject` 可以轻松实现这一点: ```csharp using UnityEngine; // 注册自定义资源菜单项以便于编辑器内创建实例 [CreateAssetMenu(menuName = "Item")] public class Item : ScriptableObject { public string objectName; // 物品名称 public Sprite sprite; // 图标显示 public int quantity; // 数量属性 public bool stackable; // 是否可堆叠标记 public enum ItemType { COIN, HEALTH }; // 枚举类型用于分类不同种类的物品 public ItemType itemType; // 当前物品所属类别 } ``` 这段代码允许开发者在 Unity 编辑器中方便地创建各种类型的物品对象[^1]。 #### 设计场景逻辑 接下来设计主要的游戏循环机制以及处理用户输入的部分。这通常涉及到编写控制器来响应键盘事件,并更新状态机中的当前房间描述和其他相关信息。 #### 实现对话系统 为了让故事更加生动有趣,加入简单的对话框功能是非常有帮助的。可以通过 UI 文字组件配合动画效果展示NPC的话语内容;同时也可以考虑引入分支选项让玩家做出选择影响剧情走向。 #### 添加库存管理系统 考虑到这是一个文字冒险游戏,拥有一个清晰明了的背包界面可以让用户体验更佳。利用列表数据结构存储已获得道具的信息,并提供增删查改的操作接口供其他模块调用。 #### 集成音频增强沉浸感 适当的声音特效能够大大提升整体氛围质量。无论是背景音乐还是特定动作触发时播放的一次性音效都能起到画龙点睛的作用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值