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

相关文章

VSCode开发中有哪些好用的插件和快捷键

《VSCode开发中有哪些好用的插件和快捷键》作为全球最受欢迎的编程工具,VSCode的快捷键体系是提升开发效率的核心密码,:本文主要介绍VSCode开发中有哪些好用的插件和快捷键的相关资料,文中... 目录前言1、vscode插件1.1 Live-server1.2 Auto Rename Tag1.3

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别