查看: 2011|回复: 1
打印 上一主题 下一主题

[经验分享] Unity 等比映射小地图

[复制链接]
may    

8830

主题

80

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52304
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2018-12-31 21:30:07 |只看该作者 |倒序浏览

來自:xx88

其实等比映射小地图非常简单,而且特别节省性能,使用第二摄像机+Rendertexture方式实现小地图,操作起来是简单,但是相对来说它的性能消耗也很大,对于开发人员来说,一定要做到控制性能的优化,才能让自己项目的体验更加流畅,更加吸引人!
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;

  4. public class MiniMap : MonoBehaviour {
  5.     /// <summary>
  6.     /// 大地型对象
  7.     /// </summary>
  8.     public GameObject Plane;
  9.     /// <summary>
  10.     /// 玩家对象
  11.     /// </summary>
  12.     public GameObject Player;
  13.     /// <summary>
  14.     /// 小地图贴图
  15.     /// </summary>
  16.     public Texture MapTexture;
  17.     /// <summary>
  18.     /// 小地图玩家贴图
  19.     /// </summary>
  20.     public Texture PlayerTexture;
  21.     /// <summary>
  22.     /// 大地型宽度
  23.     /// </summary>
  24.     private float MaxMapWidth;
  25.     /// <summary>
  26.     /// 大地型高度
  27.     /// </summary>
  28.     private float MaxMapHeight;
  29.     /// <summary>
  30.     /// 玩家在小地图的位置宽度
  31.     /// </summary>
  32.     private float MinMapWidth;
  33.     /// <summary>
  34.     /// 玩家在小地图的位置高度
  35.     /// </summary>
  36.     private float MinMapHeight;
  37.     /// <summary>
  38.     /// 大地图默认宽度
  39.     /// </summary>
  40.     private float MaxMapRealyWidth;
  41.     /// <summary>
  42.     /// 大地图默认高度
  43.     /// </summary>
  44.     private float MaxMapRealyHeight;
  45.     /// <summary>
  46.     /// 玩家当前在地图中的宽度
  47.     /// </summary>
  48.     private float PlayerInMapWidth;
  49.     /// <summary>
  50.     /// 玩家当前在地图中的高度
  51.     /// </summary>
  52.     private float PlayerInMapHeight;

  53.     private void Start()
  54.     {
  55.         MaxMapRealyWidth = Plane.GetComponent<MeshFilter>().mesh.bounds.size.x;
  56.         MaxMapRealyHeight = Plane.GetComponent<MeshFilter>().mesh.bounds.size.z;
  57.         //得到大地图高度缩放地理
  58.         float scal_z = Plane.transform.localScale.z;
  59.         MaxMapRealyHeight = MaxMapRealyHeight * scal_z;
  60.         //得到大地图高度缩放地理
  61.         float scal_x = Plane.transform.localScale.x;
  62.         MaxMapRealyWidth = MaxMapRealyWidth * scal_x;
  63.         Check();
  64.     }

  65.     private void FixedUpdate()
  66.     {
  67.         Check();
  68.     }

  69.     private void OnGUI()
  70.     {
  71.         GUI.DrawTexture(new Rect(Screen.width - MapTexture.width/4, 0, MapTexture.width/4, MapTexture.height/4), MapTexture);
  72.         GUI.DrawTexture(new Rect(MinMapWidth, MinMapHeight, 20, 20), PlayerTexture);
  73.     }

  74.     void Check()
  75.     {
  76.         //根据比例计算小地图“主角”的坐标
  77.         MinMapWidth = (MapTexture.width * Player.transform.position.x/ MaxMapRealyWidth) + ((MapTexture.width /4 / 2) - (20 / 2)) + (Screen.width - MapTexture.width/4);
  78.         MinMapHeight = MapTexture.height/4 - ((MapTexture.height/4 * Player.transform.position.z / MaxMapRealyHeight) + (MapTexture.height / 4/ 2 + 30));
  79.     }

  80. }
复制代码
其中有四个需要拖拽的Public的游戏对象
plane —-> 就是你的地形
player —-> 就是你的主角
MapTexture —-> 就是小地图纹理
playerTexture —-> 就是代表主角的纹理

计算原理
1.首先计算小地图的位置
小地图假设放到右上角,那么小地图的位置起点就应该是屏幕宽度减去小地图本身的宽度,高就是0
2.其次计算玩家纹理在小地图上的位置
我们就拿玩家在场景的左下角出生为例,那么玩家在小地图上也应该是在小地图的左下角才是正确的,首先先把玩家放到小地图的左下角,那么玩家在小地图的x应该是屏幕宽度减去小地图宽度,y应该是小地图的高度,第一步完成,第二步如果玩家移动,那么小地图上玩家也要动,怎么动是需要计算的,首先求出小地图和大地图的比例,然后乘上玩家的x,z就的到了玩家应该在小地图上移动的x,y;


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏1 支持支持0 反对反对0
回复

使用道具 举报

5

主题

7

听众

2429

积分

中级设计师

Rank: 5Rank: 5

纳金币
149
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2019-1-2 09:58:34 |只看该作者
这貌似是一种常规的小地图处理。。。。因为我们所看见的小地图往往和地形是不一样的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-4-26 10:34 , Processed in 0.086069 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部