前言

在很多实时PVP对战游戏(如:英雄联盟、王者荣耀等)的战斗场景中,都会有一个小地图,用于实时地显示一些比较重要因素,例如:队友和对手位置、存活炮塔位置、Boss出生死亡情况等。

一、方案分析:

实现小地图的方案一般可以分成两种:

  • 直接加一个子相机,映射当前场景中所有的物体,简单粗暴;
  • 用UI创建一个假地图,然后将需要显示在小地图上的物体,经过位置换算得到的小地图坐标,然后在小地图中创建与每个物体对应的图标,并实时更新每个图标的状态和位置;

方案一:

第一种方案其实很简单,只需要在场景中加多一个相机和一个Render Texture即可实现,具体的实现步骤可以参考这个案例:Unity3d中使用摄像机制作实时显示小地图

方案二:

这个方案显然要更加复杂一些,但是更加符合需求,因为有时候我们通过小地图不是想看到当前地图的所有物体,而只是想看到一些关键的信息,所以通过UI平面简化显示的方式其实更为直观,例如:英雄都只用一个圆形的头像来代表,而炮台也只是一个图标,对手的位置只有在特定条件下才会显示等。

二、可用插件:

Unity有许多功能强大的插件,关于小地图的实现也有一些插件:KGFMapSystemNJG MiniMap,都能够快速开发出一个可用的地图,具体使用方式可以参考:

  • KGFMapSystem:[Unity3d插件KGFMapSystem]非常不错的小地图的制作,也可以参考官方指导:KGF官网
  • NJG MiniMap:Unity3D —— 小地图制作插件NJG MiniMap

三、从0实现小地图:

1.思路:

小地图说到底,其实就是一张背景图片,上边有一些代表不同游戏物体的小点或者是图标,然后根据当前个个点所代表物体的变化改变这些点的状态。

