Unity简单实用的文本对话插件,可以做任务说明框

2023-12-07 12:10

本文主要是介绍Unity简单实用的文本对话插件,可以做任务说明框,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实现需求:类似对话,
开始对话,
1.播放问题文字,打字机动画播放文字,鼠标点击播完所有文字,
2.再次点击,播放回答文字。
3.再次播放问题文字。
4.如果第2步没有对应文字,则跳到第1步,第1步没有对应文字则跳到第2步。

引用了DoTween插件和特性拓展插件NaughtyAttributes。
https://github.com/dbrizov/NaughtyAttributes
末尾有百度云链接
在这里插入图片描述
在这里插入图片描述

核心代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
using NaughtyAttributes;
using UnityEngine.Events;
using UnityEditor;
/// <summary>
/// 对话,需引用dotween
/// 设置好,使用play即可
/// </summary>
public enum DialogueType
{speek,answer
}
public class DialogueCrt : MonoBehaviour
{private DialData dataFlag = new DialData();public bool showList = true;[ShowIf("showList")][ReorderableList]public List<DialogueData> dialogueList;private GameObject speakPrefab;private GameObject answerPrefab;private List<GameObject> speakList = new List<GameObject>();private List<GameObject> answerList = new List<GameObject>();private GameObject mNowObj;private int index = 0;private UnityAction mAction;private bool isEnd = false;private bool isKeyDown =false;public bool isUseJson = false;[ShowIf("isUseJson")]public TextAsset json;[Button]private void Json2List(){if (json == null || !isUseJson)throw new System.Exception("json未添加,或者没勾选isUseJson,请勾选isUseJson并添加json");else{Undo.RegisterFullObjectHierarchyUndo(gameObject, "json");dataFlag = JsonUtility.FromJson<DialData>(json.text);dialogueList = dataFlag.dialogueList;showList = true;Debug.Log("成功将json添加到list");}}/// <summary>/// 播放dialogue/// </summary>public void Play(){Debug.Log("play");Remove();isEnd = false;gameObject.SetActive(true);if (speakList.Count > 0){ShowObjText(speakList[index], DialogueType.speek);}}/// <summary>/// 播放dialogue,并添加结束事件/// </summary>/// <param name="action">结束调用事件</param>public void Play(UnityAction action){Debug.Log("playAction");Remove();isEnd = false;gameObject.SetActive(true);if (speakList.Count > 0){ShowObjText(speakList[index], DialogueType.speek);}mAction = action;}/// <summary>/// 结束dialogue/// </summary>public void Close(){DiaEnd();}private void Init(){speakPrefab = Resources.Load<GameObject>("Speak");answerPrefab = Resources.Load<GameObject>("Answer");foreach (DialogueData d in dialogueList){if (true){GameObject obj = Instantiate(speakPrefab, transform);speakList.Add(obj);}if (true){GameObject obj = Instantiate(answerPrefab, transform);answerList.Add(obj);}}Remove();}private void Remove(){EndObjText(mNowObj);index = 0;for (int i = 0; i < speakList.Count; i++){speakList[i].SetActive(false);}for (int i = 0; i < answerList.Count; i++){answerList[i].SetActive(false);}}void Awake(){Init();gameObject.SetActive(false);}void Update(){if (isEnd)return;if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)){if(!isTweenEnd)EndObjText(mNowObj);elseNext();}}private void DiaEnd(){Debug.Log("完成");isEnd = true;gameObject.SetActive(false);if (mAction != null)mAction.Invoke();}private void Next(){if (mNowObj == speakList[index]){ShowObjText(answerList[index], DialogueType.answer);}else if (mNowObj == answerList[index]){index++;if (index >= dialogueList.Count){DiaEnd();return;}ShowObjText(speakList[index], DialogueType.speek);}}private bool isTweenEnd = false;private void ShowObjText(GameObject obj, DialogueType type){mNowObj = obj;string str = null;if (!obj.activeSelf){switch (type){case DialogueType.speek:str = dialogueList[index].speakStr;break;case DialogueType.answer:str = dialogueList[index].answerStr;break;}obj.GetComponentInChildren<Text>().ShowText(str,()=> { isTweenEnd = true; });if (str == null || str == ""){EndObjText(mNowObj);Next();return;}isTweenEnd = false;obj.SetActive(true);}}private void EndObjText(GameObject obj){if (obj != null){obj.GetComponentInChildren<Text>().EndTextAnim();isTweenEnd = true;}}
}[System.Serializable]
public class DialData
{public List<DialogueData> dialogueList;
}
[System.Serializable]
public class DialogueData
{public string speakStr;public string answerStr;}

DoTween动画代码

using UnityEngine.UI;
using DG.Tweening;
using UnityEngine.Events;
using UnityEngine;public static class TextDT
{public static void ShowText(this Text _text, string _str,TweenCallback cb, float _time = 0.4f){_text.text = "";_text.DOText(_str, _time * _str.Length).OnComplete(cb);}public static void EndTextAnim(this Text _text){_text.DOGoto(1000f, false);}
}

使用2018.4.2制作
百度云盘:链接:https://pan.baidu.com/s/1jkk2Ru_FdnRJ_OZkf8frtw 密码:rg1w

如果文章对你有帮助,不妨关注我一下,点个赞。
我会一直分享Unity开发中解决的坑,分享学到的技术,也会分享读书心得和理财心得,谢谢大家。

这篇关于Unity简单实用的文本对话插件,可以做任务说明框的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465820

相关文章

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除