等比小地图PlayerIcon显示的坐标
核心两行:
1. 角色等比= 角色坐标 / 地形大小
2. 角色在小地图中的位置 = UImap地图大小(UI的大小) * 角色等比 + UI锚点偏移
小地图标点在地图生成相对坐标(类似于永劫无间标记出生点、吃鸡标记目标地、LOL小地图标记信号给队友)
核心三行:
1. 鼠标点击位置屏幕坐标转换UI坐标,在小地图的位置生成标记点
2. 标记点icon等比= 拿到标记点位置减去偏移/小地图UI大小
3. 标记点在场景大地图位置=地图大小*标记点icon等比
public class Map : MonoBehaviour, IPointerClickHandler
{
/// <summary>
/// 角色
/// </summary>
public Transform player;
/// <summary>
/// 地图标记
/// </summary>
public Transform Marker;
/// <summary>
/// 地形
/// </summary>
public MeshRenderer Terrain;
/// <summary>
/// 小地图
/// </summary>
public RectTransform UIMap;
/// <summary>
/// 小地图上的角色图标
/// </summary>
public RectTransform palyerIcon;
/// <summary>
/// 小地图上标记图标
/// </summary>
public RectTransform MarkerIcon;
Vector3 tmpAngle;
Vector2 tmpPos = Vector2.zero;
void Update()
{
UpdatePos();
}
/// <summary>
/// 等比小地图更新角色位子
/// </summary>
void UpdatePos()
{
//角色X坐标/以地形长=人物在地形中的等比长
float widthRate = player.transform.position.x / Terrain.bounds.size.x;
//角色Z坐标/以地形宽=人物在地形中的等比宽
float heightRate = player.transform.position.z / Terrain.bounds.size.z;
//小地图大小*人物在地形中的等比+小地图锚点偏移量(我的小地图大小是256*256,固定在左上,偏移后的坐标0,0点刚好在小地图的中心点)
tmpPos.x = UIMap.sizeDelta.x * widthRate + 128;
tmpPos.y = UIMap.sizeDelta.y * heightRate + -128;
//计算出来的等比位置赋值给角色的icon
palyerIcon.localPosition = tmpPos;
//拿到角色icon的旋转
tmpAngle = palyerIcon.localEulerAngles;
//把角色的旋转y轴给UI的z
tmpAngle.z = player.localEulerAngles.y;
//修改好的旋转赋值给icon
palyerIcon.localEulerAngles = tmpAngle;
}
/// <summary>
/// 地图上标记出生点、目标点在
/// </summary>
void UpdateMarkerPos()
{
//类似于吃鸡中地图标点,永劫无间标记出生点
//标记点跟计算角色小地图一样只不过是反推
//(标记点的坐标-偏移)/小地图大小=得到等比
float widthRate = (MarkerIcon.localPosition.x - 128) / UIMap.sizeDelta.x;
float heightRate = (MarkerIcon.localPosition.y - -128) / UIMap.sizeDelta.y;
//等比放大地图大小的倍数就是在场景地形的那位子
float x = Terrain.bounds.size.x * widthRate;
float z = Terrain.bounds.size.z * heightRate;
//把这个位子给到标记物体
Marker.transform.position = new Vector3(x, 0.5f, z);
// Instantiate(player, new Vector3(x, 0.5f, y), Quaternion.identity);
}
public void OnPointerClick(PointerEventData eventData)
{
//鼠标左键按下地图上生成标记点
if (eventData.pointerEnter.name == "Map")
{
Vector2 outVec;
//屏幕左边转换UI坐标
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(UIMap, Input.mousePosition, null, out outVec))
{
Debug.Log("转换后的屏幕坐标: " + outVec);
MarkerIcon.localPosition = outVec;
}
}
}