刚刚接触Unity,新手入门,项目为GIS类应用,包括地图的显示,漫游和缩放等功能,记录如下:

1.新建Unity2D项目,准备好一张世界地图

2.建立空物体,命名为MapView,把上面的图片拖放到MapView下面(Scale的设置自己调整,最好高度与camera差不多,并且添加一个BoxCollider2D的组件)

显示如下:

3.接下来我们需要控制地图的缩放、漫游拖动效果,在MapView上挂载MapView.cs来控制,代码部分如下:

using System.Collections.Generic;
using UnityEngine;

public class MapView : MonoBehaviour
{
    public Camera m_camera;
    public float moveSpeed = 0.001f;

private Vector3 mouseFirstPos = Vector3.zero;// 鼠标第一位置点【长按拖动】
    private GameObject mapview;
    float camara_min = 0.001f;
    float camara_max = 5f;
    float aspectRatio = 1f; //屏幕宽高比
    float earth_width = 1f; //地图的宽度
    float earth_height = 1f;//地图的高度
    float truemapscale = 1f;//实际地图与显示地图的比例

// Start is called before the first frame update
    void Start()
    {
        aspectRatio = Screen.width * 1.0f / Screen.height;

mapview = GameObject.Find("MapView");
        GameObject earth = GameObject.Find("Earth4");
        BoxCollider2D box2d = earth.GetComponent<BoxCollider2D>();
        earth_width = box2d.size.x * earth.transform.localScale.x;
        earth_height = box2d.size.y * earth.transform.localScale.x;
        truemapscale = earth_height / 180f;
        LoadAirport();
    }

// Update is called once per frame
    void Update()
    {
        if (!ExistPopups()) //PS:该部分代码可忽略,是我用来控制弹出窗体后禁用的,可不判断
        {
            //长按
            if (Input.GetMouseButton(0) || Input.GetMouseButton(1))
            {
                if (mouseFirstPos != Vector3.zero && mouseFirstPos != Input.mousePosition)
                {
                    var position = new Vector2(Input.mousePosition.x - mouseFirstPos.x, Input.mousePosition.y - mouseFirstPos.y);
                    if (Input.GetMouseButton(0))
                    {
                        DragMove(position);
                    }
                    mouseFirstPos = Input.mousePosition;
                }
                else
                {
                    mouseFirstPos = Input.mousePosition;
                }
            }
            //鼠标抬起事件
            if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1))
            {
                mouseFirstPos = Vector3.zero;
            }

//鼠标滑轮滚动
            if (Input.GetAxis("Mouse ScrollWheel") != 0)
            {
                float swheel = Input.GetAxis("Mouse ScrollWheel") > 0 ? 0.1f : -0.1f;
                ZoomInOut(m_camera.orthographicSize - swheel * m_camera.orthographicSize / 5);
            }

}
        
    }

/// <summary>
    /// 鼠标拖动【相机】
    /// </summary>
    /// <param name="position"></param>
    void DragMove(Vector2 position)
    {
        float bs = 5 / m_camera.orthographicSize;

float max_x = earth_width / 2 - aspectRatio*m_camera.orthographicSize;
        float move_x = position.x * moveSpeed/bs;
        float newx = m_camera.transform.position.x - move_x;
        if (newx >= -max_x && newx <= max_x)
        {
            m_camera.transform.Translate(Vector3.right * -move_x, transform);
        }

float max_y = earth_height / 2 - m_camera.orthographicSize;
        float move_y = position.y * moveSpeed/bs;
        float newy = m_camera.transform.position.y - move_y;
        if (newy >= -max_y && newy <= max_y)
        {
            m_camera.transform.Translate(Vector3.up * -move_y, transform);
        }
    }
    /// <summary>
    /// 放大缩小【相机】
    /// </summary>
    /// <param name="zoom"></param>
    void ZoomInOut(float zoom)
    {
        float old_level = m_camera.orthographicSize; //原级别
        if (zoom > camara_max) { zoom = camara_max; }
        if (zoom < camara_min) { zoom = camara_min; }
        m_camera.orthographicSize = zoom;

Vector3 nowcamera = m_camera.transform.position;
        float max_x = earth_width / 2 - aspectRatio * m_camera.orthographicSize;
        float max_y = earth_height / 2 - m_camera.orthographicSize;
        if (nowcamera.x < -max_x) { nowcamera.x = -max_x; }
        if (nowcamera.x > max_x) { nowcamera.x = max_x; }
        if (nowcamera.y < -max_y) { nowcamera.y = -max_y; }
        if (nowcamera.y > max_y) { nowcamera.y = max_y; }
        m_camera.transform.position = nowcamera;
    }
    /// <summary>
    /// 监测是否存在弹出窗体,如果存在就禁用地图拖动和缩放功能
    /// </summary>
    /// <returns></returns>
    bool ExistPopups()
    {
        bool ispopups = false;
        GameObject[] objs = GameObject.FindGameObjectsWithTag("Popups");
        for (var i = 0; i < objs.Length; i++)
        {
            BasePanel panel = objs[i].GetComponent<BasePanel>();
            if (panel.Isshow) { ispopups = true; break; }
        }
        return ispopups;
    }

}

