Unity 制作等比小地图并在小地图上标记出生点(类似于永劫无间、绝地求生、LoL小地图标记信号给队友)

该代码段展示了一个Unity3D场景中,如何实现等比例缩放的小地图来显示角色位置和标记点。通过角色坐标与地形大小的比值计算角色在小地图上的位置,并处理标记点的生成与场景对应。更新方法包括`UpdatePos()`用于更新角色在小地图上的图标位置,`UpdateMarkerPos()`用于更新标记点在大地图上的位置,以及响应鼠标点击在小地图上生成标记的逻辑。
摘要由CSDN通过智能技术生成

等比小地图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;
               }
          }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值