using System.Collections;
using UnityEngine;
using TMPro;
public class NPCscript : Interactable {
public GameObject dialougeObj;
public TMP_Text dialouge;
public int Size;
public string dialougeSt;
public override void Interact () {
base.Interact ();
dialougeObj.SetActive (true);
NPCInteraction();
}
void OnTriggerExit(Collider other) {
dialougeObj.SetActive(false);
}
void NPCInteraction(){
dialouge.SetText(dialougeSt);
}
}
请告诉我怎样才能有一个数组或列表,我可以使用我的size变量并循环它直到所有对话都被说出来。
我试过但我的不行。 帮助!
答案 0 :(得分:1)
对话系统本身就是一个非常广泛的话题。但是,我不认为你只需要一个字符串列表即可完成它。如果您正在谈论给予玩家选择,那么您将需要创建一些自定义类。
首先,您需要一个班级来定义角色的选项。这将是一个非常简单的课程。它将包含字符串响应和表示目标节点的整数。
public class DialogueOption {
public string Text;
public int DestinationNodeID;
}
接下来,您将需要一个DialogueNode类。考虑一下NPC告诉角色的内容,然后它还包含一个列表,你猜对了,对话选项。它将拥有的另一件事是NodeID。这是一个整数,为我们提供了一个从我们的选项发送给我们的地方。看起来有点像这样:
public class DialogueNode {
public int NodeID = -1; //I use -1 as a way to exit a conversation.
//NodeId should be a positive number
public string Text;
public List<DialogueOption> Options;
}
最后,你需要创建一个对话类,这是最简单的一个,只是一个DialogueNodes列表,看起来像这样:
public class Dialogue {
public List<DialogueNode> Nodes = new List<DialogueNode>();
}
你可以在你的角色只有一个对话脚本的地方使用它但是,我做了不同的地方,然后每个角色都有另一个名为DialogueList的类,它基本上是一个对话列表,它还包含角色的名字,我可以显示,根据情况,我可以选择我希望我的角色在当时与玩家进行哪种对话。
public class DialogueList
{
public string name;
public List<Dialogue> dialogues = new List<Dialogue>();
}
这还有一个额外的好处,即如果你想在那个方向上设置它,可以使用名称作为键返回一个对话列表,轻松转换为字典。
在项目的其他地方,你需要一个能控制一切的DialogueManager类。我通常会把它变成一个Singleton,所以我可以从任何地方轻松调用它。我不会告诉你所有这些,但我会告诉你显示的部分,其余的只是设置文本,打开和关闭对象。
public void RunDialogue(string name, Dialogue dia)
{
nameText.text = name;
StartCoroutine(run(dia));
}
IEnumerator run(Dialogue dia)
{
DialoguePanel.SetActive(true);
//start the convo
int node_id = 0;
//if the node is equal to -1 end the conversation
while (node_id != -1 )
{
//display the current node
DisplayNode(dia.Nodes[node_id]);
//reset the selected option
selected_option = -2;
//wait here until a selection is made by button click
while (selected_option == -2)
{
yield return new WaitForSeconds(0.25f);
}
//get the new id since it has changed
node_id = selected_option;
}
//the user exited the conversation
EndDialogue(node_id);
}
我的按钮基本上只是在我在OnPoint事件中附加了这个简单的方法,我在DisplayNode方法下设置了它。基本上,我拿出我的按钮给他们这个方法,他们的参数是他们的DialogueOption.DestinationId
public void SetSelectedOption(int x)
{
selected_option = x;
}
答案 1 :(得分:0)
如果您要求使用对话系统,可以使用UGUI在Unity上轻松创建。
1。)创建一个包含plane
和text
的画布,我想会做
*scale the plane ofcourse to your satisfaction and put it infront of the camera
*and about the text you must put it infront of the plane like the plane is on the back
*and the text is infront of the plane.
2。)现在设置这样的层次
Canvas
Dialogue //Empty GameObject
Plane
Text
每当你碰到类似那样的NPC时,我都会弹出它
[SerializeField] GameObject dialogueObject; //here drag the canvas
[SerializeField] GameObject text; //we will get its component for changing the text later on
void Start(){
text = GetComponent<Text>().text = "Sample Dialogue";
dialogueObject.setActive(false);
}
void OnCollisionEnter(collision collide){
if(collide.gameObject.name == "NPC"){
dialogue.setActive(true);
}
}
这很简单。我希望它有所帮助