标签:
开发游戏,特别是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)
- {
-
-
-
- Vector3 relativePosition = cam.WorldToScreenPoint(relativeObject.transform.position);
- Vector3 relativePositionPercent = cam.WorldToViewportPoint(relativeObject.transform.position);
- Vector3 newPosition = CDialogManager.Instance.GetCamera(eUIIndex.Index_OrthographicThree).ScreenToWorldPoint(relativePosition);
- m_mainGameObject.transform.position = newPosition;
-
- Bounds realativeObjectBounds = NGUIMath.CalculateRelativeWidgetBounds(relativeObject.transform);
- 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;
- float spacingY = 5;
-
- float offsetX = 0;
- float offsetY = 0;
-
-
- 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;
- }
- 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);
- }
【小松教你手游开发】【unity实用技能】根据上一个GameObject坐标生成的tips界面
标签:
原文地址:http://www.cnblogs.com/chrisfxs/p/5737791.html