NGUI制作游戏弹出框是怎样如何实现wifi全覆盖对界面覆盖

【unity系统模块开发】(11)
开发游戏,特别是mmo手游的时候经常需要开发的一个需求是,点击某个装备,在它附近的位置生成一个tips界面,介绍装备功能和各种信息。
像上面红色框框里的这个。
这个主要的问题是 根据点击的GameObject对应生成这个详情界面时,详情界面位置需要合理摆放(不能显示不到,不能遮挡等)
基本的思路是,
首先找到GameObject的position,
把手机屏幕大概分成四个象限,知道这个GameObject大概在这个屏幕的哪个象限(左上,左下,右上,右下)
根据象限来判断详情界面应该在GameObject的哪一边生成
(比如如果GameObject在右下,则详情界面应该在GameObject的左上方生成)
根据上面的position加上GameObject的宽的一半,加上自己界面的宽的一半,再加几个像素进行偏移,
这样就可以摆放好详情界面的位置。
不过这里有个比较重要的问题是,通常情况下,GameObject和自己的详情界面一般不会在同一个camera下。
所以这里首先解决的是要这两边的坐标撸通。
这里简单说一下,
在unity里基本上有4种坐标
世界坐标,相对坐标,屏幕坐标,相对屏幕0,0点坐标
由于我们要在Camera之前切换坐标,为了简化,我们不要去算世界坐标和相对坐标,通过屏幕坐标进行转化
意思就是,
找到GameObject的世界坐标,通过接口算出它自己Camera的屏幕坐标,把屏幕坐标传给详情界面,
详情界面通过把GameObject的屏幕坐标通过自己Camera的转化接口转化成世界坐标,摆放位置。
这样就能计算出在不同camera的情况下,屏幕上同一个点坐标的转化。
下面贴上代码
public void ResetPosition(GameObject relativeObject,Camera cam)
//获取触发这个dialog的gameObject相对于屏幕的position
Vector3 relativePosition = cam.WorldToScreenPoint(relativeObject.transform.position);//通过世界坐标去获取
Vector3 relativePositionPercent = cam.WorldToViewportPoint(relativeObject.transform.position);//获取GameObject相对于屏幕0,0点的位置(x,y范围在0,1之间)
Vector3 newPosition = CDialogManager.Instance.GetCamera(eUIIndex.Index_OrthographicThree).ScreenToWorldPoint(relativePosition);//转回世界坐标摆放
m_mainGameObject.transform.position = newP//先摆放position,之后再把总偏移值加上
Bounds realativeObjectBounds = NGUIMath.CalculateRelativeWidgetBounds(relativeObject.transform);//算出GameObject边框大小
float realativeObjectWidth = realativeObjectBounds.extents.x;
float realativeObjectHeight = realativeObjectBounds.extents.y;
Bounds objectBounds = NGUIMath.CalculateRelativeWidgetBounds(m_mainGameObject.transform);//算出自己边框大小
float objectWidth = objectBounds.extents.x;
float objectHeight = objectBounds.extents.y;
float spacingX = 5;//5像素偏移
float spacingY = 5;
float offsetX = 0;//总偏移
float offsetY = 0;
if (relativePositionPercent.x &= 0.5 && relativePositionPercent.y &= 0.7)//为了效果更好,y轴上分为上中下三个象限
-realativeObjectWidth - objectWidth - spacingX;
-realativeObjectHeight - objectHeight - spacingY;
else if(relativePositionPercent.x &= 0.5 && relativePositionPercent.y &= 0.3)
offsetX = -realativeObjectWidth - objectWidth - spacingX;
offsetY = realativeObjectHeight +objectHeight + spacingY;
else if (relativePositionPercent.x &= 0.5 && relativePositionPercent.y & 0.3 && relativePositionPercent.y & 0.7)
offsetX = -realativeObjectWidth - objectWidth - spacingX;
offsetY = 0;
else if (relativePositionPercent.x &= 0.5 && relativePositionPercent.y &= 0.7)
offsetX = realativeObjectWidth + objectWidth + spacingX;
offsetY = -realativeObjectHeight - objectHeight - spacingY;
else if (relativePositionPercent.x &= 0.5 && relativePositionPercent.y &= 0.3)
offsetX = realativeObjectWidth + objectWidth + spacingX;
offsetY = realativeObjectHeight + objectHeight + spacingY;
else if (relativePositionPercent.x &= 0.5 && relativePositionPercent.y & 0.3 && relativePositionPercent.y & 0.7)
offsetX = realativeObjectWidth + objectWidth + spacingX;
offsetY = 0;
&span style=&white-space:pre&& &/span&//最后通过相对坐标进行偏移
m_mainGameObject.transform.localPosition = new Vector3(m_mainGameObject.transform.localPosition.x + offsetX, m_mainGameObject.transform.localPosition.y + offsetY, 0);
这里有个问题要注意!!
可能在计算widget宽度的时候GameObject不在原点上。所以优化一下应该是这样:
Bounds realativeObjectBounds = NGUIMath.CalculateRelativeWidgetBounds(relativeObject.transform);//算出GameObject边框大小
float realativeObjectWidth = realativeObjectBounds.extents.x - realativeObjectBounds.center.x;
float realativeObjectHeight = realativeObjectBounds.extents.y - realativeObjectBounds.center.y;
Bounds objectBounds = NGUIMath.CalculateRelativeWidgetBounds(m_mainGameObject.transform);//算出自己边框大小
float objectWidth = objectBounds.extents.x - objectBounds.center.x;
float objectHeight = objectBounds.extents.y - objectBounds.center.y;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:293625次
积分:3663
积分:3663
排名:第7202名
原创:99篇
转载:49篇
评论:58条
(1)(5)(7)(3)(1)(1)(15)(1)(6)(1)(8)(2)(2)(1)(2)(4)(7)(1)(9)(3)(8)(1)(1)(2)(2)(2)(2)(1)(3)(1)(5)(3)(2)(4)(5)(7)(2)(9)(7)游戏UI是这样一步步设计出来的_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
游戏UI是这样一步步设计出来的
上传于||文档简介
&&献给初学者:从零开始,游戏UI是这样一步步设计出来的!
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢  Unity3D的uGUI听说最近4.6即将推出,但是目前NGUI等UI插件大行其道并且已经非常成熟,所以我们还是先看眼前吧。
一、实现思想
  商城的功能是很多游戏都拥有的,按下一个界面按钮,弹出一个窗体。
  然后是商城中的商品可以拖动,既可以用手,也可以用滑条等等,至于点击购买就不单单是UI层的事了。等到实现NDate的时候再进行讨论。
