ngui 新手引导遮罩按钮高亮后面有黑色蒙版使用NGUI应该怎么实现

unity3d(9)
经常会有需要镂空一张贴图的时候,比如新手引导的界面。使用自定义NGUI Shander可以简单的实现。但是效果还是比较初级
创建两个UITexture,分别为黑色底图maskbg,蒙板mask。mask要层级低于maskbg。
步骤二:准备两个Shader:Unlit - Transparent Colored MaskBG,Unlit - Transparent Colored Mask,分别给maskbg及mask使用。它们都是在NGUI自带渲染UITexture的Shader Unlit - Transparent Colored上改变而来。所以可以复制两份Unlit - Transparent Colored着色器,分别命名好。
步骤三:在Transparent Colored MaskBG加入代码
Comp Equal
只有蒙板缓冲区的值为0时,贴图像素才会被渲染。没添加mask的话能全部显示。
步骤四:在Transparent Colored Mask
Comp Never
Fail Replace
永远不渲染mask贴图,并且将蒙板缓冲区的值置为1。
步骤五:给maskbg及mask这两个UITexture设置你想要的贴图。通过指定mask的位置的大小,可以方便地控制蒙板区域。
不支持Alpha蒙板,后面再研究
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:22497次
排名:千里之外
原创:18篇
(1)(1)(2)(1)(4)(1)(1)(1)(3)(3)NGUI 新手引导
时间: 01:30:30
&&&& 阅读:1034
&&&& 评论:
&&&& 收藏:0
标签:  现在我们的游戏已到了开发后期,这个时候需要做新手引导这一块(恶心的新手引导,真想说游戏行业究竟哪个2B最先想出来要引导的???代码搞的到处都是,改了一次又改!)
  吐槽过后进入正题:主要还是UI相关的操作,3D场景操作引导的东西比较少。这一块我们使用的是unilua来做这件事,因为我们还没考虑用完善的热更新方案(比如ulua)来做新手引导,所以使用unilua也能暂时满足需求。
  具体的做法是:新手引导这一块属于一个单独的界面,其中的Panel层次是比较高的(高于被引导的所有其他界面),其中主要的包括两种基本元素:对话窗口与指引点,对话窗口是只要玩家一点击就进入下一步,而指引点是玩家点击指引点(比如1个圆圈UI圈住1个领奖按钮)同时出发指引点的逻辑以及触发相应按钮的逻辑!
  其中比较麻烦的有几点:
  0.指引点的适配问题:比如在不同的分辨率下,箭头都需要指示在对应的按钮旁边!
  1.要点击的指引点需要高亮
  2.其他不被点击的需要不接收点击事件
  3.如果是使用panel来控制高亮区域的点击,那么能否在新手引导完成之后销毁不需要的panel降低drawcall?
  流程:
  0.关于适配问题:令指引点(有时旁边也需要显示指引点对应的说明文本)中的所有对象都居于一个称为AnchorObj的对象之下,并且它的大小与要点击的按钮或者可点击区域一样大小,然后这个AnchorObj对象在运行时用NGUI的锚点接口(好像是这个SetAnchor(0, 0, 0, 0),有点忘了)动态设置它与需要被引导点击的按钮关联
  1.我们的新手弹窗的层次结构简化为
  NewbiePopup(1)-&Dlg(n) // 新手引导弹窗中包括多个对话窗口
  NewbiePopup(1)-&GuidePoint(n) //新手引导弹窗中包括多个指引点
  然后在NewbiePopup C#脚本中是有两个字典的,使用新手步骤字符串作为key分别保存对话窗口和指引点对象,当然了,使用for循环进行单击事件的绑定。这两个字典还有租用:比如需要显示某个对话窗口或者指引点,在lua脚本中往C#层面传入步骤字符串,然后根据字符串名去索引对应的对象,控制其显示状态!
  2.由于新手引导弹窗panel的depth在所有界面之上,且本身是带BoxCollider的,这个BoxCollider的区域是很大的,所以能拦截所有的点击事件;
  每个需要被引导点击的按钮,其上是加了一个panel组件,然后在显示指引点之前会动态将其panel的depth设置得比新手弹窗大,借此可以得到高亮效果!然后在所有新手引导完成之后将对应指引点上的panel组件销毁掉!这样也能降低drawcall(一个panel是一个drawcall)
