前言

在很多实时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);}}
}

四、效果图:

Unity3D —— 实时PVP小地图实现相关推荐

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

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

  2. U3D-实时PVP小地图实现

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

  3. Unity3D技巧之小地图的实现

    Unity3D技巧之小地图的实现 首先在UI画布下创建一个空物体改名叫Minmap.并在Minmap下创建Raw Image用来做遮罩. . 然后再建立一个Sprite于Player的子对象下并且改名 ...

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

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

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

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

  6. 实现诺易腾与unity3D实时交互的软件设置

    一.设置Axies Neuron Pro 依次点击[File]   [Settings]  [Broadcasting],选择  TCP  BVH选项打勾之后点ok 2.下载PerceptionNeu ...

  7. 【Unity3D】2018实时渲染电影短片《死者之书》技术文章合集

    本篇文章首发于作者个人博客,原链:https://www.huozk.com/2018/unity3d-bookofthedead.html 古埃及人相信,人死后要先经历一段去往冥国的旅程,通过各种考 ...

  8. Unity3d数字地球三维建筑模型、数字城市

    Unity3d实时加载全球三维建筑模型,生成数字城市.欢迎交流QQ515716030 https://www.bilibili.com/video/BV1S5411Y7HJ 纽约 波士顿 成都金融城 ...

  9. 虚拟现实,房产精装间,使用MentalRay烘培,实现Unity3d·HDR版LightMap

    http://game.ceeger.com/forum/read.php?tid=11284 //>>>>>>>>>>>>&g ...

最新文章

  1. docker系列之file基本操作
  2. python gc内存_禁用 Python GC,Instagram 性能提升10%
  3. PHP中常见的提示对照表
  4. awstats 简单日志分析
  5. 探讨PHP页面跳转几种实现技巧
  6. vs不一致的行尾对话框怎么调出_SolidWorks工程图打开后图纸没有了空白了怎么办?还能找回来吗?...
  7. 精通JavaScript--06设计模式:结构型
  8. android 8187驱动 win7,8187无线网卡驱动,教您Realtek瑞昱8187无线网卡驱动
  9. 使用matlab时括号附近出现红色波浪线“使用的MATLAB语法可能无效”提示
  10. java怎么打印课程表_自明排课系统如何打印?教你打印课表的方法
  11. CATIA V5实战培训设计视频教程-基础建模 逆向造型A面 装配工程图
  12. html模拟终端,DomTerm:一款为Linux打造的终端模拟器
  13. 多边形(n边形)面积计算公式hdu2036
  14. JS将下拉框的disable变为able的方法
  15. CSS3实现3D立体效果
  16. 随机点名器(java基础)
  17. Linux nohup的作用
  18. Dual Regression Networks for SISR 环境搭建 | 2020Paper | 【❤️Pytorch 实现❤️】
  19. 改善技术简历的47条原则
  20. python打开一个不存在的文件报错,python中的文件操作(一)

热门文章

  1. php怎样判断数组是否为空,PHP判断数组是否为空的5大方法
  2. 电子档合同有法律效应吗
  3. onnx转tensorrt 实战干货总结
  4. 为什么香港服务器可以免备案
  5. Java(Spring)学习笔记--->自动装配(autowire)
  6. C语言:数字的拼音读法 (结果这么简单,真是笑死)
  7. 【数据库学习笔记】Day06 - 关系数据库规范化理论
  8. 通过xtts迁移单实例文件系统表空间到RAC ASM存储表空间
  9. 为什么河北高中生压力那么大
  10. vsearch的下载