Unity 用 UGUI制作方向类型的小地图

创建一个Canvas,添加一个Image作为小地图的背景图,重命名为MiniMap,在MiniMap下再创建一个Image,重命名为PlayerIcon,PlayerIcon下创建一个Image
在这里插入图片描述
这样旋转MiniMap下PlayerIcon,图标就能旋转
在这里插入图片描述
给MiniMap添加代码

    public static MiniMap Instance;
    private Transform playerIcon;
    private Transform player;

    void Awake()
    {
        Instance = this;
        playerIcon = transform.Find("PlayerIcon");
        player = GameObject.FindGameObjectWithTag(Tags.Player).transform;        
    }
    void Update()
    {
        playerIcon.localEulerAngles = new Vector3(0, 0, -player.localEulerAngles.y);
    }

player为玩家,playerIcon 为MiniMap下的PlayerIcon,通过获取玩家的旋转来改变playerIcon 的旋转,Instance为单例,可以在其他的脚本中掉用此脚本,但是只能使用一次,如果有多个物体,单例就只能找到第一个,因为单例是静态对象,无法改变

之后还有如敌人,奖励等这样的物体需要通过小地图指引方向的,在此脚本下添加如下代码:

    public GameObject GetMapIcon()
    {
        GameObject go = Instantiate(MapIcon, transform.position, transform.rotation);
        go.name = "MapIcon";
        go.transform.parent = transform;
        return go;
    }

可以根据所需要的图标数量创建多个代码,根据自已需求取名MapIcon是所需图标的预制体

go.transform.parent = transform;的意思就是创建的这个图标在MiniMap下,作为它的子对象,然后返回一个GameObject ,就是创建的图标,在如下代码中调用获取

    private Transform icon;
    private Transform player;
    private RectTransform rect;

    void Awake()
    {
        player = GameObject.FindGameObjectWithTag(Tags.Player).transform;
    }

    void Start()
    {
        if(tag == "Map")
        {
            icon = MiniMap.Instance.GetMapIcon().transform;
        }
        rect = icon.GetComponent<RectTransform>();
    }

    void Update()
    {
        Vector3 offset = transform.position - player.position;
        //offset /= 3;
        float x = offset.x;
        float y = offset.z;
        if (x > 100)
            x = 100;
        else if (x < -100)
            x = -100;

        if (y > 100)
            y = 100;
        else if (y < -100)
            y = -100;

        rect.anchoredPosition = new Vector3(x, y, 0);
    }

    void OnDestroy()
    {
        if (icon != null)
            Destroy(icon.gameObject);
    }

判断tag是否为Map,然后通过Instance调用,之前脚本中图标生成的函数,获取图标的位置,通过对比玩家的位置,来显示在小地图上。

重点:图标位置的改变不是Transform,而是RectTransform ,所以根据父对象改变位置,不能使用LocalPosition,而是要获取RectTransform组件后使用anchoredPosition。

offset 为玩家和物体之间的距离,但是,图标和玩家之间的距离可能会很大或很小,而小地图大小一定,所以需要把offset除或乘一个数,根据自身情况调试,而且可以判断大小来给他一个最大范围,这样就可以把它控制在小地图内,而不会跑出小地图。

OnDestroy是当物体销毁时执行,奖励被拾取或敌人被消灭时,物体被销毁,这时小图标同样需要被销毁。

在这里插入图片描述

发布了3 篇原创文章 · 获赞 0 · 访问量 52

猜你喜欢

转载自blog.csdn.net/qq_40915831/article/details/103755213