Fungus是Unity免费的一款开源的插件,它可以无代码的实现玩家与NPC之间的对话,对于Fungus这个插件,我今天说一说我对它的看法以及一些简单的运用和简单的代码功能的实现。
这里需要导入Fungus插件,插件导完之后会出现Tools/Fungus
SayDialog模板使用,Menu菜单选项,Character玩家NPC的创建,Flowchart小蘑菇使用。
这里我用了一个胶囊体做为玩家,俩个Cube是NPC。这里我们需要通过靠近白色Cube,去开启对话。
这里我给了白色Cube一个球型碰撞器,玩家只有进入到区域内,才能进行对话。我把它命名为NPC1,另一个是NPC2。
通过鼠标左键点击,去进行对话进行。这里的边框以及字体样式都用到了SayDialog这个东西,去给到使用的模板。待会我会告诉大家如何去改变格式。
这里结束对话,去找到NPC2进行对话,我在这里做了判断,如果不去和白色Cube进行对话是无法和它进行对话的。在和这个NPC2过程中我们会进行选项的选择,这里就涉及到了Menu的使用,
这里对任务进行获取,每一个选项选择都会有不同的结果,如果选择选项一,就是接收任务。会提示接收任务成功。选项二就是拒绝任务,将无法接收任务。
选择接受任务:我把代码部分放在Update上就会一直循环选择
拒绝任务:
这里我们开始讲原理。
我们先创建Flowchart,它是用来管理对话的。创建完之后会出现一个小蘑菇。
点击小蘑菇之后,其他的不用管,点击Open Flowchart Window进入对话管理
点击GameStart,编辑对话
这里默认选项是GameStarted,游戏运行就开始对话。这里我们选择None,如何通过代码去判断对话。
双击+号,弹出一大堆对话框,我们这里简单说我们需要使用到的东西。
这里我们要选择到SetSayDialog模板使用
在Tools/Fungus/Create/SayDialog创建模板。
在Tools/Fungus/Create/Character创建NPC角色,创建两个,一个NPC1,一个NPC2。
进行改名分辨NPC1和2
创建一个Plane,并在上面创建2个Cube,和一个胶囊体
双击打开SayDialog编辑对话框模板
Panel:可以改变聊天背景
Image:是大蘑菇的图片
Continue:是右下角的图片
这里我们就改变一个panel这个背景图片,编辑好之后就可以进入Flowchart,点击SayDialog并把刚刚编辑的SayDialog托给它,这样我们就编辑好了模板。模板下面的操作都会使用这个模板,除非你在编辑一个模板并在下面使用,那么这个模板就会被代替了
选择say对话,并给其选择该对话的NPC。这里我把俩句话都给到NPC1
之后我们右键创建新的对话,并重复之前的操作,并把对话给到NPC2
然后我们给它添加判断条件,点击Variables按一下“+”号再选择Boolean修改名称canTalk。然后选择Variable/SetVariable
在Second里面添加一个if判断
注:对话NPC位置不能弄错,因为用Secend对话的NPC没有经过使用Start对话的NPC是无法执行对话的!!!!
然后我们就给NPC代码,两个NPC(Cube)运用同一个脚本,需修改的是ChatName的名称。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Fungus;
/*
*创建者:
*创建时间:
*描述:
*版本:
*/
public class NPC : MonoBehaviour
{
public string ChatName;//外面传入要进行的对话名称
private bool canTalk=false; //判断当前是否可以判断读取对话
private Flowchart f;
void Start()
{
f = GameObject.Find("Flowchart").GetComponent();//获取小蘑菇,对话系统
}
void Update()
{
if (Input.GetKeyDown(KeyCode.E))//按下键盘E开始对话
{
Say();
}
}
//鼠标点击事件,如果鼠标点击NPC也允许读取动画
private void OnMouseDown()
{
Say();
}
void Say()
{
if (canTalk)
{
if (f.HasBlock(ChatName))//判断对话是否存在
{
f.ExecuteBlock(ChatName);//执行对话
}
}
}
private void OnTriggerEnter(Collider other)//触发器允许对话
{
canTalk = true;
}
private void OnTriggerExit(Collider other)
{
canTalk = false;
}
}
所有这里改一下对话的名称,点击对话然后修改BlockName
注:Cube必须添加碰撞器,玩家也要添加,并加刚体
给玩家一个移动的代码,让他进行移动
void Update()
{
Vector3 v = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
transform.position += v * 3 * Time.deltaTime;
Talk();
}
这里我们给NPC2的对话Second对话,添加俩个Menu选择分支,会弹出俩个选择框。
这里我们如何判断我们选中的是哪个选择框呢,这里的操作和之前的Boolean是一样的。
我这里选择的一个Integer类型的Variables,并把它公开化。
创建俩个对话。点击Menu选择TargetBlack,第一个Menu选择say1,第二个Menu选择say2
这样它就有了分支了,选择不同的选择,结果就不一样了。
如何判断一下我们选择的是哪个按钮,这里就用到了Variables/Integer的Change。
代码如下:
using System.Collections.Generic;
using UnityEngine;
using Fungus;
using UnityEngine.UI;
/*
*创建者:
*创建时间:
*描述:
*版本:
*/
public class Player1 : MonoBehaviour
{
public Flowchart fc;
public Menu b;
public void Talk()
{
//获取IntegerVariable的值
if (fc.GetIntegerVariable("Change")==1)
{
print("去钓鱼");
}
else if(fc.GetIntegerVariable("Change") == 2)
{
print("不去钓鱼");
}
}
void Update()
{
Vector3 v = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
transform.position += v * 3 * Time.deltaTime;
Talk();
}
}
注:需要把Flowchart对象放入拖到代码上,不然会报错的。
选择选项2