【Unity 实用插件篇】 | 使用Fungus插件制作一个对话系统,简单好学易上手

news2024/10/6 22:24:42

请添加图片描述

      • 前言
  • 【Unity 实用插件篇】| 使用Fungus插件制作一个对话系统,简单好学易上手
    • 一、Fungus介绍
    • 二、Fumgus导入
    • 三、Fungus功能使用
      • 3.1 基础对话效果实现
      • 3.2 搭建简单场景测试
      • 3.3 触碰 对话
      • 3.4 条件对话
      • 3.4 分支 对话
      • 3.5 改变对话UI视图
    • 四、常用功能菜单介绍
      • 4.1 Flowchat 窗口
      • 4.2 Block Inspector面板
      • 4.2 节点Say参数
  • 总结

请添加图片描述

  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------

请添加图片描述请添加图片描述请添加图片描述

请添加图片描述


前言

  • 今天带来的是Unity中一款简单易用的对话插件Fungus,它是一个免费的交互式的对话系统。
  • Fungus是Unity免费的一款开源的插件,它可以无代码的实现玩家与NPC之间的对话,并且支持本地化,对相机、Sprite及音乐音效的控制。
  • 学会使用该插件就可以做一些对话剧情类的游戏了,还是非常好用的,下面就来学习一下Fungus具体怎么使用吧!

【Unity 实用插件篇】| 使用Fungus插件制作一个对话系统,简单好学易上手

一、Fungus介绍

Fungus 的目标是提供一个免费的开源工具,用于在Unity 3D中创建交互式故事游戏。Fungus被设计为易于学习初学者Unity 3D,特别是对于没有编码经验的人。

对于高级用户,它为可视化脚本和交互式故事叙述提供了直观、快速的工作流。Fungus被用来创造视觉小说、点击冒险游戏、儿童故事、隐藏对象游戏、电子学习应用以及一些难以分类的奇怪东西。

Fungus 允许通过直观的可视化脚本系统轻松地将讲故事功能添加到 Unity 游戏中,无需编码。

  • 适合制作视觉小说、角色扮演游戏、隐藏物品、益智游戏和互动小说游戏。
  • 基于流程图的人物对话
  • 角色对话的国际化。
  • 轻松控制精灵、摄像机和音频,帮助讲述您的故事
  • 适用于 2D 和 3D Unity 游戏
  • 与其他 Unity 代码轻松集成且易于扩展。
  • 为更有经验的用户提供强大的 Lua 脚本支持
  • 100% 免费和开源

Fungus官方地址:Fungus
Fungus官方使用文档:Documentation

插件下载方式

  1. GitHub下载:github下载地址
  2. CSDN资源下载:Unity-Fungus对话插件
  3. VX搜我名字,回复【素材资源】免费获取
  4. 在Unity Assets Store下载导入(目前资源包已下架,之前买过的可以继续使用):Fungus

二、Fumgus导入

从上面的几种下载方式将该插件下载到本地之后,将资源包复制到我们的Unity项目即可。

有几种导入形式,分别来简单介绍一下:

  1. 如果下载的插件是.unitypackage后缀结尾的文件,那就直接将该文件拖到Unity项目的Preject窗口即可导入。
    @图1

  2. 如果是从github下载的则是一整个文件目录,此时有两种方案可以选择。
    在这里插入图片描述

(a)使用UnityHub加载这个文件夹,直接打开一个该项目在此基础上开发使用。
(b)在下载的文件中复制Fungus这个文件夹,将文件夹复制到Unity项目中,如下图:
在这里插入图片描述

导入后可以在菜单栏中看到一个Tool菜单,说明Fungus插件导入成功,下面就可以学习具体怎样使用该插件了。
在这里插入图片描述


三、Fungus功能使用

3.1 基础对话效果实现

新建一个空场景,然后点击菜单栏Tools -> Fungus -> Creat -> FlowChat,如图所示:
在这里插入图片描述

此时场景中会多出一个Flowchat游戏对象,点击该对象。

点击Fungus脚本的 Open Flowchat Window 打开对话管理窗口。
在这里插入图片描述

然后打开的窗口中会出现一个New Block,此时点击该Block查看Inspector监视器窗口。
在这里插入图片描述

点击’+',找到 Narrative/Say 进行点击。
在这里插入图片描述

Say就是实现对话内容的地方,我们可以点击该Commands输入对话内容,也可以添加多项内容,如下所示:
在这里插入图片描述

此时可以运行项目查看效果:
请添加图片描述

