Fungus是Unity免費(fèi)的一款開源的插件,它可以無(wú)代碼的實(shí)現(xiàn)玩家與NPC之間的對(duì)話,對(duì)于Fungus這個(gè)插件,我今天說(shuō)一說(shuō)我對(duì)它的看法以及一些簡(jiǎn)單的運(yùn)用和簡(jiǎn)單的代碼功能的實(shí)現(xiàn)。
這里需要導(dǎo)入Fungus插件,插件導(dǎo)完之后會(huì)出現(xiàn)Tools/Fungus
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-486341.html
SayDialog模板使用,Menu菜單選項(xiàng),Character玩家NPC的創(chuàng)建,F(xiàn)lowchart小蘑菇使用。
?
這里我用了一個(gè)膠囊體做為玩家,倆個(gè)Cube是NPC。這里我們需要通過(guò)靠近白色Cube,去開啟對(duì)話。
?這里我給了白色Cube一個(gè)球型碰撞器,玩家只有進(jìn)入到區(qū)域內(nèi),才能進(jìn)行對(duì)話。我把它命名為NPC1,另一個(gè)是NPC2。
?
通過(guò)鼠標(biāo)左鍵點(diǎn)擊,去進(jìn)行對(duì)話進(jìn)行。這里的邊框以及字體樣式都用到了SayDialog這個(gè)東西,去給到使用的模板。待會(huì)我會(huì)告訴大家如何去改變格式。
?這里結(jié)束對(duì)話,去找到NPC2進(jìn)行對(duì)話,我在這里做了判斷,如果不去和白色Cube進(jìn)行對(duì)話是無(wú)法和它進(jìn)行對(duì)話的。在和這個(gè)NPC2過(guò)程中我們會(huì)進(jìn)行選項(xiàng)的選擇,這里就涉及到了Menu的使用,
?
?這里對(duì)任務(wù)進(jìn)行獲取,每一個(gè)選項(xiàng)選擇都會(huì)有不同的結(jié)果,如果選擇選項(xiàng)一,就是接收任務(wù)。會(huì)提示接收任務(wù)成功。選項(xiàng)二就是拒絕任務(wù),將無(wú)法接收任務(wù)。
選擇接受任務(wù):我把代碼部分放在Update上就會(huì)一直循環(huán)選擇
?拒絕任務(wù):
?這里我們開始講原理。
我們先創(chuàng)建Flowchart,它是用來(lái)管理對(duì)話的。創(chuàng)建完之后會(huì)出現(xiàn)一個(gè)小蘑菇。
?
點(diǎn)擊小蘑菇之后,其他的不用管,點(diǎn)擊Open Flowchart Window進(jìn)入對(duì)話管理
?
?
?點(diǎn)擊GameStart,編輯對(duì)話
?
?
?這里默認(rèn)選項(xiàng)是GameStarted,游戲運(yùn)行就開始對(duì)話。這里我們選擇None,如何通過(guò)代碼去判斷對(duì)話。
雙擊+號(hào),彈出一大堆對(duì)話框,我們這里簡(jiǎn)單說(shuō)我們需要使用到的東西。
?
?這里我們要選擇到SetSayDialog模板使用
?
?在Tools/Fungus/Create/SayDialog創(chuàng)建模板。
?在Tools/Fungus/Create/Character創(chuàng)建NPC角色,創(chuàng)建兩個(gè),一個(gè)NPC1,一個(gè)NPC2。
?
?
?進(jìn)行改名分辨NPC1和2
?
?
?
?創(chuàng)建一個(gè)Plane,并在上面創(chuàng)建2個(gè)Cube,和一個(gè)膠囊體
?雙擊打開SayDialog編輯對(duì)話框模板
?
Panel:可以改變聊天背景
?Image:是大蘑菇的圖片
Continue:是右下角的圖片
?
?這里我們就改變一個(gè)panel這個(gè)背景圖片,編輯好之后就可以進(jìn)入Flowchart,點(diǎn)擊SayDialog并把剛剛編輯的SayDialog托給它,這樣我們就編輯好了模板。模板下面的操作都會(huì)使用這個(gè)模板,除非你在編輯一個(gè)模板并在下面使用,那么這個(gè)模板就會(huì)被代替了
?選擇say對(duì)話,并給其選擇該對(duì)話的NPC。這里我把倆句話都給到NPC1
?
?之后我們右鍵創(chuàng)建新的對(duì)話,并重復(fù)之前的操作,并把對(duì)話給到NPC2
?
然后我們給它添加判斷條件,點(diǎn)擊Variables按一下“+”號(hào)再選擇Boolean修改名稱canTalk。然后選擇Variable/SetVariable
?
?
?在Second里面添加一個(gè)if判斷
?
注:對(duì)話NPC位置不能弄錯(cuò),因?yàn)橛肧ecend對(duì)話的NPC沒(méi)有經(jīng)過(guò)使用Start對(duì)話的NPC是無(wú)法執(zhí)行對(duì)話的?。。。?/p>
然后我們就給NPC代碼,兩個(gè)NPC(Cube)運(yùn)用同一個(gè)腳本,需修改的是ChatName的名稱。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Fungus;
/*
*創(chuàng)建者:
*創(chuàng)建時(shí)間:
*描述:
*版本:
*/
public class NPC : MonoBehaviour
{
public string ChatName;//外面?zhèn)魅胍M(jìn)行的對(duì)話名稱
private bool canTalk=false; //判斷當(dāng)前是否可以判斷讀取對(duì)話
private Flowchart f;
void Start()
{
f = GameObject.Find("Flowchart").GetComponent<Flowchart>();//獲取小蘑菇,對(duì)話系統(tǒng)
}
void Update()
{
if (Input.GetKeyDown(KeyCode.E))//按下鍵盤E開始對(duì)話
{
Say();
}
}
//鼠標(biāo)點(diǎn)擊事件,如果鼠標(biāo)點(diǎn)擊NPC也允許讀取動(dòng)畫
private void OnMouseDown()
{
Say();
}
void Say()
{
if (canTalk)
{
if (f.HasBlock(ChatName))//判斷對(duì)話是否存在
{
f.ExecuteBlock(ChatName);//執(zhí)行對(duì)話
}
}
}
private void OnTriggerEnter(Collider other)//觸發(fā)器允許對(duì)話
{
canTalk = true;
}
private void OnTriggerExit(Collider other)
{
canTalk = false;
}
}
所有這里改一下對(duì)話的名稱,點(diǎn)擊對(duì)話然后修改BlockName
?
注:Cube必須添加碰撞器,玩家也要添加,并加剛體
?
?給玩家一個(gè)移動(dòng)的代碼,讓他進(jìn)行移動(dòng)
?void Update()
? ? {
? ? ? ? Vector3 v = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
? ? ? ? transform.position += v * 3 * Time.deltaTime;
? ? ? ? Talk();
? ? }
?
?這里我們給NPC2的對(duì)話Second對(duì)話,添加倆個(gè)Menu選擇分支,會(huì)彈出倆個(gè)選擇框。
?
?這里我們?nèi)绾闻袛辔覀冞x中的是哪個(gè)選擇框呢,這里的操作和之前的Boolean是一樣的。
我這里選擇的一個(gè)Integer類型的Variables,并把它公開化。
?創(chuàng)建倆個(gè)對(duì)話。點(diǎn)擊Menu選擇TargetBlack,第一個(gè)Menu選擇say1,第二個(gè)Menu選擇say2
?
這樣它就有了分支了,選擇不同的選擇,結(jié)果就不一樣了。
?
?
?如何判斷一下我們選擇的是哪個(gè)按鈕,這里就用到了Variables/Integer的Change。
代碼如下:
using System.Collections.Generic;
using UnityEngine;
using Fungus;
using UnityEngine.UI;
/*
*創(chuàng)建者:
*創(chuàng)建時(shí)間:
*描述:
*版本:
*/
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對(duì)象放入拖到代碼上,不然會(huì)報(bào)錯(cuò)的。
?選擇選項(xiàng)1
?選擇選項(xiàng)2
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-486341.html
?
到了這里,關(guān)于Unity Fungus插件的對(duì)話系統(tǒng)簡(jiǎn)單使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!