当前位置: 首页 > news >正文

南城网站建设公司咨询开封府景点网站建设的目的

南城网站建设公司咨询,开封府景点网站建设的目的,永久免费建网站,网站开发项目经验描述怎么写现在我们的文本仍然是单句显示的,这还不是我们想要的效果,本期让我们完善对话流程,并使用SO(ScriptableObject)来进行一段对话序列的配置和动态加载。 最终效果功能展示 功能一:场景内可根据资源序号ID来…

       现在我们的文本仍然是单句显示的,这还不是我们想要的效果,本期让我们完善对话流程,并使用SO(ScriptableObject)来进行一段对话序列的配置和动态加载。

最终效果功能展示

功能一:场景内可根据资源序号ID来动态加载对话数据

功能二:按空格进行下一句,如果当前对话未打印完毕,按下空格则快进直接显示全部文本。

功能三:支持对话中可委托触发

这里碍于篇幅我会分析几个类中的部分关键点,关键的功能源码在后文。

一.功能分析

1.DialogueDataSequence

对话数据SO类

职能

创建SO文件,易于配置对话数据。

注意类前需要使用特性[CreateAssetMenu()]

示例代码

[CreateAssetMenu(menuName = "编辑器界面的创建目录", fileName = "创建出的文件的名称")]

using System;
using System.Collections.Generic;
using UnityEngine;[CreateAssetMenu(menuName = "Data/DialogueDataLine", fileName = "DialogueDataLine")]
public class DialogueDataSequence : ScriptableObject
{[Header("对话线ID")]public int ID;[Header("自动下一句")]public bool canAutonNext;[Header("可以快进")]public bool canQuickShow;[Header("打字机效果")]public bool needTyping;[Header("当前话语序号")]public int currentIndex;[Header("淡入时间")]public float fadeDuration;[Header("对话线")]public List<DialogueData> dialogueLine = new List<DialogueData>();
}[Serializable]
public class DialogueData
{[Header("讲述者")]public string speaker;[Multiline][Header("内容文本")]public string content;
}

2.DialoguePanel 

对话框面板

对话框面板无需考虑当前是哪个对话序列,只接收显示的必要信息。

职能

显示一句对话文本信息

关键字段

  [Header("高级文本")]public AdvancedText displayText;[Header("文本讲述者")]public TMP_Text speakerNameText;//可以快速显示bool _canQuickShow;//自动显示下一句bool _canAutonNext;

关键函数

  /// <summary>/// 显示对话框/// </summary>/// <param name="speaker">讲述者</param>/// <param name="content">内容</param>/// <param name="needTyping">使用打字机效果</param>/// <param name="fadeDuration">打印间隔</param>/// <param name="canQickShow">快速显示</param>/// <param name="canAutonNext">自动下一句</param>public void ShowDialogue(string speaker, string content, bool needTyping = true, float fadeDuration = 0.2f, bool canQickShow = true, bool canAutonNext = false) {speakerNameText.text = speaker;speakerNameText.GetComponent<Animator>().SetTrigger("Show");if (displayText.text != "") {displayText.TextDisAppear();}_canQuickShow = canQickShow;_canAutonNext = canAutonNext;if (needTyping)StartCoroutine(displayText.ShowText(content,E_DisplayType.Typing,fadeDuration));elseStartCoroutine(displayText.ShowText(content,E_DisplayType.Fading,fadeDuration));}

3.DialogueManager

对话管理器

职能

1.持有对当前对话序列SO文件的引用。通过外部传入的序列号加载目标对话序列。

2.开启和关闭对话框面板。

3.操作当前的对话序列(如添加对话委托)

关键字段

  [Header("当前进行的对话序列")]public DialogueDataSequence currentDialogueSq;DialoguePanel D_Panel;//对话面板

功能函数

1.BeginDialogueSequence()

暴露开始对话及开始下一句对话接口,若下一句已经是最后一句,则关闭对话框。

  /// <summary>/// 根据对话线的ID开启一段对话/// </summary>/// <param name="ID">对话线序号</param>/// <param name="action">对话委托</param>public void BeginDialogueSequence(int ID, Action action = null){//加载目标对话序列,获得其引用currentDialogueSq = Resources.Load<DialogueDataSequence>("StaticData/DialogueLine/" + ID);currentDialogueSq.currentIndex = 0;action?.Invoke();//接收对话委托UIManager.Instance.ShowPanel<DialoguePanel>(panel =>{
//开启对话框,从对话序列的开始显示对话文本内容panel.ShowDialogue(currentDialogueSq.dialogueLine[currentDialogueSq.currentIndex].speaker,                                          currentDialogueSq.dialogueLine[currentDialogueSq.currentIndex].content,currentDialogueSq.needTyping, currentDialogueSq.fadeDuration,currentDialogueSq.canQuickShow, currentDialogueSq.canAutonNext);D_Panel = panel;});Debug.Log(currentDialogueSq.currentIndex);ActionCheck();}/// <summary>/// 每结束一句对话时检查是否有委托需要执行/// </summary>void ActionCheck(){for (int i = 0; i < currentDialogueSq.eventList.Count; i++){if (currentDialogueSq.eventList[i].eventIndex == currentDialogueSq.currentIndex){currentDialogueSq.eventList[i].MyEvent?.Invoke();Debug.Log("检测到对话事件触发!");}}}