这个时候最基础的对话效果就已经实现了,我们通过调整上述Block中的内容就可以添加各种对话。

此处添加Say的地方不止可以实现对话效果,包括添加音乐、动画、位置等各种操作,这个我们后面用到再详细介绍。

默认是游戏第一帧就会运行,我们可以手动添加其他条件触发,比如加个Button点击触发对话。
在这里插入图片描述
请添加图片描述

实现更加复杂的效果需要继续往下看。

3.2 搭建简单场景测试

在场景中简单搭建一个界面方便菜测试使用,如新建一个游戏对象当做玩家,然后再创建两个游戏对象当做npc对话使用。

在这里插入图片描述

并新建一个脚本PlayerController.cs,添加一个简单的玩家移动旋转的功能。
代码如下:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [Header("移动速度")]
    public float movespeed = 5f;
    [Header("转身速度")]
    public float turnspeed = 2f;

    private float hor, ver;

    void Update()
    {
        hor = Input.GetAxis("Horizontal");
        ver = Input.GetAxis("Vertical");
        //前后移动
        transform.position += ver * transform.forward * Time.deltaTime * movespeed;
        //左右转身
        transform.eulerAngles += hor * Vector3.up * turnspeed;
    }
}

在玩家对象身上添加刚体组件Rigidbody,把参数简单修改一下,防止玩家胶囊体歪在路上了~
在这里插入图片描述

3.3 触碰 对话

上面讲了怎样触发一个最简单的对话,下面就来添加一个当玩家靠近相关npc时触发对话弹窗的步骤。

首先我们给npc1添加一个球形触发器,用于检测玩家是否进入其触发范围。
在这里插入图片描述

将玩家Player对象添加Tag为Player,全局唯一 方便检测是否为玩家。

然后再新建一个脚本NpcEntity.cs,用于挂载到Npc身上添加一些与玩家相关的逻辑。
代码如下:

using Fungus;
using UnityEngine;

public class NpcEntity : MonoBehaviour
{
    [Header("npc名字,需与Block名字一致")]
    public string npcName;

    private Flowchart flowchart;
    private bool canSay;


