一、制作地图素材
实时渲染:主场景和小地图各需要渲染一次,非常耗性能。
预渲染:地图顶视图渲染成一张图片(推荐☆☆☆)
美术制作:纯粹靠美术手绘,可能跟实际不符。
好的,我们用最简单粗暴的方法,调整到Top视角,把Scene拉到最大,直接截图。放到Resources目录下,方便后面切换地图时加载小地图。
二、制作小地图UI
1. 创建一个空物体Minimap,锚点定位到右上角,拉出来小地图所占的区域大小。
2. 创建一个子物体Image_Border,用来放小地图的边框。
3.创建一个子物体Image_Mask,用来放Mask,记得添加Mask组件。
4.Mask下创建一个子物体Image_minimap,这个就用来动态加载小地图图片啦!
三、配置小地图并加载
配置信息:地图ID、地图名字、地图类型(PVE?PVP?)、Resources里的文件名...
配置方式:可以用Excel写,然后用Excel2Json工具,或者直接用Json写。
加载:Minimap上挂载脚本
在Start()里初始化,加载小地图图片。
1 void Init() 2 { 3 //加载小地图图片 4 this.minimap.overrideSprite = Resources.Load<Sprite>("UI/Minimap/MainCity"); 5 // 跟手动操作一样,设置成原始大小 6 this.minimap.SetNativeSize(); 7 // 局部坐标全为0 8 this.minimap.transform.localPosition = Vector3.zero; 9 }
在Update()里更新小地图位置信息。
1 //制作一个Cube与地形完全重合,获取Collider,根据Collider得到地图的长宽 2 public Collider minimapBoundingBox; 3 //一个向上的箭头代表玩家的位置 4 public Image arrow; 5 void Update() 6 { 7 //获取地图的长宽 8 float realWidth = minimapBoundingBox.bounds.size.x; 9 float realHeight = minimapBoundingBox.bounds.size.z; 10 //角色坐标转化成地图坐标 11 float relaX = playerTransform.position.x - minimapBoundingBox.bounds.min.x; 12 float relaY = playerTransform.position.z - minimapBoundingBox.bounds.min.z; 13 //小地图是跟着玩家走的,可以把玩家的位置设置为中心点,这样玩家就始终在小地图中心了。 14 float pivotX = relaX / realWidth; 15 float pivotY = relaY / realHeight; 16 this.minimap.rectTransform.pivot = new Vector2(pivotX, pivotY); 17 this.minimap.rectTransform.localPosition = Vector2.zero; 18 //箭头跟着玩家旋转,玩家是绕y轴旋转的,而小地图箭头是绕z轴旋转的 19 this.arrow.transform.eulerAngles = new Vector3(0, 0, -playerTransform.eulerAngles.y); 20 }
好了一个简易的只显示玩家位置的小地图就做好了。