转自:http://www.cnblogs.com/ybgame/p/3844315.html

最近开始接手新手引导的开发,记录下这块相关的心得

首先客户端是Unity,在接手前,前面的同学已经初步完成了新手引导框架的搭建,这套框架比较简单,有优点也有缺点,稍后一一点评

我们的新手引导是由一个个强引导组成的,每个强引导都有一系列的步骤,这套框架实现的功能就是:

1.组织一个强引导(任务)所需的步骤,并可以一步一步前进

2.实现蒙版,遮罩以及高亮引导区

第一个功能比较简单,首先需要有一个新手引导管理器来管理每一个步骤,然后启动第一个步骤,只需要在每一次点击的事件处理中,通知新手引导管理器,结束当前步骤,启动下一个步骤

第二个功能相对麻烦一点,首先每一个步骤可能都会有一个高亮区域,我们需要在不改动原有代码的基础上,实现这个高亮,首先我们增加一个Guide摄像机,这个摄像机的优先级是最高的,他只照射Guide这个层的东西,而这个层的最底部,有一个黑色的蒙版,在步骤开始执行时,我们只需要将要高亮的对象,设置为该层的对象,即可高亮显示,并且蒙版添加一个BoxCollider,来防止玩家点击到蒙版以下的按钮。在该新手引导步骤结束的时候,再将引导区设置回原来的层。

//找到该物件并设置其层
private void SetObjectLayer(int layer, bool isStart)
{
if (highLightObj != null)
{
if (isStart)
{
highLightObjLayer = highLightObj.layer;
} CommonTools.SetLayer(highLightObj, layer);
}
}

每一个强引导都是一个Prefab,里面记录了每一步的引导区域,在运行状态下,找到引导区域,拖给Prefab的脚本,然后脚本找到该区域的完整路径,拖完每一步的引导区域后,随即保存这个Prefab,这样我们就可以根据路径来找到要高亮的引导区了

上面的引导区拖拽是非常适合策划人员来设计新手引导的,而动态改变引导区所在的层,来实现高亮和屏蔽其他按钮,也是比较巧妙的,但是这里关于步骤完成相关的逻辑,耦合性是非常大的,我们来看一下这里是如何实现下一步的

前人留下的Demo中,是在每一个步骤对应高亮区域的按钮点击回调中,添加一行代码,来通知新手引导管理器步骤完成,也就是说,在实现过程中,每一个需要点击引导区的步骤,都需要添加这么一行代码,工作量大,而且可维护性太差

另外,当发生界面跳转的时候,也需要特殊处理,因为需要等新的界面加载完成,并显示才能执行下一个步骤,所以Demo在界面完全显示的时候,来通知新手引导管理器,而每个界面加载完成的标准又不统一,有些需要等某个特效播放完毕,才会显示,如果对相应的逻辑不是很熟悉,这块地方非常容易出BUG

【改进】

在这里特别针对上面两个问题做出如下改进,使其无需在原先的代码添加额外的代码来通知步骤完成

但凡有高亮引导区的,都是可以点击的,那么一定有BoxCollider,在我获取这个对象进行设置层级的时候,顺便找到这块引导区域的BoxCollider,一般只会有一个,因为引导的每一步都是明确的,找到这个BoxCollider之后,为他的点击委托添加一个委托,就是完成步骤的委托,然后在步骤结束的时候,去除这个委托,这样就无需在每一个点击事件处,强制添加完成下一步的代码,而是在点击事件中,顺带执行我们的委托(原事件处理委托+新手引导步骤结束委托),这样既不需要添加额外的代码,破坏封装,整体的流程也非常清晰

对于第二个问题,关键是因为在界面未显示完全的时候,我们无法获得相应的高亮区域,这里使用逆向思维,我不等你加载完之后通知我,我主动去扫描你,当我们开始步骤的时候,如果有引导区域先扫描引导区域,启用一个协同,每0.2秒主动查找该引导区域,当界面完全显示出来的时候,一定可以获得引导区域,也不需要在对应的界面加载完成,显示之后写额外的代码来通知新手引导模块这边了

通过上面两个改进,完全解决了新手引导和原有代码逻辑的耦合,将新手引导相关的功能全部内聚在新手引导模块中实现了

【其他改进】

一个是使用消息机制来替代单例,原有的新手引导管理器是一个单例,但当你完成新手引导之后,就不再需要它了,所以使用消息机制来推动新手引导管理器,当新手引导完成之后,消息照常发出,只是处理者不见了

根据服务器下发的消息动态创建,只有当我需要完成新手引导时,才创建新手引导管理器,并初始化新手引导

文字提示和点击屏幕继续,有N种文字提示样式,我们将其实现为一个Prefab,并根据配表显示具体的样式,内容,以及点击屏幕后的处理