    void Start()
    {
        flowchart = GameObject.Find("Flowchart").GetComponent<Flowchart>();
    }
    private void Update()
    {
        //鼠标按下左键触发对话方法
        if (Input.GetMouseButtonDown(0))
        {
            Say();
        }
    }
    void Say()
    {
        if (canSay)
        {
            if (flowchart.HasBlock(npcName))
            {
                flowchart.ExecuteBlock(npcName);
            }
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        //如果检测到玩家进入触发范围
        if (other.tag.Equals("Player"))
        {
            canSay = true;
        }
    }
    private void OnTriggerExit(Collider other)
    {
        //如果检测到玩家离开触发范围
        if (other.tag.Equals("Player"))
        {
            canSay = false;
        } 
    }
}

将脚本挂载到场景的Npc1上,并且在对话窗口管理器中将第一个Block改名为npc1,如图:
在这里插入图片描述

Block的名字很重要,每一个Block都代表一个对话流程,且全局唯一不重复。

此时运行游戏查看效果:
请添加图片描述
可以看到只有玩家进入npc1的触发范围点击鼠标左键才会触发对话,在触发器范围之外是不会触发对话的。

这样就完成了一个简单的触发对话功能。

3.4 条件对话

有的时候我们与某个npc对话时,还会有前提条件。比如在跟npc2对话之前,必须与npc1对话完才可以跟npc2对话。

下面来看一下这个效果怎样实现吧。

首先在场景中给npc2也添加上NpcEntity脚本,并将Name改为npc2,同时别忘记添加触发器。
在这里插入图片描述

然后在对话管理器窗口中右键场创建新的Block并命名为npc2,然后点击’+'添加一个Say对话。
在这里插入图片描述

此时在对话管理器窗口中点击Variables添加一个布尔值变量并改个名字,这个参数我们将用来判断玩家是否与npc1对话过。
在这里插入图片描述

然后点击npc2的Block,在右侧面板上加一个if选项。
在这里插入图片描述

然后点击新加的if对话,将我们刚才创建的布尔变量添加上,如图所示:
在这里插入图片描述

然后还要在npc1的Block对话末尾加一个Set Variable,将我们添加的布尔变量改为true。
在这里插入图片描述

此处的含义就是与npc2对话前要进行判断,当我们加的这个条件(此处条件为我们创建的布尔变量’End_npc1’)满足时,才可以与npc2进行后续的对话。所以与npc1对话后要将该值改为true。

这也是本小节开头说的 前提条件,下面运行看一下效果。

请添加图片描述

3.4 分支 对话

在生活中我们会经常面临着各种选择,比如著名的每日三省吾身:早饭吃什么?午饭吃什么?晚饭吃什么?
那游戏中也如此,总会遇到一些让我们选择的问题,那这个需要进行选择的分支对话要怎么做呢,继续看下面的操作。

在npc2的Block中继续添加节点Menu,添加两个Menu作为对话分支的内容。如下所示:
在这里插入图片描述
在这里插入图片描述

可以看到目前Menu命令里面是报错状态,提示我们没有指定目标Block,这里就需要在对话管理器窗口中右键新建两个Block作为此次分支对话的目标节点,如下所示:
在这里插入图片描述

将两个Menu的TargetBlock分别指向新建的两个Block上,可以看到左侧的npc2的Block也发生了变化,有两个箭头分别指向了后面的npc2_1和npc2_2。

然后我们在后续的两个分支上分别添加一个对话,以达到一个连续对话的功能。
在这里插入图片描述

然后在npc2的末尾添加一个Set Variable,此处将之前加的布尔值参数End_npc1改为Fasle,防止触发分支对话后又重新触发npc2的初始对话。
在这里插入图片描述

此时运行查看效果:
请添加图片描述

3.5 改变对话UI视图

此时我们已经可以给对话添加触发条件和分支对话了,已经算是学会了剧情对话中最常用的功能啦~

但是此时的对话没有名字和肖像图,以至于不知道哪句话分别是谁说的,傻傻分不清楚。

不用担心,Fungus也是提供了此功能让我们可以使用,下面请看具体用法。

点击菜单栏Tools -> Create -> Character,新建两个Character,分别命名为Character_npc1Character_npc2
在这里插入图片描述

选中这两个Character_npc对象,在其对应的脚本中改一下对应的名字和颜色。
在这里插入图片描述

记得还要再加一个Character_player代表玩家。
在这里插入图片描述

然后我们在对话管理中找到对话流程,并给每个对话指令添加对应的Character对象。
在这里插入图片描述

此时运行工程,查看具体效果,可以看到对话的上面已经显示是谁在讲话了。
请添加图片描述

在Character_npc对象上我们也可以添加对应角色的肖像图,如下:
在这里插入图片描述
添加的图片格式为Sprite,可以添加多个肖像图,在具体的对话Block中可选择具体使用哪一张。
在这里插入图片描述

此时再运行工程,可查看添加完肖像图的对话流程。
请添加图片描述

同样的,不同角色的对话气泡框也可以单独设置。还是找到Character_npc对象身上的Character脚本,有个参数叫Set Say Dialog,单独设置每个Character_npc的该参数就可以实现不同角色不同的对话框气泡了!

如果想直接改变全局的对话框气泡样式,可以找到全局的预制体SayDialog,直接修改此预制体的样式即可修改全局使用的气泡样式。
在这里插入图片描述


四、常用功能菜单介绍

4.1 Flowchat 窗口

Flowchat 窗口 是我们通过点击 Flowchart游戏对象 身上的 Flowchart脚本 的Open Flowchart Window参数调出来的。
在这里插入图片描述
其作用就是负责整个对话管理器的窗口,在其中可以看到和管理各个Block。

4.2 Block Inspector面板

首先是Flowchat窗口的Block Inspector的参数介绍。
在这里插入图片描述

名称介绍
Block Name按钮在Flowchartwindow里的名字
Custom Tint开启个性化设置,可以自己设置按钮的样式
Description类似于备注,会显示在按钮下方
execute on event此节点是通过什么事件触发,如在游戏开始时直接触发、按下某个按键触发等
Commands节点触发后按顺序执行

4.2 节点Say参数

然后是节点中的Say参数介绍。
在这里插入图片描述

名称介绍
Character将对话框绑定到某个角色
Story Text游戏运行后对话框中显示的内容
Voice Over Clip设置对话框出现时伴随的音效
Tag Help点击后展示一些可以在story text中使用的样式,如加粗、斜体、改变字体颜色等
Show Always该对话指令是否一直都展示。若改为False则可以设置出现的具体次数Show Count
Fade When Done完成时淡入淡出效果
Wait For Click是否等待点击。若改为False,怎对话完成后会自动切换下一句话而无需玩家点击
Set Say Dialog设置对话气泡框。可以改变对话的气泡样式

关于Fungus的每个节点都有不同的参数属性,这里就不一一介绍了,想了解更多参数及使用方法可以参考官方提供的说明文档学习使用。


总结

