unity小地图制作___按比例尺图标布局

1.

2.这里小地图显示的范围为整个空间区域,而不是单独的相机渲染区域

3.

4.

5.

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

//图标与对应的物体的映射关系
public class MinimapCell
{
    public Transform icon;     //在小地图上显示的图标
    public Transform referObj;  //图标对应的物体
    public Transform relativeObj;//地图上标杆物体
    public float scaleRealToUI;
    RectTransform rectTrans;

    public MinimapCell(Transform _icon,Transform _referObj,Transform _relativeObj,float _scaleRealToUI)
    {
        icon = _icon;//小地图中的图标
        referObj = _referObj;//小地图表示的在场景中的物体
        relativeObj = _relativeObj;//参考物体,设此物体为坐标计算的中心,从而计算出场景中物体的相对位置
        scaleRealToUI = _scaleRealToUI;//比例尺
    }

    //同步位置
    public void Synchro()
    {
        if (icon && referObj&&relativeObj)
        {
            rectTrans = icon.GetComponent<RectTransform>();
            rectTrans.anchoredPosition3D = -(referObj.position - relativeObj.position)*scaleRealToUI;//根据比例尺设置图标和地图中角色的映射位置
        }else if (referObj == null || referObj.gameObject.activeInHierarchy == false)
        {//如果角色为空(即死亡),那么隐藏该图标,可用于下一个角色,这里起到了对象池的作用
            icon.gameObject.SetActive(false);
        }
    }
}

//原理:根据世界的宽高比例设置地图UI的宽高大小(其中宽度固定,根据比例得出高度)以及计算出比例尺

//建立列表cells,用于存储当前图标和对应的物体的信息

//如果场景中有需要显示在小地图上的物体,将标杆物体和比例尺赋予图标单元;
//首先查看列表中是否有可用的cell(即该cell为激活状态,表示正对应世界中某个物体),如果有,则激活图标,设置对应物体,如果没有,则生成一个新的cell

//在update中实时调用每个cell的同步函数,实时同步位置

//如果某个物体需要在小地图中表示,那么该物体必须带有组件MiniMapFit组件,改组件用于访问地图,设置同步图标
public class MiniMap : MonoBehaviour
{
    public static MiniMap instance;
    public Transform relativeObj;//场景中的标杆物体,标杆物体放在世界区域的右上角,并且相对的,小地图的中心点在小地图的右上角,从而对应映射关系
    public GameObject cellPrefab;//图标物体的预制物体
    public List<MinimapCell> cells;//图标单元列表
    public Rect worldSize;//世界区域的真实大小(定为在场景区域中玩家可以移动的区域大小)
    RectTransform rectTrans;
    float scaleRealToUI;//比例尺

    // Start is called before the first frame update
    void Awake()
    {
        rectTrans = GetComponent<RectTransform>();
        Debug.Log(rectTrans.position+"  "+rectTrans.anchoredPosition3D+"  "+rectTrans.rect);
        scaleRealToUI = rectTrans.rect.x / worldSize.x;//计算出比例尺
        rectTrans.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, -worldSize.y* scaleRealToUI);//设置地图UI的高度
        cells = new List<MinimapCell>();

        instance = this;
    }

    // Update is called once per frame
    void Update()
    {
        //实时同步结点
        foreach (MinimapCell miniCell in cells)
        {
            miniCell.Synchro();
        }
    }

    //当增加图标示意对应的角色
    public void AddCell(Transform _referObj)
    {
        bool flag = false;//标记是否查找成功
        foreach(MinimapCell miniCell in cells)//查看链表中是否有可用的单元
        {
            if (miniCell.icon.gameObject.activeInHierarchy == false)
            {
                miniCell.referObj = _referObj;
                miniCell.icon.gameObject.SetActive(true);
                flag = true;
                break;
            }
        }

        if (!flag)//如果链表中没有空余的结点,那么新增一个结点,用于显示角色位置信息
        {
            Transform trans = Instantiate(cellPrefab, transform).transform;
            MinimapCell cell = new MinimapCell(trans,_referObj,relativeObj,scaleRealToUI);
            cells.Add(cell);
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.green;
        if(relativeObj)Gizmos.DrawWireCube(relativeObj.position- new Vector3(worldSize.x / 2, worldSize.y / 2), new Vector3(worldSize.x, worldSize.y));
    }
}

6.

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

//此类绑定在角色身上,在场景中生成角色时,可以在小地图中生成对应的图标
public class MiniMapFit : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        if (MiniMap.instance)//访问小地图,生成图标
        {
            MiniMap.instance.AddCell(transform);
        }
    }
}

