任务弹窗更新为任务对话框

1.设计初心

在这里插入图片描述

在玩家接取任务/交付任务时,界面弹出的UI ,需要与玩家互动,点击“接取”“完成”。等等字样
【改动前】
image.png
频繁的手动点击会中断玩家跑图的流畅性,也降低了任务寻路系统的实际体验。
于是现在变成类似FakeObj + 对话框的模式去显示任务的提示字。不再显示任务的接取 / 完成 状态。
自动接取任务。
【改动后】
image.png

2.逻辑梳理

在任务完成时通过ObjNpc.ShowDialg(); 显示弹窗
现在需要改动这里面的内容。

  bool ShowMission(){if (true == SetFindNpcMisCompleted()){return true;}    // 弹出已完成任务if (true == PopCommitNpcDialog()){return true;}// 弹出可接任务if (true == PopAcceptNpcDialog()){return true;}return false;}

拿已经完成的任务来说,需要改动 PopCommitNpcDialog()
现在在任务MisBase配置表中加了新的一列,决定是否启用对话框代替任务弹板。当PopType 字段为1 表示启用
image.png
第一步读取字典,判断显示方式

Tab_MisBase misBase = TableManager.GetMisBaseByID(nMisID);//弹窗
if (misBase.PopType == 0)
{//...          
}
else
{//...StoryPlayerController.PlayMisDialogue(1, MissionManager.MisCommit,nMisID);
}

在PlayMisDialogue方法中我们需要一个任务ID 和 当前任务状态来标识。

    public static bool PlayMisDialogue(int misState,OnFinshMisTips finshMisTips = null,int param = -1){m_curMisState = misState;Init(finshMisTips, param);UIManager.CloseUI(UIInfo.OnlineReminderWindow);return UIManager.ShowUI(UIInfo.StoryPlayer);}

我设置了三个参数,第一个是任务号标识当前任务,第二个需要接受一个对话框显示结束后的逻辑,可能需要更新任务状态,同步服务器(已完成)等等。

    static void Init(OnFinshMisTips finshMisTips = null, int param = -1){m_finshMisTips = finshMisTips;misID = param;m_StoryTab = null;isMisTips = true;if (m_Instance != null){m_Instance.isPlayFinish = false;m_Instance.m_BaseOffset.SetActive(true);}}

Init作为初始化对话框的前序操作。主要是存储数据到文件里。
接下来是异步的关闭提示窗口打开剧情对话框。
播放剧情逻辑

    private void PlayMissionTips(int misState){if (!isMisTips){OnPlayOver();return;}Tab_MisDictionary misDictionary = TableManager.GetMisDictionaryByID(misID);string dialogue = string.Empty;if (misState == 0){dialogue = misDictionary.GetAceptDescbyIndex(0);    }else{dialogue = misDictionary.GetComitDescbyIndex(0);}int curNpcId = misState == 0 ? misDictionary.AceptNpcDataID : misDictionary.ComitNpcDataID;//生成对话框头像InitCharUI(curNpcId);m_strAniDialog = dialogue;ShowAniDialogEnd();m_fStoryTimer = 5f;isMisTips = false;//播放结束后处理m_curMisState = -1;}

初始化对话框人物头像和角色信息

image.png

 private void InitCharUI(int nSpeakerID){string strSpeakerName = string.Empty;int nDataID = nSpeakerID;Obj_Char objChar = null;if (GlobeVar.INVALID_ID == nDataID){// 主角nDataID = ObjManager.MainPlayer.RoleBaseID;strSpeakerName = ObjManager.MainPlayer.RoleName;m_SpeakerName.text = strSpeakerName;if (m_NpcFakeObj){m_NpcFakeObj.gameObject.SetActive(false);}if (m_ChildFakeObj){m_ChildFakeObj.gameObject.SetActive(false);}// 已经有缓存了if (m_PlayerFakeObj != null){m_PlayerFakeObj.gameObject.SetActive(true);m_PlayerFakeObj.ResetFakeObjTransform();RefixFakeObjCamera(m_PlayerFakeObj);return;}// 创建模型GameManager.CurActiveScene.ShowFakeCamera(true);m_PlayerFakeObj = m_UIObjTexture.ShowMainPlayerFakeObj(FAKEOBJTYPE.HALF, RefixFakeObjCamera);return;}else if (-2 == nDataID){// 孩子if (m_PlayerFakeObj){m_PlayerFakeObj.gameObject.SetActive(false);}if (m_NpcFakeObj){m_NpcFakeObj.gameObject.SetActive(false);}// 已经有缓存了if (m_ChildFakeObj != null){m_ChildFakeObj.gameObject.SetActive(true);m_ChildFakeObj.ResetFakeObjTransform();RefixFakeObjCamera(m_ChildFakeObj);return;}ChildInfo m_CurChild = null;if (GameManager.PlayerDataPool.PlayerBirthManager.IsHaveSelfChild(true)){m_CurChild = GameManager.PlayerDataPool.PlayerBirthManager.m_ChildInfo;}if (m_CurChild == null){return;}else{strSpeakerName = m_CurChild.m_Name;m_SpeakerName.text = strSpeakerName;int childType = m_CurChild.GetChildType();Tab_ChildInfo tabChildInfo = TableManager.GetChildInfoByID(childType);if (tabChildInfo != null){Tab_CharModel charModel = TableManager.GetCharModelByID(tabChildInfo.BodyIdFakeObj);if (charModel != null){AvatarLoadInfo info = ChildFashionManager.GetChildAvatarInfo(m_CurChild);GameManager.CurActiveScene.ShowFakeCamera(true);//m_ChildFakeObj = ObjManager.CreateFakeObj(charModel.HalfFakeOjbID, info, GlobeVar.INVALID_ID, "Child", null, GlobeVar.FAKEOBJ_LAYER, GlobeVar.INVALID_ID, RefixFakeObjCamera);m_ChildFakeObj = m_UIObjTexture.ShowFakeObj(charModel.HalfFakeOjbID, info, -1, -1, -1,RefixFakeObjCamera);return;}}}}else{// 普通NPCTab_NpcAttr NpcAttr = TableManager.GetNpcAttrByID(nDataID);if (NpcAttr != null){//冒牌师姐任务特殊处理,npc名字改成玩家名字if (nDataID == 8345 && GameManager.RunningScene == (int)SCENE_DEFINE.SCENE_MAOPAISHIJIE){strSpeakerName = ObjManager.MainPlayer.RoleName;                   }else {strSpeakerName = NpcAttr.Name;}m_SpeakerName.text = strSpeakerName;if (m_PlayerFakeObj){m_PlayerFakeObj.gameObject.SetActive(false);}if (m_ChildFakeObj){m_ChildFakeObj.gameObject.SetActive(false);}// 已经有缓存了if (m_NpcFakeObj != null && m_NpcFakeObj.gameObject.name == nDataID.ToString()){m_NpcFakeObj.gameObject.SetActive(true);m_NpcFakeObj.ResetFakeObjTransform();RefixFakeObjCamera(m_NpcFakeObj);return;}// 创建模型Tab_RoleBaseAttr RoleBase = TableManager.GetRoleBaseAttrByID(nDataID);if (RoleBase != null){objChar = ObjManager.FindObjCharInSceneByData(nDataID);if (objChar != null){Tab_CharModel charModel = TableManager.GetCharModelByID(RoleBase.CharModelID);if (charModel != null){if (m_NpcFakeObj != null){GameObject.DestroyImmediate(m_NpcFakeObj.gameObject);}GameManager.CurActiveScene.ShowFakeCamera(true);//m_NpcFakeObj = ObjManager.CreateFakeObj(charModel.HalfFakeOjbID, objChar, nDataID.ToString(), null, GlobeVar.FAKEOBJ_LAYER, RefixFakeObjCamera);                           m_NpcFakeObj = m_UIObjTexture.ShowFakeObj(charModel.HalfFakeOjbID, objChar, RefixFakeObjCamera);return;}}else{// 找不到Tab_CharModel charModel = TableManager.GetCharModelByID(RoleBase.CharModelID);if (charModel != null){if (m_NpcFakeObj != null){GameObject.DestroyImmediate(m_NpcFakeObj.gameObject);}int nNpcProfession = GlobeVar.INVALID_ID;AvatarLoadInfo info = new AvatarLoadInfo();info.m_BodyId = charModel.Id;//增加Npc头身分离逻辑Tab_NpcAttr npcAttr = TableManager.GetNpcAttrByID(nDataID);if (npcAttr != null && npcAttr.IsHeadBodyLeave == 1){Tab_NpcModelInfo modelinfo = TableManager.GetNpcModelInfoByID(nDataID);if (modelinfo != null){info.m_FaceId = modelinfo.FaceModelId;info.m_HairId = modelinfo.HairModelId;if (modelinfo.WeaponModelId != -1){info.m_WeaponId = modelinfo.WeaponModelId;nNpcProfession = modelinfo.AvatarProfession;}}}GameManager.CurActiveScene.ShowFakeCamera(true);//m_NpcFakeObj = ObjManager.CreateFakeObj(charModel.HalfFakeOjbID, info, -1, nDataID.ToString(), null, GlobeVar.FAKEOBJ_LAYER, GlobeVar.INVALID_ID, RefixFakeObjCamera);                          m_NpcFakeObj = m_UIObjTexture.ShowFakeObj(charModel.HalfFakeOjbID, info, nNpcProfession, -1, -1,RefixFakeObjCamera);return;}}}}}}

他会根据NPCid 分为三类,玩家、场景NPC 和其他Obj 头像(可能是一团火、或者怪物 )
他们读取的配置表不同。
ShowAniDialogEnd()的内容很简单,大概就是把任务提示的内容,保存到本地str,便于后续播放。

播放字幕

在FixUpdate中更新内容

   void FixedUpdate(){if(isPlayFinish)return;Tick_PlayStory();}

逻辑如下

void Tick_PlayStory(){if (false != m_bAniDialog){return;}if (StoryTriggerCtl.Instance.IsPlaying()){return;}if (m_fStoryTimer == GlobeVar.INVALID_ID || m_fStoryTimer <= 0){if (!isMisTips){if (m_nextBlackScreenId > 0 && !m_bAniDialog){StoryTriggerCtl.Instance.ToStartBlackScreen(m_nextBlackScreenId, onPlayFinished: PlayNextCallback);m_nextBlackScreenId = -1;}else{PlayNext();}}else{PlayMissionTips(m_curMisState);}}else{m_fStoryTimer -= Time.fixedDeltaTime;}}

当下一个对话内容不为空的时候,PlayNext()
主要是从对应的剧情字典Tab_StoryContent中取相应播放的文案。

void PlayNext(){if (m_bAniDialog){// 动态文字展示ShowAniDialogEnd();}else{if (m_StoryTab == null){OnPlayOver();return;    }m_nStoryIndex++;Tab_StoryContent mStoryItem = TableManager.GetStoryContentByID(m_StoryTab.StoryID, m_nStoryIndex);if (null == mStoryItem){OnPlayOver();return;    }UpdateStoryUI(mStoryItem);//更新下一组对话框时间m_fStoryTimer = mStoryItem.LifeTime;JudgeSpeaker(mStoryItem);if (mStoryItem.BlackScreenEffect > 0)m_nextBlackScreenId = mStoryItem.BlackScreenEffect;}}

更新时间间隔在 m_fStoryTimer = mStoryItem.LifeTime;中
在FixUpdate中
m_fStoryTimer -= Time.fixedDeltaTime;计时

任务内容以对话框形式显示

1.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/743052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字逻辑-时序逻辑电路一

一、实验目的 &#xff08;1&#xff09;熟悉触发器的逻辑功能及特性。 &#xff08;2&#xff09;掌握集成D和JK触发器的应用。 &#xff08;3&#xff09;掌握时序逻辑电路的分析和设计方法。 二、实验仪器及材料 三、实验内容及步骤 1、用D触发器&#xff08;74LS74&am…

idea Springboot 组卷管理系统LayUI框架开发mysql数据库web结构java编程计算机网页

一、源码特点 springboot 组卷管理系统是一套完善的完整信息系统&#xff0c;结合mvc框架和LayUI框架完成本系统springboot spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整…

ES6(三):Iterator、Generator、类的用法、类的继承

一、迭代器Iterator 迭代器是访问数据的一个接口&#xff0c;是用于遍历数据结构的一个指针&#xff0c;迭代器就是遍历器 const items[one,two,three];//创建新的迭代器const ititems[Symbol.iterator]();console.log(it.next()); done&#xff1a;返回false表示遍历继续&a…

Python 查找PDF中的指定文本并高亮显示

在处理大量PDF文档时&#xff0c;有时我们需要快速找到特定的文本信息。本文将提供以下三个Python示例来帮助你在PDF文件中快速查找并高亮指定的文本。 查找并高亮PDF中所有的指定文本查找并高亮PDF某个区域内的指定文本使用正则表达式搜索指定文本并高亮 本文将用到国产第三方…

linux安全--CentOS7安装Tomcat,远程管理ManagerApp

目录 1.Tomcat安装 2.Tomcat远程管理 1.Tomcat安装 下载安装包并解压 tar xf apache-tomcat-7.0.54.tar.gz -C /usr/local/apache-tomcat_7.0.54/tomcat启停 启动 ./startup.sh 停止 ./shutdown.sh 2.Tomcat远程管理 找到tomcat文件夹中webapps/manager/META-INF/contex…

Linux系统---Haproxy高性能负载均衡软件

目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 3.Haproxy调度算法原理 3.1RR&#xff08;Round Robin&#xff09; 3.2LC&#xff08;Least Connections&#xff09; 3.3SH&#xff08;Source Hashing&#xff09; 二、安装Haproxy 1.yum安装 2.第三方rpm包安…

Android中compile,implementation和api的区别,以及gradle-wrapper的详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a; compile,implementation和api的区别和其作用 compile和api会进行传递…

【深度学习目标检测】二十三、基于深度学习的行人检测计数系统-含数据集、GUI和源码(python,yolov8)

行人检测计数系统是一种重要的智能交通监控系统&#xff0c;它能够通过图像处理技术对行人进行实时检测、跟踪和计数&#xff0c;为城市交通规划、人流控制和安全管理提供重要数据支持。本系统基于先进的YOLOv8目标检测算法和PyQt5图形界面框架开发&#xff0c;具有高效、准确、…

叶子分享站PHP源码

叶子网盘分享站PHP网站源码&#xff0c;创建无限级文件夹&#xff0c;上传文件&#xff0c;可进行删除&#xff0c;下载等能很好的兼容服务器。方便管理者操作&#xff0c;查看更多的下载资源以及文章&#xff0c;新增分享功能&#xff0c;异步上传文件/资源等 PHP网盘源码优势…

Unix环境高级编程-学习-05-TCP/IP协议与套接字

目录 一、概念 二、TCP/IP参考模型 三、客户端和服务端使用TCP通信过程 1、同一以太网下 四、函数介绍 1、socket &#xff08;1&#xff09;声明 &#xff08;2&#xff09;作用 &#xff08;3&#xff09;参数 &#xff08;4&#xff09;返回值 &#xff08;5&…

三星泄露微软 Copilot 新功能:用自然语言操控各种功能

3 月 11 日消息&#xff0c;微软计划本月晚些时候发布新款 Surface 电脑和适用于 Windows 11 的 Copilot 新功能&#xff0c;但三星似乎等不及了&#xff0c;在其即将推出的 Galaxy Book4 系列产品宣传材料中泄露了一些即将到来的 Copilot 功能。 三星官网上发布的图片证实了此…

在centOS服务器安装docker,并使用docker配置nacos

遇到安装慢的情况可以优先选择阿里镜像 安装docker 更新yum版本 yum update安装所需软件包 yum install -y yum-utils device-mapper-persistent-data lvm2添加Docker仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep…

SQLite—免费开源数据库系列文章目录

SQLite系列相关文章较多特开本文为了便于读者阅读特写了本索引和目录之用本文将不断更新中有需要的读者可以收藏本文便于导航到各个专题( 持续更新中......)。收藏一篇等于收藏一个系列文章 简介类&#xff1a; SQLite——世界上部署最广泛的免费开源数据库&#xff08;简介&…

【海贼王的数据航海】探究二叉树的奥秘

目录 1 -> 树的概念及结构 1.1 -> 树的概念 1.2 -> 树的相关概念 1.3 -> 树的表示 1.4 -> 树在实际中的运用(表示文件系统的目录树结构) 2 -> 二叉树概念及结构 2.1 -> 二叉树的概念 2.2 -> 现实中的二叉树 2.3 -> 特殊的二叉树 2.4 ->…

Post请求出现Request header is too large

问题描述&#xff1a; 在做项目的时候&#xff0c;前端请求体太大的时候&#xff0c;出现Request header is too large问题&#xff0c;后端接口如下&#xff1a; 前端请求接口返回问题如下&#xff1a; 解决方案&#xff1a; 问题原因&#xff1a;这是因为我们在做Springboo…

旅游管理系统|基于SpringBoot+ Mysql+Java+Tomcat技术的旅游管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 用户功能 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 …

反爬虫技术:如何保护你的网站数据安全

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;而爬虫技术则成为了获取这些数据的重要手段之一。然而&#xff0c;对于网站运营者来说&#xff0c;非法爬虫不仅会导致数据泄露&#xff0c;还可能给网站带来巨大的流量压力和安全隐患。因此&#xff0c;本文将探讨如何…

【深度学习】YOLOv9继续训练——断点训练方法

YOLOv9继续训练主要分为两个情况&#xff1a; 其一、训练过程中意外中断&#xff0c;未完成训练预期的epoch数量&#xff1b; 其二、训练完了&#xff0c;但是未收敛&#xff0c;在这个基础上&#xff0c;还想用这个权重、学习率等参数继续训练多一些轮次 一、训练过程中意外…

工作中常用的git命令

git 分布式版本控制系统。 使用远程仓库时候会有多个协议可以选择&#xff0c;使用https不仅仅速度慢&#xff0c;而且每次push都要输入口令。 HEAD 当前版本的指针&#xff0c;当切换本地版本的时候会快速指向指定版本文件 master git为我们创建主分支 origin 远程仓库的名…

npm是如何处理多版本依赖的?

两种模式 nest模式 基本行为&#xff1a; 在require/import时&#xff0c;向上递归查找依赖&#xff0c;直到全局node_modules结束。 特点&#xff1a; 每个包在自己内部管理依赖&#xff0c;结构清晰简单。 不足&#xff1a; 如果A包和B包都依赖了axios&#xff0c;就会导致…