大致实现思路就是这样,然后具体的步骤,最好还是线性的一路引导下来,比如第50个步骤是引导领奖可以命名为"AwardStep50", 最好带序号且从小到大,然后相邻两个步骤之间有一定间距,比如下一个步骤可以取"Step100",这样如果之后往中间插入若干个步骤也好扩展!另外如果还有交叉或者&并行性&,则要想法设法实现成线性的!
1个月前做的了,一时兴起写的,就不贴具体的代码或者界面层次结构了!经过实际项目考验,如果有什么错误或者更好的想法可以互相交流一下!谢谢标签:
&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!备忘(36)
转自:/ybgame/p/3844315.html
最近开始接手新手引导的开发,记录下这块相关的心得
首先客户端是Unity,在接手前,前面的同学已经初步完成了新手引导框架的搭建,这套框架比较简单,有优点也有缺点,稍后一一点评
我们的新手引导是由一个个强引导组成的,每个强引导都有一系列的步骤,这套框架实现的功能就是:
1.组织一个强引导(任务)所需的步骤,并可以一步一步前进
2.实现蒙版,遮罩以及高亮引导区
第一个功能比较简单,首先需要有一个新手引导管理器来管理每一个步骤,然后启动第一个步骤,只需要在每一次点击的事件处理中,通知新手引导管理器,结束当前步骤,启动下一个步骤
第二个功能相对麻烦一点,首先每一个步骤可能都会有一个高亮区域,我们需要在不改动原有代码的基础上,实现这个高亮,首先我们增加一个Guide摄像机,这个摄像机的优先级是最高的,他只照射Guide这个层的东西,而这个层的最底部,有一个黑色的蒙版,在步骤开始执行时,我们只需要将要高亮的对象,设置为该层的对象,即可高亮显示,并且蒙版添加一个BoxCollider,来防止玩家点击到蒙版以下的按钮。在该新手引导步骤结束的时候,再将引导区设置回原来的层。
//找到该物件并设置其层
private void SetObjectLayer(int layer, bool isStart)
if (highLightObj != null)
if (isStart)
highLightObjLayer = highLightObj.
CommonTools.SetLayer(highLightObj, layer);
每一个强引导都是一个Prefab,里面记录了每一步的引导区域,在运行状态下,找到引导区域,拖给Prefab的脚本,然后脚本找到该区域的完整路径,拖完每一步的引导区域后,随即保存这个Prefab,这样我们就可以根据路径来找到要高亮的引导区了
上面的引导区拖拽是非常适合策划人员来设计新手引导的,而动态改变引导区所在的层,来实现高亮和屏蔽其他按钮,也是比较巧妙的,但是这里关于步骤完成相关的逻辑,耦合性是非常大的,我们来看一下这里是如何实现下一步的
前人留下的Demo中,是在每一个步骤对应高亮区域的按钮点击回调中,添加一行代码,来通知新手引导管理器步骤完成,也就是说,在实现过程中,每一个需要点击引导区的步骤,都需要添加这么一行代码,工作量大,而且可维护性太差
另外,当发生界面跳转的时候,也需要特殊处理,因为需要等新的界面加载完成,并显示才能执行下一个步骤,所以Demo在界面完全显示的时候,来通知新手引导管理器,而每个界面加载完成的标准又不统一,有些需要等某个特效播放完毕,才会显示,如果对相应的逻辑不是很熟悉,这块地方非常容易出BUG
在这里特别针对上面两个问题做出如下改进,使其无需在原先的代码添加额外的代码来通知步骤完成
但凡有高亮引导区的,都是可以点击的,那么一定有BoxCollider,在我获取这个对象进行设置层级的时候,顺便找到这块引导区域的BoxCollider,一般只会有一个,因为引导的每一步都是明确的,找到这个BoxCollider之后,为他的点击委托添加一个委托,就是完成步骤的委托,然后在步骤结束的时候,去除这个委托,这样就无需在每一个点击事件处,强制添加完成下一步的代码,而是在点击事件中,顺带执行我们的委托(原事件处理委托+新手引导步骤结束委托),这样既不需要添加额外的代码,破坏封装,整体的流程也非常清晰
对于第二个问题,关键是因为在界面未显示完全的时候,我们无法获得相应的高亮区域,这里使用逆向思维,我不等你加载完之后通知我,我主动去扫描你,当我们开始步骤的时候,如果有引导区域先扫描引导区域,启用一个协同,每0.2秒主动查找该引导区域,当界面完全显示出来的时候,一定可以获得引导区域,也不需要在对应的界面加载完成,显示之后写额外的代码来通知新手引导模块这边了
通过上面两个改进,完全解决了新手引导和原有代码逻辑的耦合,将新手引导相关的功能全部内聚在新手引导模块中实现了
【其他改进】
一个是使用消息机制来替代单例,原有的新手引导管理器是一个单例,但当你完成新手引导之后,就不再需要它了,所以使用消息机制来推动新手引导管理器,当新手引导完成之后,消息照常发出,只是处理者不见了
根据服务器下发的消息动态创建,只有当我需要完成新手引导时,才创建新手引导管理器,并初始化新手引导
文字提示和点击屏幕继续,有N种文字提示样式,我们将其实现为一个Prefab,并根据配表显示具体的样式,内容,以及点击屏幕后的处理
【和服务器联调】
在新手引导这块,服务器只做简单的判断,只要不是明显的错误,我们选择信任前端,并做好数据的存储以及下发工作
在游戏的前端,我们需要做好异常处理,以及强制引导流程,当强引导一开始,就要强制执行到结束
我们游戏的引导是这样的,例如去商城购买物品这样的一个引导,都是正常一步一步走的,当走到购买完成的步骤,即通知服务器,完成了这个引导,那么会碰到三种异常,当我们走到一半的时候断掉,当我们购买完成,未来得及通知服务器时断线,当我们通知了服务器之后断线,有不一样的处理
第一种,未购买掉线,则重连后让玩家强制重新开始该引导
第二种,购买后未通知掉线,则强制执行该引导,但开始执行时,做异常检测,例如检测是否存在任务物品,如果是则直接完成任务
第三种,购买通知后掉线,则直接让玩家完成该新手引导
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12044次
排名:千里之外
原创:12篇
转载:27篇
(1)(2)(3)(5)(12)(15)(2)114网址导航

我要回帖

更多关于 蒙版引导 的文章

 

随机推荐