二、实现背景
  1、NGUI-&Open-&Prefab tool bar ,拖一个black widget进去
&&&&& 2、之后布局如下,这些应该没什么难度,弄好锚点,depth设好即可
&》BG(Sprite)做高亮
-》 Daimond(UITexture)钻石栏
-》CreateDiamond(UITexture)+按钮
-》Num(UILable)数量
Gold(UITexture)
Hp(UITexture)
&&& 3、然后差不多是这个样子
三、按钮弹出商城
  1、为了示范我们就做一个商城界面即可,其他的斗大同小异,我一般建议一个新的UI界面就用一个新的Panel,新建一个Panel
  2、添加美工给的背景等等,布局如下,比较麻烦的Scroll View,这个我就不加赘述,大家可以看我的博客,NGUI学习笔记Tutorial 4
-》Bg(Sprite)
-& Control - Simple Vertical Scroll Bar
-& Name(Lable)
-& Return(Sprite button)
-& Scroll View
-&Grid(垂直列表)
-&Grid(水平列表)
-&Sprite0(商品图片)
-&CurrentKind
  界面如下:
  3、搞定了商城界面,我们需要做一个点击弹出效果,这个是借助Tween Scale实现的。不得不说NGUI的插件做的真心很好,很多代码都替我们节省了。
 && 首先:
  然后在ShopRoot 挂载Tween Scale,set active 为false 即可
  最后,我们如果要返回的话,需要商城自己的Return来返回,一样的思想
  注意:这里有个问题,我在根节点挂载Tween Scale的时候,有时候会出现UI不见消失不见的情况,不知道什么原因,后来就没出来了,希望大神指点一下。
四、功能实现
  弹出:
 & 基本上就这些,有了UI插件,做UI还是很愉快的,可以专心于UI效果,而不是构造它,祝大家生活愉快。
阅读(...) 评论()&&&&popwindow实现可以在界面上弹出框
popwindow实现可以在界面上弹出框
popwindow弹出框,实现可以在界面上弹出框
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
移动开发下载排行}

我要回帖

更多关于 视图覆盖弹出对话框 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信