博客主页:https://xiaoy.blog.csdn.net
本文由 呆呆敲代码的小Y 原创,首发于 CSDN
学习专栏推荐:Unity系统学习专栏
游戏制作专栏推荐:游戏制作
Unity实战100例专栏推荐:Unity 实战100例 教程
欢迎点赞 收藏 ⭐留言 如有错误敬请指正!
未来很长,值得我们全力奔赴更美好的生活✨
------------------❤️分割线❤️-------------------------
Fungus
,它是一个免费的交互式的对话系统。Fungus
的目标是提供一个免费的开源工具,用于在Unity 3D中创建交互式故事游戏。Fungus被设计为易于学习初学者Unity 3D,特别是对于没有编码经验的人。
对于高级用户,它为可视化脚本和交互式故事叙述提供了直观、快速的工作流。Fungus被用来创造视觉小说、点击冒险游戏、儿童故事、隐藏对象游戏、电子学习应用以及一些难以分类的奇怪东西。
Fungus 允许通过直观的可视化脚本系统轻松地将讲故事功能添加到 Unity 游戏中,无需编码。
Fungus官方地址:Fungus
Fungus官方使用文档:Documentation
插件下载方式:
从上面的几种下载方式将该插件下载到本地之后,将资源包复制到我们的Unity项目即可。
有几种导入形式,分别来简单介绍一下:
(a)使用UnityHub加载这个文件夹,直接打开一个该项目在此基础上开发使用。
(b)在下载的文件中复制Fungus这个文件夹,将文件夹复制到Unity项目中,如下图:
导入后可以在菜单栏中看到一个Tool菜单,说明Fungus插件导入成功,下面就可以学习具体怎样使用该插件了。
新建一个空场景,然后点击菜单栏Tools -> Fungus -> Creat -> FlowChat
,如图所示:
此时场景中会多出一个Flowchat游戏对象,点击该对象。
点击Fungus脚本的 Open Flowchat Window
打开对话管理窗口。
然后打开的窗口中会出现一个New Block
,此时点击该Block查看Inspector监视器窗口。
Say就是实现对话内容的地方,我们可以点击该Commands输入对话内容,也可以添加多项内容,如下所示:
这个时候最基础的对话效果就已经实现了,我们通过调整上述Block中的内容就可以添加各种对话。
此处添加Say的地方不止可以实现对话效果,包括添加音乐、动画、位置等各种操作,这个我们后面用到再详细介绍。
默认是游戏第一帧就会运行,我们可以手动添加其他条件触发,比如加个Button点击触发对话。
实现更加复杂的效果需要继续往下看。
在场景中简单搭建一个界面方便菜测试使用,如新建一个游戏对象当做玩家,然后再创建两个游戏对象当做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,把参数简单修改一下,防止玩家胶囊体歪在路上了~
上面讲了怎样触发一个最简单的对话,下面就来添加一个当玩家靠近相关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的触发范围点击鼠标左键才会触发对话,在触发器范围之外是不会触发对话的。
这样就完成了一个简单的触发对话功能。
有的时候我们与某个npc对话时,还会有前提条件。比如在跟npc2对话之前,必须与npc1对话完才可以跟npc2对话。
下面来看一下这个效果怎样实现吧。
首先在场景中给npc2也添加上NpcEntity脚本,并将Name改为npc2,同时别忘记添加触发器。
然后在对话管理器窗口中右键场创建新的Block并命名为npc2,然后点击’+'添加一个Say对话。
此时在对话管理器窗口中点击Variables添加一个布尔值变量并改个名字,这个参数我们将用来判断玩家是否与npc1对话过。
然后点击新加的if对话,将我们刚才创建的布尔变量添加上,如图所示:
然后还要在npc1的Block对话末尾加一个Set Variable
,将我们添加的布尔变量改为true。
此处的含义就是与npc2对话前要进行判断,当我们加的这个条件(此处条件为我们创建的布尔变量’End_npc1’)满足时,才可以与npc2进行后续的对话。所以与npc1对话后要将该值改为true。
这也是本小节开头说的 前提条件,下面运行看一下效果。
在生活中我们会经常面临着各种选择,比如著名的每日三省吾身:早饭吃什么?午饭吃什么?晚饭吃什么?
那游戏中也如此,总会遇到一些让我们选择的问题,那这个需要进行选择的分支对话要怎么做呢,继续看下面的操作。
在npc2的Block中继续添加节点Menu,添加两个Menu作为对话分支的内容。如下所示:
可以看到目前Menu命令里面是报错状态,提示我们没有指定目标Block,这里就需要在对话管理器窗口中右键新建两个Block作为此次分支对话的目标节点,如下所示:
将两个Menu的TargetBlock分别指向新建的两个Block上,可以看到左侧的npc2的Block也发生了变化,有两个箭头分别指向了后面的npc2_1和npc2_2。
然后我们在后续的两个分支上分别添加一个对话,以达到一个连续对话的功能。
然后在npc2的末尾添加一个Set Variable
,此处将之前加的布尔值参数End_npc1改为Fasle,防止触发分支对话后又重新触发npc2的初始对话。
此时我们已经可以给对话添加触发条件和分支对话了,已经算是学会了剧情对话中最常用的功能啦~
但是此时的对话没有名字和肖像图,以至于不知道哪句话分别是谁说的,傻傻分不清楚。
不用担心,Fungus也是提供了此功能让我们可以使用,下面请看具体用法。
点击菜单栏Tools -> Create -> Character
,新建两个Character,分别命名为Character_npc1
和Character_npc2
。
选中这两个Character_npc对象,在其对应的脚本中改一下对应的名字和颜色。
然后我们在对话管理中找到对话流程,并给每个对话指令添加对应的Character对象。
此时运行工程,查看具体效果,可以看到对话的上面已经显示是谁在讲话了。
在Character_npc对象上我们也可以添加对应角色的肖像图,如下:
添加的图片格式为Sprite,可以添加多个肖像图,在具体的对话Block中可选择具体使用哪一张。
同样的,不同角色的对话气泡框也可以单独设置。还是找到Character_npc对象身上的Character脚本,有个参数叫Set Say Dialog
,单独设置每个Character_npc的该参数就可以实现不同角色不同的对话框气泡了!
如果想直接改变全局的对话框气泡样式,可以找到全局的预制体SayDialog
,直接修改此预制体的样式即可修改全局使用的气泡样式。
Flowchat 窗口 是我们通过点击 Flowchart游戏对象 身上的 Flowchart脚本 的Open Flowchart Window
参数调出来的。
其作用就是负责整个对话管理器的窗口,在其中可以看到和管理各个Block。
首先是Flowchat窗口的Block Inspector的参数介绍。
名称 | 介绍 |
---|---|
Block Name | 按钮在Flowchartwindow里的名字 |
Custom Tint | 开启个性化设置,可以自己设置按钮的样式 |
Description | 类似于备注,会显示在按钮下方 |
execute on event | 此节点是通过什么事件触发,如在游戏开始时直接触发、按下某个按键触发等 |
Commands | 节点触发后按顺序执行 |
名称 | 介绍 |
---|---|
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系统学习专栏 | 入门级 | 本专栏从Unity入门开始学习,快速达到Unity的入门水平 |
Unity实战类项目 | 进阶级 | 计划制作Unity的 100个实战案例!助你进入Unity世界,争取做最全的Unity原创博客大全。 |
❤️ 游戏制作专栏 ❤️ | 难度偏高 | 分享学习一些Unity成品的游戏Demo和其他语言的小游戏! |
游戏爱好者万人社区 | 互助/吹水 | 数万人游戏爱好者社区,聊天互助,白嫖奖品 |
Unity100个实用技能 | Unity查漏补缺 | 针对一些Unity中经常用到的一些小知识和技能进行学习介绍,核心目的就是让我们能够快速学习Unity的知识以达到查漏补缺 |