原文地址:https://www.cnblogs.com/xiaoahui/p/10434872.html

时间: 2024-08-29 15:36:20

unity小地图制作___按比例尺图标布局的相关文章

Unity 小地图制作插件NJG MiniMap的简单使用

unity版本:4.5.1 NJG MiniMap版本:1.5 参考链接:http://blog.csdn.net/wuming22222/article/details/37526659,作者:CSDN SheldonCooper NJG MiniMap的下载链接很多,但是好像教程参考资料什么的很少,官网上面有份简单的介绍,不过是1.2版本的,而且是放在Google Doc上,会翻 墙的可以自己下载.这里给出CSDN的下载链接:http://download.csdn.net/detail/l

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

Unity 小地图点击位置映射到地图实体位置(类似王者荣耀的小地图点击功能)

小地图自制功能就不多说了,我的小地图制作参考地址:https://www.youtube.com/watch?v=EeyZ2y2Jpz4 建议直接到地址中去看UGUI的小地图的制作,觉得还是讲得比较好的. 下面在参考地址的制作前提下做一个小地图点击位置映射到地图实体位置中去的功能. 准备工作: 搭建场景: 简单来说就是自己随意搭建一个场景,然后俯视将场景截图保存作为UI的Image图片当作小地图的背景图片(这样就不利用另一个摄像机通过RenderTexture来做背景了) UI的目录解析如下:

CorelDRAW制作360安全浏览器图标

看过360浏览器图标的网友都知道那颜色是不是很炫,今天小编就来教大家详细的CorelDRAW制作360安全浏览器图标的方法,下面我们一起来看看CorelDRAW的具体内容. 首先来看看效果图: 具体步骤如下: 步骤一.首先,打开CorelDRAW软件,然后利用文字工具在画布中输入字母e,然后填充黑色,如图所示: 步骤二.然后我们选择字母e,将其转化为线性,接着填充渐变颜色,样式如图所示: 步骤三.然后利用工具箱中的椭圆工具,画两个椭圆制作出e后面的背景效果图,然后一样使用渐变色进行填充,如图所示

浅谈图标布局

标题中的图标布局,其实指的是在一个块级容器中,从左至右水平罗列若干大小.间距相等的图标,一行排列满了后自动换行到下一行继续从左至右水平罗列.至于这个布局具体应该叫什么我也不清楚,总之他有点像我们的苹果或者安卓的桌面,也有点像微软的磁贴,还有点像已经被被关闭的webqq,如果你还是不知道我说的布局是什么,看一个图你马上就清楚了. 例图出自于hoorayos 图标布局初看是很简单的,前提是你已经确定了一行图标的个数,或者确定了容器的宽带.当容器的宽带不固定,而图标的大小固定时(也就是一行的图标个数不

使用CSS3制作72个webapp图标

前言 移动网络带宽的快慢直接影响webapp应用体验效果的优差,其中加载图片是很耗流量的,所以对这一方面的性能优化是很需要的.一般对于那些小而多的图片(图标)都会采用sprite合并成一张图片来减少http的请求次数.而CSS3的出现,无疑在移动端对图标的优化有着比较大的帮助.为此,自己也琢磨使用CSS3来制作一些常用的图标.有句话这么说:能用CSS3就不用图片! 正题 于是用了一天的时间,我制作了72个相对比较常用的图标,图标效果图整理如下: PS:在线地址查看效果:http://www.jr

CSS3 圆角制作的消息提示图标

CSS3 圆角制作的消息提示图标,如果你想知道它是如何被开发的,请点击连接查看.http://www.gbtags.com/gb/rtreplayerpreview/142.htm

Unity中制作游戏的快照游戏支持玩家拍快照

Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家"拍快照",也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游戏视图,并将其显示在视图其它区域的方法.具体的操作步骤如下本文选自Unity游戏开发技巧集锦: (1)在Project视图里,创建一个C#脚本文件,并命名为ScreenTexture.在此脚本中编写如下的代码: 01     using UnityEngine; 02     using

unity 小地图的制作

说到小地图,大家可能有些不是很了解,但是说到英雄联盟大家可能眼前一亮,这个我知道! Q:英雄联盟右下角的小地图看到了吗? A:有些人会说那是小地图吗? Q:是的. 只是他们做的太好了,看起来不觉得像小地图罢了!——所以相信团队的力量! 不扯了,言归正传,开始咱们的小地图学习了! 1,打开Unity 建一个空的工程,结构如下. 2,开始写脚本了. miniMap.cs 1 using UnityEngine; 2 using System.Collections; 3 4 public class