2.实现步骤:

  • 创建每个类型物体对应的点预设,最好使用一个预设体MapPoint.prefab可以兼容创建所有类型的点(因为通常只是UISprite图标在变化),这里我以只带一个UISprite的为例; 
  • 遍历需要显示在小地图上的物体,并在小地图中使用MapPoint.prefab预设创建对应的点,用枚举列出所有类型:
    public enum PointType{MySoldier,  //我方特种兵OppoSoldier,//对手特种兵Boss,       //野怪LeftTower,  //左边塔RightTower, //右边塔MyAISoldier,//我方AI小兵OppoAISoldier//地方AI小兵}

这里需要按照类型,进行分类创建和设置:

    /// <summary>/// 创建不同类型的点/// </summary>/// <param name="pos"></param>/// <param name="name"></param>/// <param name="_type"></param>/// <returns></returns>public GameObject BuildPointByType(Vector3 pos,string name,PointType _type){GameObject item = GameObject.Instantiate(mapPointPrefab) as GameObject;item.SetActive(true);item.transform.SetParent(transform);item.transform.localPosition = GetMapPositionByWorldV3(pos);item.transform.localScale = new Vector3(1, 1, 1);item.transform.localRotation = Quaternion.Euler(0f, 180f, 135f);item.name = name;UISprite sprite = item.GetComponent<UISprite>();switch (_type){case PointType.Boss:sprite.spriteName = "hpring";break;case PointType.LeftTower:sprite.spriteName = "TurretLeft";break;case PointType.RightTower:sprite.spriteName = "TurretRight";break;case PointType.MySoldier:sprite.spriteName = "SoldierLeft";break;case PointType.OppoSoldier:sprite.spriteName = "SoldierRight";break;case PointType.MyAISoldier:sprite.spriteName = "point";item.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f);sprite.color = BattleDataCenter.Instance.GetColor(BattleDataCenter.Instance.CtrledPlayerFactionId);break;case PointType.OppoAISoldier:sprite.spriteName = "point";item.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f);sprite.color = ColorTool.GetColorFromIndex(4);break;}return item;}

这里有一个比较关键的方法,就是坐标转换方法GetMapPositionByWorldV3,这是将一个3D真实地图中的一个Vector3的3维坐标,映射得到小地图中的一个Vector2二维坐标点,通常只是要做等比缩放即可:

    /// <summary>/// 将大地图上的坐标转化为小地图上的坐标/// </summary>/// <param name="pos"></param>/// <returns></returns>public Vector2 GetMapPositionByWorldV3(Vector3 pos){return new Vector2(pos.x*0.8f, -pos.z*0.8f);}
  • 使用一个字典Dictionary<string,GameObject>来保存已经创建出来的点(GameOject)
    /// <summary>/// 将点添加到字典中方便管理/// </summary>/// <param name="go"></param>private void AddPointToDic(GameObject go){if (!pointDic.ContainsKey(go.name)){pointDic.Add(go.name, go);}else{pointDic[go.name] = go;}}

如果要更新一个点的位置:

    /// <summary>/// 通过位置和string更新点位置/// </summary>/// <param name="pos"></param>/// <param name="name"></param>public void UpdatePoint(Vector3 pos,strig name,PointType _type){if (pointDic.ContainsKey(name)){pointDic[name].transform.localPosition = GetMapPositionByWorldV3(pos);}else{AddPointToDic(BuildPointByType(pos, name, _type));}}
  • Update()方法中对需要动态修改位置或者其他属性的点进行刷新,例如我们更新所有炮塔位置:
void Update()
{//炮塔for (int i = 0; i < towers.Count; i++){if (i < towers.Count/2){UpdatePoint(towers[i], MiniMapController.PointType.LeftTower);}else{UpdatePoint(towers[i], MiniMapController.PointType.RightTower);}}
}

图:

U3D-实时PVP小地图实现相关推荐

  1. Unity3D —— 实时PVP小地图实现

    前言 在很多实时PVP对战游戏(如:英雄联盟.王者荣耀等)的战斗场景中,都会有一个小地图,用于实时地显示一些比较重要因素,例如:队友和对手位置.存活炮塔位置.Boss出生死亡情况等. 一.方案分析: ...

  2. 【Unity3d】使用摄像机制作实时显示小地图

    Unity3d中使用摄像机制作实时显示小地图,以之前的tank为例.开始制作之前场景中物体如图. 开始制作,步骤1:新建一个camera及一个plane.对齐位置,将camera改名为camera_U ...

  3. 动作手游实时PVP技术揭密(服务器篇)

    前言 我们的游戏是一款以忍者格斗为题材的ACT游戏,其主打的玩法是PVE推图及PVP 竞技.在剧情模式中,高度还原剧情再次使不少玩家泪目.而竞技场的乐趣,伴随着赛季和各种赛事相继而来,也深受玩家喜爱, ...

  4. 动作手游实时PVP帧同步方案(客户端)

    1.概述 1.1.基于UDP的帧同步方案 在技术选型方面,之所以选择帧同步方案,在Kevin的一篇介绍PVP帧同步后台实现的文章中已经做了详细叙述,这里简单摘要如下: 高一致性.如果每一帧的输入都同步 ...

  5. PvP竞赛游戏设计与实现

    写在前面 这个月接手了两个较大的需求,其中一个是竞赛类游戏,还有一个是抢红包的玩法.两种都涉及人与人之间一定的互动,游戏趣味性相对较高,从数据上反应用户也会相对更加喜欢. 本文先介绍第一个需求的背景. ...

  6. 实时音视频|社交直播语聊商业化解决方案

    摘要 在过去几年的直播行业创业风口期中,直播的用户关注度疯狂增长,但用户质量却参差不齐.随着用户新鲜感一过,流失率变得相当严重,各大平台都在竭尽全力防御.然而,留住"凑热闹"的非直 ...

  7. 腾讯游戏4名技术专家详解:《御龙在天移动版》服务器性能优化

    本文作者:蔡铭福.刘林.杨岳军.向熠 一.游戏介绍 <御龙在天移动版>是一款3D MMORPG手游,以三国为背景,移植<御龙在天端游>经典玩法,主打手机上的实时万人国战,同时通 ...

  8. 斗罗大陆html5游戏在线玩,斗罗大陆H5在线玩

    以著名网络小说<斗罗大陆>的世界为游戏世界观研发的一款html5网游,玩家在游戏中按照剧情的发展完成关卡任务,通过招募伙伴,培养魂师,强化魂具等养成,与其他玩家切磋,在斗罗大陆的世界中不断 ...

  9. 帧同步和状态同步(二)案例分析

    转自:http://www.gameres.com/489361.html 腾讯一下出了两款MOBA游戏,全民超神,王者荣耀,玩了一下,效果不错,就分析了一下它底层的一些技术,发现一个是采用的状态同步 ...

最新文章

  1. Android开发者指南(18) —— Web Apps Overview
  2. 如何制作一个通用的多系统安装U盘七(Windows相关配置)
  3. 如何利用URLOS和云存储打造一个不惧怕宕机的网站环境
  4. 科学计算机器科学计算机,科学计算器多功能版
  5. 初中生学python教材推荐_推荐中学生看的几本书
  6. Scanner、String(java基础知识十二)
  7. 3月20 Ubuntu里运行脚本示例
  8. 【TWVRP】基于matalb模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】
  9. 迅雷下载遇到“应版权方要求无法下载”,怎么办
  10. android读取存储mysql图片,Android从Sqlite数据库保存并获取图像
  11. 一种基于BP神经网络的车牌字符识别方法
  12. 洛谷1852 BZOJ2144 跳跳棋 思维题
  13. 中国大地坐标系CGCS2000
  14. NCCL (NVIDIA Collective Communications Library)
  15. WIN2003 R2安装EPSON6200L打印机问题解决
  16. 网页的缩放,适配以及移动的适配!
  17. pc端常用电脑屏幕 媒体查询尺寸
  18. 【Linux基础】Ubuntu 20.04系统安装(完整版)
  19. 80端口被占用 默默的黑手SKYPE
  20. jQuery 学习-样式篇(三):jQuery 选择器类型详解

热门文章

  1. 声音(音乐)分类综述
  2. go mysql 异步_GO操作MYSQL
  3. 阿里云国际站的对象存储oss与自建存储的区别
  4. 《绝版游戏之信长之野望12—“统一日本的游戏“》
  5. 云计算时代的进阶者,专访景安董事长杨小龙
  6. 【媒体聚焦】“我们为什么要为景安点赞”——记景安网络十四年峥嵘岁月
  7. 京东2020年Q2财报数据亮眼:超2000亿净收入背后供应链物流价值释放
  8. 用C++实现强化学习,速度不亚于Python,这里有个框架可用
  9. LWIP协议栈[I/drv.emac] RxCpltCallback err = -3错误解决办法
  10. windows如何查看自己的ip地址