U3D-实时PVP小地图实现
前言
在很多实时PVP对战游戏(如:英雄联盟、王者荣耀等)的战斗场景中,都会有一个小地图,用于实时地显示一些比较重要因素,例如:队友和对手位置、存活炮塔位置、Boss出生死亡情况等。
一、方案分析:
实现小地图的方案一般可以分成两种:
- 直接加一个子相机,映射当前场景中所有的物体,简单粗暴;
- 用UI创建一个假地图,然后将需要显示在小地图上的物体,经过位置换算得到的小地图坐标,然后在小地图中创建与每个物体对应的图标,并实时更新每个图标的状态和位置;
方案一:
第一种方案其实很简单,只需要在场景中加多一个相机和一个Render Texture即可实现,具体的实现步骤可以参考这个案例:Unity3d中使用摄像机制作实时显示小地图
方案二:
这个方案显然要更加复杂一些,但是更加符合需求,因为有时候我们通过小地图不是想看到当前地图的所有物体,而只是想看到一些关键的信息,所以通过UI平面简化显示的方式其实更为直观,例如:英雄都只用一个圆形的头像来代表,而炮台也只是一个图标,对手的位置只有在特定条件下才会显示等。
二、可用插件:
Unity有许多功能强大的插件,关于小地图的实现也有一些插件:KGFMapSystem
和NJG 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小地图实现相关推荐
- Unity3D —— 实时PVP小地图实现
前言 在很多实时PVP对战游戏(如:英雄联盟.王者荣耀等)的战斗场景中,都会有一个小地图,用于实时地显示一些比较重要因素,例如:队友和对手位置.存活炮塔位置.Boss出生死亡情况等. 一.方案分析: ...
- 【Unity3d】使用摄像机制作实时显示小地图
Unity3d中使用摄像机制作实时显示小地图,以之前的tank为例.开始制作之前场景中物体如图. 开始制作,步骤1:新建一个camera及一个plane.对齐位置,将camera改名为camera_U ...
- 动作手游实时PVP技术揭密(服务器篇)
前言 我们的游戏是一款以忍者格斗为题材的ACT游戏,其主打的玩法是PVE推图及PVP 竞技.在剧情模式中,高度还原剧情再次使不少玩家泪目.而竞技场的乐趣,伴随着赛季和各种赛事相继而来,也深受玩家喜爱, ...
- 动作手游实时PVP帧同步方案(客户端)
1.概述 1.1.基于UDP的帧同步方案 在技术选型方面,之所以选择帧同步方案,在Kevin的一篇介绍PVP帧同步后台实现的文章中已经做了详细叙述,这里简单摘要如下: 高一致性.如果每一帧的输入都同步 ...
- PvP竞赛游戏设计与实现
写在前面 这个月接手了两个较大的需求,其中一个是竞赛类游戏,还有一个是抢红包的玩法.两种都涉及人与人之间一定的互动,游戏趣味性相对较高,从数据上反应用户也会相对更加喜欢. 本文先介绍第一个需求的背景. ...
- 实时音视频|社交直播语聊商业化解决方案
摘要 在过去几年的直播行业创业风口期中,直播的用户关注度疯狂增长,但用户质量却参差不齐.随着用户新鲜感一过,流失率变得相当严重,各大平台都在竭尽全力防御.然而,留住"凑热闹"的非直 ...
- 腾讯游戏4名技术专家详解:《御龙在天移动版》服务器性能优化
本文作者:蔡铭福.刘林.杨岳军.向熠 一.游戏介绍 <御龙在天移动版>是一款3D MMORPG手游,以三国为背景,移植<御龙在天端游>经典玩法,主打手机上的实时万人国战,同时通 ...
- 斗罗大陆html5游戏在线玩,斗罗大陆H5在线玩
以著名网络小说<斗罗大陆>的世界为游戏世界观研发的一款html5网游,玩家在游戏中按照剧情的发展完成关卡任务,通过招募伙伴,培养魂师,强化魂具等养成,与其他玩家切磋,在斗罗大陆的世界中不断 ...
- 帧同步和状态同步(二)案例分析
转自:http://www.gameres.com/489361.html 腾讯一下出了两款MOBA游戏,全民超神,王者荣耀,玩了一下,效果不错,就分析了一下它底层的一些技术,发现一个是采用的状态同步 ...
最新文章
- Android开发者指南(18) —— Web Apps Overview
- 如何制作一个通用的多系统安装U盘七(Windows相关配置)
- 如何利用URLOS和云存储打造一个不惧怕宕机的网站环境
- 科学计算机器科学计算机,科学计算器多功能版
- 初中生学python教材推荐_推荐中学生看的几本书
- Scanner、String(java基础知识十二)
- 3月20 Ubuntu里运行脚本示例
- 【TWVRP】基于matalb模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】
- 迅雷下载遇到“应版权方要求无法下载”,怎么办
- android读取存储mysql图片,Android从Sqlite数据库保存并获取图像
- 一种基于BP神经网络的车牌字符识别方法
- 洛谷1852 BZOJ2144 跳跳棋 思维题
- 中国大地坐标系CGCS2000
- NCCL (NVIDIA Collective Communications Library)
- WIN2003 R2安装EPSON6200L打印机问题解决
- 网页的缩放,适配以及移动的适配!
- pc端常用电脑屏幕 媒体查询尺寸
- 【Linux基础】Ubuntu 20.04系统安装(完整版)
- 80端口被占用 默默的黑手SKYPE
- jQuery 学习-样式篇(三):jQuery 选择器类型详解
热门文章
- 声音(音乐)分类综述
- go mysql 异步_GO操作MYSQL
- 阿里云国际站的对象存储oss与自建存储的区别
- 《绝版游戏之信长之野望12—“统一日本的游戏“》
- 云计算时代的进阶者,专访景安董事长杨小龙
- 【媒体聚焦】“我们为什么要为景安点赞”——记景安网络十四年峥嵘岁月
- 京东2020年Q2财报数据亮眼:超2000亿净收入背后供应链物流价值释放
- 用C++实现强化学习,速度不亚于Python,这里有个框架可用
- LWIP协议栈[I/drv.emac] RxCpltCallback err = -3错误解决办法
- windows如何查看自己的ip地址