【和服务器联调】

在新手引导这块,服务器只做简单的判断,只要不是明显的错误,我们选择信任前端,并做好数据的存储以及下发工作

在游戏的前端,我们需要做好异常处理,以及强制引导流程,当强引导一开始,就要强制执行到结束

我们游戏的引导是这样的,例如去商城购买物品这样的一个引导,都是正常一步一步走的,当走到购买完成的步骤,即通知服务器,完成了这个引导,那么会碰到三种异常,当我们走到一半的时候断掉,当我们购买完成,未来得及通知服务器时断线,当我们通知了服务器之后断线,有不一样的处理

第一种,未购买掉线,则重连后让玩家强制重新开始该引导

第二种,购买后未通知掉线,则强制执行该引导,但开始执行时,做异常检测,例如检测是否存在任务物品,如果是则直接完成任务

第三种,购买通知后掉线,则直接让玩家完成该新手引导

(转)Unity3D新手引导开发手记的更多相关文章

  1. [转]Unity3D新手引导开发手记

    直接跳转吧  Unity3D新手引导开发手记 看到还不错就直接转过来了,我是有多懒啊

  2. Unity3D新手引导开发手记

    最近开始接手新手引导的开发,记录下这块相关的心得 首先客户端是Unity,在接手前,前面的同学已经初步完成了新手引导框架的搭建,这套框架比较简单,有优点也有缺点,稍后一一点评 我们的新手引导是由一个个 ...

  3. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

  4. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  5. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

  6. [分享]源代码&开发手记:SAE应用“车百科” (Python + SAE + Bottle + Bootstrap) - Bottle - Python4cn(news, jobs)

    [分享]源代码&开发手记:SAE应用"车百科" (Python + SAE + Bottle + Bootstrap) - Bottle - Python4cn(news, ...

  7. Unity3D游戏开发之连续滚动背景

    Unity3D游戏开发之连续滚动背景 原文  http://blog.csdn.net/qinyuanpei/article/details/22983421 在诸如天天跑酷等2D游戏中,因为游戏须要 ...

  8. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  9. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

随机推荐

  1. CodeForces 1070J Streets and Avenues in Berhattan 性质+动态规划

    题目大意: 你有$k$个数,分为$26$种 对于每个数,你可以选择选进$A$集合或者$B$集合或者不选 要求$A$集合中必须有$n$个数,$B$集合中必须有$m$个数 记第$i$种数在$A$集合中的个 ...

  2. 【原创】实战padding oracle漏洞

    首先关于padding oracle漏洞的原理请看: 步入正传~~ 搭建漏洞利用环境Perl 环境下载地址:链接:http://pan.baidu.com/s/1skFxVm1 密码:anuw 首先查 ...

  3. bzoj 2150 最小路径覆盖

    最小路径覆盖问题是:给定一个DAG,该DAG的一个路径覆盖是一个路径的集合,使得每个点属于且仅属于其中一条路径,问题就是求一个大小最小的路径集合. 做法是将每个点A拆成两个点A1,A2,如果A-> ...

  4. 关于php一些问题

    为什么说php是弱语言? 本身不严格区分变量的类型. 为什么说php是动态语言? 程序在运行时可以改变其结构.所谓的动态类型语言,意思就是类型的检查是在运行时做的. 为什么说php是脚本语言? 不需要 ...

  5. oracle_创建表空间、用户、授权等步骤

    --创建表空间(在system用户下才可以创建) //connect system/manager as sysdba:切换到system用户 create tablespace tz datafil ...

  6. sass compass问题小结

    1.中文注释编译报错Invalid GBK character的问题,找到ruby sass安装目录,如D:\Ruby22-x64\lib\ruby\gems\2.2.0\gems\sass-3.4. ...

  7. OpenCV/CUDA/Qt 环境配置小结

    OpenCV Qt CUDA windows环境下 配置 反复装过几次,每次都网搜攻略:自个做个记录 方便以后使用. 碰到OpenCV各种奇怪的错误 先看看 图片imread() 有没有读空 再找其他 ...

  8. SQL 列转行,即多行合并成一条

    需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district] [nvarchar](255) N ...

  9. /dev/rdsk 与 /dev/dsk区别

    /dev/rdsk/c0t0d0s0 裸设备 /dev/dsk/c0t0d0s0 块设备 它们链接的是同一块物理设备,具体区别是在访问方式上. 裸设备是假设硬盘上没有文件系统时的访问方式. 裸设备是按 ...

  10. C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数

    class Empty {     public:     Empty(); // 缺省构造函数     Empty( const Empty& ); // 拷贝构造函数     ~Empty ...