目录
声明
本教程学习均来自U3D中文课堂麦扣老师
1.Update Main Dialogue 显示主对话窗口的内容
我们会在NPC的身上挂一个代码来控制它所播放的对话的内容是什么,这个脚本可以控制对话的信息,创建一个脚本Dialog Controller,其中引用的变量就是Dialog Data,
DialogueController:要实现的方法就是当我们的人物接近我们的NPC的时候,NPC周围我们创建了一个范围比较大一点的Capsule Collider,勾选为Trigger,让近距离的时候可以触发
public class DialogueController : MonoBehaviour
{
public DialogueData_SO currentData;//拿到对话信息
bool canTalk = false;//监控是否可以对话
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player") && currentData != null)//Player在附近 并且 有对话内容
{
canTalk = true;//可以对话
}
}
private void Update()
{
if(canTalk && Input.GetMouseButtonDown(1))
{
OpenDialog();//打开对话窗口
}
}
void OpenDialog()//打开对话窗口
{
//打开UI面版
//传输对话内容信息
}
}
怎么来实现这个功能呢?接下来创建UI的控制器,在Dialog Canvas上挂载一个代码来控制所以的Dialogue UI,然后也拿到下面所有的子物体的控制权,比如说Update我们的图片和文本,
DialogUI:
[Header("Basic Elements")]//基本设置
public Image icon;//图片
public Text mainText;//文字
public Button nextButton;//下一步按钮
public GameObject dialoguePanel;//面板信息
DialogUI:
[Header("Data")]//数据信息
public DialogueData_SO currentData;//当前对话信息
int currentIndex = 0;//当前播放哪一条信息
public void UpdateDialogData(DialogueData_SO data)//更新对话信息
{
currentData = data;//当前对话信息
currentIndex = 0;//当前播放第0条信息
}
DialogueController:
void OpenDialog()//打开对话窗口
{
//打开UI面版
//传输对话内容信息
DialogUI.Instance.UpdateDialogData(currentData);
}
DialogUI:
public void UpdateMainDialog(DialoguePiece piece)//更新主要对话窗口
{
dialoguePanel.SetActive(true);
if(piece.image != null)
{
icon.enabled = true;
icon.sprite = piece.image;//显示图片
}
else
{
icon.enabled = false;//不显示图片
}
mainText.text = "";
mainText.text = piece.text;//传输文本
}
}
DialogueController:
void OpenDialog()//打开对话窗口
{
//打开UI面版
//传输对话内容信息
DialogUI.Instance.UpdateDialogData(currentData);//打开UI面版
DialogUI.Instance.UpdateMainDialog(currentData.dialoguePieces[0]);//更新主要对话窗口
}
显示按钮:默认NextBUtton是不启动的,只有对话框当中有多条对话并且当前这条对话不包含Option的,没有Option并且对话大于0才启动按钮继续播放下一句话
DialogUI:
public void UpdateMainDialog(DialoguePiece piece)//更新主要对话窗口
{
dialoguePanel.SetActive(true);
if(piece.image != null)
{
icon.enabled = true;
icon.sprite = piece.image;//显示图片
}
else
{
icon.enabled = false;//不显示图片
}
mainText.text = "";
mainText.text = piece.text;//传输文本
if(piece.options.Count == 0 && currentData.dialoguePieces.Count>0)//没有任何选项 且 对话块大于0
{
nextButton.gameObject.SetActive(true);//显示Next按钮
currentIndex++;//播放序号+1
}
else
{
nextButton.gameObject.SetActive(false);//不显示Next按钮
}
}
为按钮添加函数方法:
DialogUI:
protected override void Awake()
{
base.Awake();
nextButton.onClick.AddListener(ContinueDialog);//点击Next按钮继续下一条对话
}
void ContinueDialog()//继续下一条对话
{
if(currentIndex < currentData.dialoguePieces.Count)//有下一条对话
{
UpdateMainDialog(currentData.dialoguePieces[currentIndex]);//更新主要对话窗口
}
else
{
dialoguePanel.SetActive(false);//结束对话
}
}
在这里面我希望文字可以用打字的效果出来:
DialogueUI:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class DialogUI : Singleton<DialogUI>
{
[Header("Basic Elements")]//基本设置
public Image icon;//图片
public Text mainText;//文字
public Button nextButton;//下一步按钮
public GameObject dialoguePanel;//面板信息
[Header("Data")]//数据信息
public DialogueData_SO currentData;//当前对话信息
int currentIndex = 0;//当前播放哪一条信息
public void UpdateDialogData(DialogueData_SO data)//打开UI面版
{
currentData = data;//当前对话信息
currentIndex = 0;//当前播放第0条信息
}
protected override void Awake()
{
base.Awake();
nextButton.onClick.AddListener(ContinueDialog);//点击Next按钮继续下一条对话
}
void ContinueDialog()//继续下一条对话
{
if(currentIndex < currentData.dialoguePieces.Count)//有下一条对话
{
UpdateMainDialog(currentData.dialoguePieces[currentIndex]);//更新主要对话窗口
}
else
{
dialoguePanel.SetActive(false);//结束对话