好了,地图的简易显示功能就这样了,后面我会继续更新~~~

PS:因为是新手的关系,所以代码不是很完善,后面等功能完成,会和大家一起分享代码的

Unity2D 简易2D地图 —— 地图的显示相关推荐

  1. 3D激光SLAM点云地图pcd转导航可用的2D栅格地图

    本文旨在帮助读者将激光点云地图转为2D栅格地图,以便完成路径规划与导航.本方法将pcd转为pgm的原理是将接收到的点云信息以"/map"话题的形式发布,用map_server来接收 ...

  2. 高德地图实现自定义小蓝点 自定义点标记 绘制多边形/圆形区域 根据地图的移动显示或者隐藏自定义点标记的相关实现

    最近项目升级改版,项目中本来应用了苹果自带的定位模块,但升级改版有需要应用到高德地图的模块,在参考别的app地图相关模块实现过程中,自己产生了一些想法.首先说明要实现的功能需求.类似支付宝app内的跑 ...

  3. 如何利用自己的数据制作社交地图?只显示可视区域内的标注

    地址:http://www.cnblogs.com/milkmap/archive/2012/02/02/2335989.html [百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的 ...

  4. 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注...

    原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...

  5. 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注

    [百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内的标注 ...

  6. python百度地图标注自己的店名_百度地图上怎么显示店名 百度地图标注店名方法...

    对于很多经营小店的小伙伴来说,能让人一打开百度地图就能看到自己的店名显示在其中便觉得这是一件颇为高兴的事情,但问题是如何在百度地图上怎么显示自己的店名呢?下面小编就为大家带来百度地图标注店名方法,希望 ...

  7. 百度地图多标注显示以及自定义图标

    ** 百度地图多标注显示以及自定义图标 ** 效果图: HTML部分 <style>*{margin:0px;padding:0px} html{font-size: 100%;} bod ...

  8. python 战棋游戏代码实现(2):六边形地图寻路和显示

    python 战棋游戏代码实现(2):六边形地图寻路和显示 六边形地图介绍 代码介绍 地图六边形显示 A*算法的六边形寻路修改 判断某个点在哪个六边形中 完整代码 编译运行 六边形地图介绍 之前的文章 ...

  9. 加载调用本地百度地图资源,附地图下载器及黑龙江省1-16级瓦片地图,加载显示marker

    业务适用场景说明 适用范围,需要局域网或者本地环境加载显示百度地图及展示marker的业务场景,可以根据业务使用场景下载不同地区等级的地图瓦片.由于瓦片文件过大,建议放在本地服务器上. 已有1-16级 ...

最新文章

  1. linux 系统监控、诊断工具之 top 详解
  2. consul历史版本下载地址
  3. 【Transformer】Deformable DETR: deformable transformers for end-to-end object detection
  4. 彻底理解 Cookie、Session、Token
  5. SSH实现一个简单的权限控制实例(一)
  6. 内部排序算法(Golang版本)
  7. 在开发人力资源管理 HRM 系统?试试低代码
  8. SEO-老域名的选择
  9. 二线城市疯狂抢人,技术人才何去何从?
  10. R语言实现SOM(自组织映射)模型(三个函数包+代码)
  11. 【SPI】SPI学习之SPI硬件相关
  12. 深度学习跨层网络结构--特征融合
  13. (一)Activiti 数据库25张表——流程历史记录表25(ACT_EVT_LOG)
  14. ASP.NET Core源码学习(一)Hosting
  15. iPhone 11忘记了密码怎么办?
  16. RIST 和 SRT 概述:选择什么以及为什么
  17. 快速制作BT3 u盘
  18. Nao动作控制总结(一)
  19. 系统分析师历年真题免费分享
  20. 计算机网络电缆的制作组网,计算机网络基础与组网技术

热门文章

  1. java定义私有变量_Java Reflection(七):私有变量和私有方法
  2. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb5 in position 2: invalid start byte
  3. 大数据最火的Spark你确定不来了解一下吗?(1)
  4. 武汉科技大学计算机学院温文,第五届华中地区计算机类院校学生领袖峰会成功举行...
  5. Android初级基础知识复习(十八) —— 自定义通知栏
  6. composer的初级使用
  7. 浅谈音乐与计算机,浅析电脑音乐在音乐教育中的应用
  8. 大数据带来新机遇:如何利用大数据技术优化跨境电商运营?
  9. php 00截断,文件上传之\00截断与文件包含之%00截断 文件包含漏洞详解 – jinglingshu的博客...
  10. 利用Prometheus(普罗米修斯)Grafana对机器群的运行时各项数据进行监控