1.地图资源的制作
通常有三种方式:
1)实时渲染场景;
2)预渲染顶视图+润色
3)纯美术制作
这里采用第二种方式
(1)使用图片MASK方式设置小地图的蒙层,这里的Mask图片采用的是圆形的白色图片
(2)将地图图片放在MASK图片的节点下
(3)效果如下所示
(4)在地图下方加入一个cube与地图同宽高(需要加入碰撞体),用来后来绑定脚本记录坐标和进行坐标计算并投影在小地图。
2.MiniMap的脚本
(1)首先是pivot和anchor的区别:
参考文章: pivot和anchor的区别
(2)然后是localPosition和anchoredPosition方法的区别:
- localPosition表示的是子物体的pivot相对于父物体的pivot的坐标
- anchoredPosition表示的是子物体的pivot相对于anchor的坐标
- 3.当子物体的anchor与父物体的pivot坐标重合时anchoredPosition3D与localPosition相等
参考文章:localPosition和anchoredPosition方法的区别
using Models;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Managers;
public class UIMiniMap : MonoBehaviour
{
public Image minimap;
public Image arrow;//角色箭头
public Text MapName;
private Transform playerTransform;
public Collider MinimapBoundingBox;
void Start()
{
InitMiniMap();
}
void InitMiniMap()
{
this.MapName.text = User.Instance.CurrentMapData.Name;
if (this.minimap.overrideSprite == null)
{
this.minimap.overrideSprite = MiniMapManager.Instance.LoadCurrentMiniMap();
}
this.minimap.SetNativeSize();
this.minimap.transform.localPosition = Vector3.zero;
this.playerTransform = User.Instance.CurrentCharacterObj.transform;//获取角色对象实例
}
// Update is called once per frame
void Update()//坐标转换:世界坐标->小地图坐标
{
float realWidth = MinimapBoundingBox.bounds.size.x;
float realHeight = MinimapBoundingBox.bounds.size.z;
float relaX = playerTransform.position.x - MinimapBoundingBox.bounds.min.x;//MinimapBoundingBox.bounds.min.x->碰撞体左下角的X坐标
float relaY = playerTransform.position.z - MinimapBoundingBox.bounds.min.z;
float pivotX = relaX / realWidth;
float pivotY = relaY / realHeight;
//获取玩家在小地图的中心点位置
this.minimap.rectTransform.pivot = new Vector2(pivotX, pivotY);
this.minimap.rectTransform.localPosition = Vector2.zero;//相对于父物体pivot的子物体pivot位置
this.arrow.transform.eulerAngles = new Vector3(0,0, -this.playerTransform.eulerAngles.y);
//小地图是2D坐标 标准XYZ 角色是3D坐标 绕Y旋转
}
}