  • 本文介绍了Unity中一个简单易用的 对话插件Fungus,学会该插件就可以制作一些小型的剧情对话游戏啦!
  • 由于篇幅原因本文介绍了Fungus中常用的几个功能,还有很多其他功能可以参考官方提供的文档使用。

资料白嫖,技术互助

学习路线指引(点击解锁)知识定位人群定位
🧡 Unity系统学习专栏 🧡入门级本专栏从Unity入门开始学习,快速达到Unity的入门水平
💛 Unity实战类项目 💛进阶级计划制作Unity的 100个实战案例!助你进入Unity世界,争取做最全的Unity原创博客大全。
❤️ 游戏制作专栏 ❤️ 难度偏高分享学习一些Unity成品的游戏Demo和其他语言的小游戏!
💚 游戏爱好者万人社区💚 互助/吹水数万人游戏爱好者社区,聊天互助,白嫖奖品
💙 Unity100个实用技能💙 Unity查漏补缺针对一些Unity中经常用到的一些小知识和技能进行学习介绍,核心目的就是让我们能够快速学习Unity的知识以达到查漏补缺

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端】自制密码展示隐藏按钮

效果 一、前期准备 使用的图片是iconfront上拿的svg代码环境是Vue2 Element 二、创建组件 showPasswordAndclose <template><span class"show-password-container"><span v-if"chooseType CLOSE" click"changeType"><…

一文读懂Nacos原理及实践

文章目录 0. 前言0.nacos 介绍什么是 Nacos&#xff1f;Nacos 地图 1. 原理解析1.1 服务注册与发现流程一、服务注册流程二、服务发现流程三、注册中心高可用性机制 1.2. 原理解析一、服务注册与发现的概念二、服务注册与发现的流程2. 服务发现流程3. 服务负载均衡流程 三、服务…

javascript 将json数据导出excel

<el-button type"primary" plain v-on:click"jsonToExcel();">导出</el-button>jsonToExcel() {const data this.AlarmData;let head "城市,站点,时间,A相电流(A),B相电流(A),C相电流(A),SO2压力(MPa),CO压力(MPa),NOX压力(MPa),A相电压…

Activity引擎(初次学习与总结梳理全记录,包括易混淆知识点分析,常用报错解决方案等)

最近工作需要使用Acticity框架处理审批业务&#xff0c;简单了解后能虽能很快的上手&#xff0c;但是对于Activity的整体认识并不够&#xff0c;特此花费很多精力全面的学习并记录。包含对很多的概念的第一次理解过程&#xff1b;对知识点的混淆地方的梳理&#xff1b;对实践过…

mysql索引优化和锁

mysql索引优化和锁 IO操作与索引 IO操作上数据库性能的瓶颈之一&#xff0c;每次进行IO操作都需要消耗时间和资源。 核心:尽量减少 IO 操作的次数 读取次数少且读取量少是优化IO操作的核心目标。采用分块读取和局部性原理。 分块读取&#xff1a;将磁盘上的数据划分为若干…

黑马程序员编著过哪些教材?

黑马程序员是一家知名的IT培训机构&#xff0c;他们发布了许多教材和课程。 《Python入门教程》&#xff1a;介绍Python编程语言的基础知识和常用技巧。 《Java从入门到精通》&#xff1a;全面介绍Java编程语言的基础知识和高级特性。 《Web前端开发教程》&#xff1a;涵盖HT…

JDK压缩包安装,tomcat压缩包安装

1.解压JDK后进入我的电脑高级设置 2.新建系统变量&#xff08;变量名为JAVA_HOME&#xff0c;值为jdk文件夹的绝对地址&#xff09; 3.再次新建系统变量&#xff08;变量名为CLASSPATH&#xff0c;值为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar&#xff09; 4.进入系…

教你如何快速准确地掌握AI最新技术

文章整理自&#xff1a;https://twitter.com/jbhuang0604/status/1426039195542360070?s21 人工智能领域如何follow最新技术&#xff1f;这应该是咱们这个行业非常关心的问题之一吧。 当你刚开始进行研究时&#xff0c;会发现每年都有成千上万的论文&#xff0c;如何在这些海…

代码随想录二刷day55 | 动态规划之子序列 392.判断子序列 115.不同的子序列

day55 392.判断子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 115.不同的子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历…

python+allure+jenkins

目录 前言 在 python 中使用 allure 1. 安装 pytest 2. 安装 pytest-allure-adaptor 3. 使用 pytest 执行测试用例并生成 allure 中间报告&#xff08;此步骤可以省略&#xff0c;因为在 jenkins job 中会配置执行类似的命令&#xff09; 4. Jenkins 中安装Allure Jenkin…

测试老鸟整理,Jmeter常用线程组+场景实例,一篇速通测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Jmeter中通过线程…

FITC标记牛血清白蛋白(FITC-BSA)溶解性

FITC-BSA是一种常用的荧光探针&#xff0c;用于生物化学和细胞生物学研究。FITC-BSA具有溶解性&#xff0c;可以在溶液中均匀分布。 溶解性1&#xff1a; FITC标记的牛血清白蛋白&#xff08;FITC-BSA&#xff09;在适当的条件下具有良好的溶解性。FITC-BSA通常以固体形式供应…

概率论的学习和整理18:为什么 P(至少成功1次) = Σ P(几何分布) ,总结几何分布和连续失败概率的关系,二项分布和累计成功k次的关系

目录 1 先说结论&#xff1a; 2 Σ几何分布的P(xn) P(n次试验至少成功1次) 2.1 几何分布的概率 2.2 这个是可以证明的&#xff0c;下面是推导过程 2.3 怎么理解呢&#xff1f; 3 另外&#xff0c;P(累计成功k次) ΣP(成功k次的二项分布) 3.1 成功k次的概率 和 累计成…

C# NPOI读取Excel中文乱码

Win11, 程序中需要从Excel表格读取中文内容&#xff0c;实测发现有中文乱码问题&#xff1a; class name:??Vege 奇怪的问号&#xff0c;原文是“蔬菜Vege”。 网上找了一圈&#xff0c;没找到NPOI中文乱码的解决方案&#xff0c;普遍都是比较顺利没遇到中文乱码问题。 那…

DP4057替代TP4057 500mA双灯指示防反接锂电充电管理IC

DP4057 是一款完整的单节锂离子电池充电器&#xff0c;带电池正负极反接保护&#xff0c;采用恒定电流/恒定电压线性控制。其 SOT26封装与较少的外部元件数目使得 DP4057 成为便携式应用的理想选择。DP4057可以适合 USB电源和适配器电源工作。由于采用了内部PMOSFET架构&#x…

ubuntu 20.04, 22.04网络配置比较

1.ubuntu 20.04网络配置&#xff0c;配置静态IP&#xff1a;切换roote用户&#xff0c;vi /etc/netplan/00-installer-config.yaml&#xff0c;修改网络配置&#xff0c;格式如下&#xff1a; network: ethernets: ens33: dhcp4: false addresses: [172.22.…

机器学习31:《推荐系统-IV》深度神经网络DNN

在《机器学习29&#xff1a;《推荐系统-II》协同过滤》一文中&#xff0c;笔者介绍了如何使用矩阵分解来学习嵌入。矩阵分解具有一些局限性&#xff1a; 基础矩阵分解只用了 UserID&#xff08;QueryID&#xff09; 和 ItemID 两个维度的信息&#xff0c;所有学到的知识都蕴含在…

SQL-每日一题【596.超过五名学生的课】

题目 表: Courses 编写一个SQL查询来报告 至少有5个学生 的所有班级。 以 任意顺序 返回结果表。 查询结果格式如下所示。 示例 1: 解题思路 1.题目要求查询至少有五个学生所在的班级&#xff0c;我们就可以先用group by class 对班级先分一下组。 2。分好组后&#xff0c;我…

《Communication-Efficient Learning of Deep Networks from Decentralized Data》

Communication-Efficient Learning of Deep Networks from Decentralized Data 这篇文章算是联邦学习的开山之作吧&#xff0c;提出了FedAvg的算法&#xff0c;文中对比了不同客户端本地训练次数&#xff0c;客户端训练数据集划分的影响。 0. Abstract 现代移动设备可以获取大…

永久区和元空间的区别

一文搞懂JVM之 方法区、永久代、元空间三者的区别 - 知乎 元空间和永久代的区别-腾讯云开发者社区-腾讯云 方法区和永久区/元空间之间的关系 - 简书 方法区(Method Area),是JVM规范中提出的一个(概念)&#xff0c;用于存储类信息、常量池、静态变量、JIT编译后的代码等。 Th…