游戏中,某些场景会用到小地图。
如其名,小地图的本质是地图,缩略的简化的二维坐标集合体,不标示高度,只标示平面坐标。小地图的关键是比例尺。只需将实际物体位置按比例标示在一个缩略图上。物体可以按照是否有变动(是否一直存在,位置是否会更改)分为两种,静态物体和动态物体。静态物体直接绘制到背景图片里,动态物体,给一个标志,需要根据它的存在状态和位置变化实时标示在小地图中的位置。
做小地图,还需要明晰,哪些是需要在小地图上反映的,哪些可以省略。比如,考虑到游戏的目的以及游戏性能等,在moba战斗中,我只是想知道主角的位置,野怪的位置,血泉的状态,至于小兵,如果不在乎,可以不用在小地图中反映小兵信息。
条件:美术提供按比例绘制的静态物体的背景图。横向比例尺和纵向比例尺尽量保持一致。
美术可以告诉你比例尺,但我觉得更好的是,定2个基准点,根据基准点在实际场景中的坐标以及小地图里的相对坐标计算比例尺。有了比例尺,就能将场景中所有的物体坐标实时反馈到小地图上。
private void CalLittleMapScale() { float mapWidth = Mathf.Abs(m_TransMapBase1.localPosition.x - m_TransMapBase2.localPosition.x); m_fMapScale = mapWidth / Mathf.Abs(m_db.m_goMobaBase1.transform.position.x - m_db.m_goMobaBase2.transform.position.x); //需要美术保证宽高同比缩 m_vSceneCenter = (m_db.m_goMobaBase1.transform.position + m_db.m_goMobaBase2.transform.position) / 2.0f; }
private void WorldPositionToLittleMapPos(GameObject _mapPoint, Vector3 _worldPos) { Vector3 vPosFromWorldCenter = _worldPos - m_vSceneCenter; _mapPoint.transform.localPosition = new Vector3(vPosFromWorldCenter.x * m_fMapScale, vPosFromWorldCenter.z * m_fMapScaleZ, _mapPoint.transform.localPosition.z) + m_TransMapCenter.transform.localPosition; }
要点:
1.定基准点,计算比例尺。看需要是否横向纵向分别计算。
2.根据比例尺计算实际物体位置在小地图上的坐标。注意用localPosition,建议用相对中心位置的偏移。
这里处理了小地图上物体位置的更新,还有玩家被杀害,防御建筑被摧毁等导致的显隐需求。需要建立小地图上的点和实际GameObject的映射关系,用事件委托的方式,在GameObject被摧毁时,通知小地图隐藏相应的点。
当然,一些游戏对小地图的要求更高,地图范围广,根据玩家的游戏进度和目前所有位置仅显示当前一部分,在端游中比较常见,手游一般直接全部显示了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-20 00:51:21