2.NextDialogue()

当前对话序列内索引自增,显示下一句对话

  /// <summary>/// 用于隐藏当前文本并显示下一句文本,用于外部调用(如面板或按钮)/// </summary>public IEnumerator NextDialogue(){if (currentDialogueSq.currentIndex + 1 < currentDialogueSq.dialogueLine.Count){currentDialogueSq.currentIndex++;D_Panel.ShowDialogue(currentDialogueSq.dialogueLine[currentDialogueSq.currentIndex].speaker,currentDialogueSq.dialogueLine[currentDialogueSq.currentIndex].content,currentDialogueSq.needTyping, currentDialogueSq.fadeDuration,currentDialogueSq.canQuickShow, currentDialogueSq.canAutonNext);Debug.Log(currentDialogueSq.currentIndex);ActionCheck();}else{EndDialogueSquence();//结束对话}yield return null;}/// <summary>/// 结束一段对话序列/// </summary>void EndDialogueSquence(){currentDialogueSq?.eventList.Clear();currentDialogueSq = null;UIManager.Instance.HidePanel<DialoguePanel>();}//退出游戏重置对话状态
private void OnApplicationQuit()
{currentDialogueSq?.eventList.Clear();currentDialogueSq = null;
}

       由于我个人框架的实现与UI部分联系密切的问题,考虑给出完整源码文章会过于冗余且侧重点失衡,上面分享的是我实现过程中的关键功能片段,需要朋友们结合实际应用适配到自己的项目中,原理的大致通用的,当然上述代码某些地方肯定是能够进一步优化拓展的,也欢迎大佬不吝赐教。

二.实验结果测试

1.测试脚本

using UnityEngine;
public class TMPTest : MonoBehaviour
{[Header("对话序号")]public int dialogueID;private void Update(){if (Input.GetKeyDown(KeyCode.E)){DialogueManager.Instance.BeginDialogueSequence(dialogueID, () =>{DialogueManager.Instance.AddDialogueEvent(1, 2, T1);DialogueManager.Instance.AddDialogueEvent(1, 4, T2);});}}void T1(){Debug.Log("对话内事件1触发");}void T2(){Debug.Log("对话内事件2触发");}
}

2.数据配置

这里我挂载了测试脚本,并配置了一段对话数据,序号为1

三.实验结果展示

打印效果:

对话中事件触发效果:

三.后文

       由于我个人框架的实现与UI部分联系密切的问题,考虑给出完整源码文章会过于冗余且侧重点失衡,上面分享的是我实现过程中的关键功能片段,需要朋友们结合实际应用适配到自己的项目中,原理的大致通用的,当然上述代码某些地方肯定是能够进一步优化拓展的,也欢迎大佬不吝赐教。

本篇完!

http://www.dtcms.com/a/420841.html

相关文章:

  • php 网站后台海报模板免费网站
  • 公司网站开发费用记入什么科止专业合肥网站建设
  • 章丘营销型网站设计公司开发公司财务管理制度
  • 网站环境搭建好后怎么做网站西安高端模板建站
  • 海南省生态文明村建设促进会网站怎么做展示网站
  • 3.5 介质访问控制 (答案见原书 P93)
  • 建设网站哪些公司好仁茂网络seo
  • 大家称赞的网站建设南京宣传片制作公司
  • 怎么用网吧电脑做网站服务器吗深圳头条新闻在线看
  • 甘肃省住房建设厅网站怎么更新电脑的wordpress
  • 青岛做网站的公司有哪些在线代理浏览网站免费
  • 高端公司网站网站专题模板
  • 晟阳建设官方网站北京网页设计与制作
  • 建设银行激活社保卡网站怎么做qq盗号网站
  • wordpress边框给网站做排名优化学什么好处
  • 精品手机网站案例东莞建网站的公
  • 咸鱼网站交易付款怎么做住房城乡建设局网站首页
  • 我的世界找建筑网站西安网站建设 乐云seo
  • 做网站页面怎么做网站建设如何查看后台数据库
  • 网站建设案例要多少钱品牌建设青之见
  • 品牌网站推广方案哪个网站做logo好
  • 盐城建设企业网站个人空间备案网站名称
  • 企业备案网站名称要求知名平面广告设计公司
  • 怎么做英文的网站企业网站开源代码
  • 三雷网站程序wordpress拖拽式布局
  • 成都市建网站公司学生登录注册入口
  • 找别人网站开发没给我源代码如何访问国外网站
  • 南昌网站建设网站推广如何查看网站做没做百度推广
  • 站长工具端口查询建设官网流程
  • 快速刷网站排名wordpress后台菜单管理