unity小地图上的动态图标

unity制作小地图简单,用rawImage 再来个摄像机就行

但是现在一个需求就是地图上一些东西要加上图标,图标会随着地图物体的移动而移动

然后去网上下载了个小地图插件  UGUI MiniMap(蛮牛可下)  但是他比较复杂,在研究了下他的代码,实现了一套自己的  简单小地图。

主要参考他的 bl_MiniMapItem 脚本

 

 

第一步:搭建好小地图

RawImage就是显示小地图的render texture

Player作为子物体为玩家的图标

FPSController为玩家

挂上脚本 CtrlMove.CS

做好关联

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CtrlMove : MonoBehaviour {

    public RectTransform RectRoot;//rawImage
    public Camera mapCamera;//小地图的摄像机
    private Vector3 position;//只是一个变量,存储一些值
    public GameObject cacheItem;//ui图标
    private Image Graphic = null;//Image组件

    /// <summary>
    /// 取自身坐标的x z坐标
    /// </summary>
    public Vector3 TargetPosition
    {
        get
        {
            return new Vector3(transform.position.x, 0, transform.position.z);
        }
    }

    // Use this for initialization
    void Start () {
        Graphic = cacheItem.GetComponent<Image>();//图标
        Graphic.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;//重置xy坐标
    }
    
    // Update is called once per frame
    void Update () {
        RectTransform rt = Graphic.GetComponent<RectTransform>();
        Vector3 CorrectPosition = TargetPosition;//自己的x z坐标
        Vector2 vp2 = mapCamera.WorldToViewportPoint(CorrectPosition);//将三维物体的世界坐标转换为视口坐标
        position = new Vector2((vp2.x * RectRoot.sizeDelta.x) - (RectRoot.sizeDelta.x * 0.5f), (vp2.y * RectRoot.sizeDelta.y) - (RectRoot.sizeDelta.y * 0.5f));
        //小地图的图标会根据实际物体的图标移动而移动
        rt.anchoredPosition = position;
    }
}

其实原理就是把实际物体的xz坐标 用WorldToViewportPoint转换成小地图坐标

即可实现这种功能

 

 UGUI MiniMap 插件还可以继续研究下,里面还是有很多东西可取的,他的物体直接挂上一个bl_MiniMapItem脚本,会在小地图上自动生成一个小图标,和物体进行关联,这样物体动,小地图图标就会动,很方便

 

posted @ 2018-06-14 21:44  三页菌  阅读(1647)  评论(0编辑  收藏  举报