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

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;系统具有完整…

小程序开发——获取设备信息 API(一)

ty.device.getDeviceInfo 获取设备的设备信息 需引入DeviceKit&#xff0c;且在>1.2.6版本才可使用 请求参数 Object object 属性类型默认值必填说明deviceIdstring是deviceId 设备 id 支持跨面板获取其他的设备信息&#xff0c;当前面板可以传当前设备的 id 来进行获取d…

Grad_CAM图

我们要将网络学习到的特征进行可视化。 import os import cv2 import numpy as np import torch from PIL import Image import matplotlib.pyplot as plt from torchvision import models from torchvision import transforms from utils import GradCAM, show_cam_on_image,…

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…

人工智能(AI)-机器学习-深度学习-大语言模型LLM(chatgtp)

【一文读懂“大语言模型” - CSDN App】 国产大语言模型是指由中国公司或机构开发的大规模预训练语言模型。目前&#xff0c;国产大语言模型主要有以下几种&#xff1a; 中文GPT&#xff08;GPT-3&#xff09;&#xff1a;由华为公司开发&#xff0c;是一个基于Transformer架…

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网盘源码优势…

蓝桥杯 递增三元组

Problem: 蓝桥杯 递增三元组 文章目录 思路解题方法复杂度前缀和Code二分Code双指针Code 思路 这是一个关于数组的问题&#xff0c;我们需要找到一个递增的三元组。这个三元组由三个数组中的元素组成&#xff0c;每个数组提供一个元素&#xff0c;并且这三个元素满足递增的关系…

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参考 …