码迷,mamicode.com
首页 > 编程语言 > 详细

【小松教你手游开发】【unity实用技能】根据上一个GameObject坐标生成的tips界面

时间:2016-08-04 19:27:00      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

开发游戏,特别是mmo手游的时候经常需要开发的一个需求是,点击某个装备,在它附近的位置生成一个tips界面,介绍装备功能和各种信息。

 技术分享

 

像上面红色框框里的这个。

这个主要的问题是 根据点击的GameObject对应生成这个详情界面时,详情界面位置需要合理摆放(不能显示不到,不能遮挡等)

 

基本的思路是,

首先找到GameObject的position,

把手机屏幕大概分成四个象限,知道这个GameObject大概在这个屏幕的哪个象限(左上,左下,右上,右下)

根据象限来判断详情界面应该在GameObject的哪一边生成

(比如如果GameObject在右下,则详情界面应该在GameObject的左上方生成)

根据上面的position加上GameObject的宽的一半,加上自己界面的宽的一半,再加几个像素进行偏移,

这样就可以摆放好详情界面的位置。

 

不过这里有个比较重要的问题是,通常情况下,GameObject和自己的详情界面一般不会在同一个camera下。

所以这里首先解决的是要这两边的坐标撸通。

 

这里简单说一下,

在unity里基本上有4种坐标

世界坐标,相对坐标,屏幕坐标,相对屏幕0,0点坐标

 

由于我们要在Camera之前切换坐标,为了简化,我们不要去算世界坐标和相对坐标,通过屏幕坐标进行转化

意思就是,

找到GameObject的世界坐标,通过接口算出它自己Camera的屏幕坐标,把屏幕坐标传给详情界面,

详情界面通过把GameObject的屏幕坐标通过自己Camera的转化接口转化成世界坐标,摆放位置。

 

这样就能计算出在不同camera的情况下,屏幕上同一个点坐标的转化。

 

下面贴上代码

 

 

[csharp] view plain copy
 
 技术分享技术分享
  1. public void ResetPosition(GameObject relativeObject,Camera cam)  
  2. {  
  3.   
  4.   
  5.     //获取触发这个dialog的gameObject相对于屏幕的position  
  6.     Vector3 relativePosition = cam.WorldToScreenPoint(relativeObject.transform.position);//通过世界坐标去获取  
  7.     Vector3 relativePositionPercent = cam.WorldToViewportPoint(relativeObject.transform.position);//获取GameObject相对于屏幕0,0点的位置(x,y范围在0,1之间)  
  8.     Vector3 newPosition = CDialogManager.Instance.GetCamera(eUIIndex.Index_OrthographicThree).ScreenToWorldPoint(relativePosition);//转回世界坐标摆放  
  9.     m_mainGameObject.transform.position = newPosition;//先摆放position,之后再把总偏移值加上  
  10.   
  11.     Bounds realativeObjectBounds = NGUIMath.CalculateRelativeWidgetBounds(relativeObject.transform);//算出GameObject边框大小  
  12.     float realativeObjectWidth = realativeObjectBounds.extents.x;  
  13.     float realativeObjectHeight = realativeObjectBounds.extents.y;  
  14.   
  15.     Bounds objectBounds = NGUIMath.CalculateRelativeWidgetBounds(m_mainGameObject.transform);//算出自己边框大小  
  16.     float objectWidth = objectBounds.extents.x;  
  17.     float objectHeight = objectBounds.extents.y;  
  18.   
  19.     float spacingX = 5;//5像素偏移  
  20.     float spacingY = 5;  
  21.   
  22.     float offsetX = 0;//总偏移  
  23.     float offsetY = 0;  
  24.   
  25.   
  26.     if (relativePositionPercent.x >= 0.5 && relativePositionPercent.y >= 0.7)//为了效果更好,y轴上分为上中下三个象限  
  27.     {  
  28.         offsetX =  -realativeObjectWidth - objectWidth - spacingX;  
  29.         offsetY =  -realativeObjectHeight - objectHeight - spacingY;  
  30.   
  31.     }  
  32.     else if(relativePositionPercent.x >= 0.5 && relativePositionPercent.y <= 0.3)  
  33.     {  
  34.         offsetX = -realativeObjectWidth - objectWidth - spacingX;  
  35.         offsetY = realativeObjectHeight +objectHeight + spacingY;  
  36.     }  
  37.     else if (relativePositionPercent.x >= 0.5 && relativePositionPercent.y > 0.3 && relativePositionPercent.y < 0.7)  
  38.     {  
  39.         offsetX = -realativeObjectWidth - objectWidth - spacingX;  
  40.         offsetY = 0;  
  41.     }  
  42.     else if (relativePositionPercent.x <= 0.5 && relativePositionPercent.y >= 0.7)  
  43.     {  
  44.         offsetX = realativeObjectWidth + objectWidth + spacingX;  
  45.         offsetY = -realativeObjectHeight - objectHeight - spacingY;  
  46.   
  47.     }  
  48.     else if (relativePositionPercent.x <= 0.5 && relativePositionPercent.y <= 0.3)  
  49.     {  
  50.         offsetX = realativeObjectWidth + objectWidth + spacingX;  
  51.         offsetY = realativeObjectHeight + objectHeight + spacingY;  
  52.     }  
  53.     else if (relativePositionPercent.x <= 0.5 && relativePositionPercent.y > 0.3 && relativePositionPercent.y < 0.7)  
  54.     {  
  55.         offsetX = realativeObjectWidth + objectWidth + spacingX;  
  56.         offsetY = 0;  
  57.     }  
  58. span style="white-space:pre">    </span>//最后通过相对坐标进行偏移  
  59.     m_mainGameObject.transform.localPosition = new Vector3(m_mainGameObject.transform.localPosition.x + offsetX, m_mainGameObject.transform.localPosition.y + offsetY, 0);  
  60. }  

【小松教你手游开发】【unity实用技能】根据上一个GameObject坐标生成的tips界面

标签:

原文地址:http://www.cnblogs.com/chrisfxs/p/5737791.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!