国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于高德地圖 瓦片 實現 unity lbs

這篇具有很好參考價值的文章主要介紹了基于高德地圖 瓦片 實現 unity lbs。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

參考文章:

?

? ? ? ? 1.國內主要地圖瓦片坐標系定義及計算原理 | CntChen Blog

? ? ? ? 2.Unity LBS地圖(瓦片地圖,不接入任何SDK)_099_F11的博客-CSDN博客_unity離線地圖

瓦片:高德等地圖廠商把 世界地圖分成了 好多張圖片,每張圖片就是一個瓦片

實現思路,根據 https 連接 請求對應 經緯度的瓦片,然后把他們拼接起來

代碼實現:此代碼只是一個demo,只有平移,沒有縮放(效果太差)

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

public class Location
{
    public static LatLng mLatLng = null;

    public static IEnumerator SetMap(int x,int y, Image image,int zoom)
    {
        string _path = string.Format("http://webrd01.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=8", x, y, zoom);

        //string.Format("http://online1.map.bdimg.com/onlinelabel/?qt=tile&x={0}&y={1}&z=18", x, y);
        //string.Format("https://wprd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={0}&y={1}&z=16&scl=1&ltype=1", x, y);

        WWW www = new WWW(_path);
        while (!www.isDone)
        {
            yield return null;
        }
        image.sprite = Sprite.Create(www.texture, new Rect(0, 0, LocationMap.TileWidthAndHeigth, LocationMap.TileWidthAndHeigth), new Vector2(0.5f, 0.5f));//www.texture;SpriteRenderer.sprite.pivot
    }

    public static IEnumerator InitLocationPos()
    {
#if !UNITY_EDITOR
        if (!Input.location.isEnabledByUser)
        {
            Debug.LogError("Location is not enabled");
            yield break;
        }
#endif
        Input.location.Start(1,1);
        int maxWait = 30;
        while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)
        {
            yield return new WaitForSeconds(1);
            maxWait--;
        }
        if (maxWait < 1)
        {
            Debug.LogError("Location time out");
            yield break;
        }
        if (Input.location.status == LocationServiceStatus.Failed)
        {
            yield break;
        }
        else
        {
            mLatLng = new LatLng(Input.location.lastData.longitude, Input.location.lastData.latitude);
            Input.location.Stop();
        }
    }

    /// <summary>
    /// 將tile(瓦片)坐標系轉換為LatLngt(地理)坐標系,pixelX,pixelY為圖片偏移像素坐標
    /// </summary>
    /// <param name="tileX"></param>
    /// <param name="tileY"></param>
    /// <param name="zoom"></param>
    /// <param name="pixelX"></param>
    /// <param name="pixelY"></param>
    /// <returns></returns>
    public static LatLng TileXYToLatLng(int tileX, int tileY, int zoom, int pixelX = 0, int pixelY = 0)
    {
        double size = Math.Pow(2, zoom);
        double pixelXToTileAddition = pixelX / LocationMap.TileWidthAndHeigth;
        double lng = (tileX + pixelXToTileAddition) / size * 360.0 - 180.0;

        double pixelYToTileAddition = pixelY / LocationMap.TileWidthAndHeigth;
        double lat = Math.Atan(Math.Sinh(Math.PI * (1 - 2 * (tileY + pixelYToTileAddition) / size))) * 180.0 / Math.PI;
        return new LatLng(lng, lat);
    }
    /// <summary>
    /// 將LatLngt地理坐標系轉換為tile瓦片坐標系,pixelX,pixelY為圖片偏移像素坐標
    /// </summary>
    /// <param name="latlng"></param>
    /// <param name="zoom"></param>
    /// <param name="tileX"></param>
    /// <param name="tileY"></param>
    /// <param name="pixelX"></param>
    /// <param name="pixelY"></param>
    public static TileInfo LatLngToTileXY(LatLng latlng, int zoom)
    {
        double size = Math.Pow(2, zoom);
        double x = ((latlng.Longitude + 180) / 360) * size;
        double lat_rad = latlng.Latitude * Math.PI / 180;
        double y = (1 - Math.Log(Math.Tan(lat_rad) + 1 / Math.Cos(lat_rad)) / Math.PI) / 2;
        y = y * size;

        int tileX = (int)x;
        int tileY = (int)y;
        return new TileInfo(tileX, tileY, (int)((x - tileX) * LocationMap.TileWidthAndHeigth), (int)((y - tileY) * LocationMap.TileWidthAndHeigth));
    }
}

public class LatLng
{
    public double Longitude;
    public double Latitude;
    public LatLng(double longitude, double latitude)
    {
        Longitude = longitude;
        Latitude = latitude;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 滑動方向枚舉
/// </summary>
public enum Direction
{
    up,
    down,
    left,
    right
}

/// <summary>
/// 瓦片信息類
/// </summary>
public class TileInfo
{
    public int TileX { get;  set; }
    public int TileY { get;  set; }
    public int PixelX { get;  set; }
    public int PixelY { get;  set; }

    public TileInfo(int tileX, int tileY, int pixelX, int pixelY)
    {
        TileX = tileX;
        TileY = tileY;
        PixelX = pixelX;
        PixelY = pixelY;
    }
}

public class TileImageInfo
{
    public int TileX { get; set; }
    public int TileY { get; set; }
    public GameObject Go { get; set; }

    public TileImageInfo(int tileX, int tileY,GameObject go)
    {
        TileX = tileX;
        TileY = tileY;
        Go = go;
    }
}

/// <summary>
/// 此類中 有兩個坐標系,
/// 一個是瓦片地圖 的坐標
/// 一個是實例化prefab 把瓦片地圖 負值的gameobject 坐標
/// </summary>
public class LocationMap : MonoBehaviour
{
    //為什么設置成256*256,因為高的返回的圖就是256的,還有一種類型是512*512
    public static float TileWidthAndHeigth = 256;
    public int TileZoom = 16;

    //加載的Image 的縮放
    public static float TileScale = 1;

    [SerializeField]
    private GameObject TileMap;

    private List<TileImageInfo> TileMaps = null;

    //中心 瓦片信息類
    private TileInfo m_centerTileInfo = null;

    //最好是正方形,容易計算,目前沒處理 非正方形
    //瓦片行數
    public readonly int TileRow = 7;
    //瓦片列數
    public readonly int TileColumn = 5;

    private void Awake()
    {
        TileScale = TileMap.transform.localScale.x;
    }

    private void Start()
    {
        StartCoroutine(InitTileInfo());
    }

    private IEnumerator InitTileInfo()
    {
        yield return Location.InitLocationPos();

        if (Location.mLatLng != null)
        {
            LatLng latLng = Location.mLatLng;
#if UNITY_EDITOR
            //測試數據
            latLng = new LatLng(116.483988, 39.990255);
#endif
            if (latLng == null) yield break;

            m_centerTileInfo = Location.LatLngToTileXY(latLng, TileZoom);
            
            InitAllTile();
        }
    }

    private void InitAllTile()
    {
        //求的 左上角的 x 和 y的 瓦片值
        int x = m_centerTileInfo.TileX - (TileColumn - 1) / 2;
        int y = m_centerTileInfo.TileY - (TileRow - 1) / 2;
        //左上角Image 圖片的坐標
        Vector3 sour = new Vector3(0 - TileWidthAndHeigth * (TileColumn - 1)/2 * TileScale, 0 + TileWidthAndHeigth * (TileRow - 1)/2 * TileScale, 0);
        TileMaps = new List<TileImageInfo>(TileRow * TileColumn);
        TileImageInfo[] gameObjects = new TileImageInfo[TileRow * TileColumn];
        for (int i = 0; i < TileRow; i++)
        {
            for (int j = 0; j < TileColumn; j++)
            {
                GameObject g = Instantiate(TileMap, transform);
                g.transform.localPosition = sour + new Vector3(j * TileWidthAndHeigth * TileScale, 0, 0);

                //求取瓦片地圖橫向坐標
                int _x = x + j;

                //加載瓦片地圖
                StartCoroutine(Location.SetMap(_x, y, g.GetComponent<Image>(), TileZoom));

                //瓦片Image 存入數組
                gameObjects[j + i * TileColumn] = new TileImageInfo(_x, y, g);
                g.SetActive(true);
            }
            //
            y += 1;
            //
            sour -= new Vector3(0, TileWidthAndHeigth * TileScale, 0);
        }
        TileMaps.AddRange(gameObjects);
    }

    /// <summary>
    /// 更新瓦片位置
    /// </summary>
    /// <param name="direction"></param>
    public void MapUpdate(Direction direction = Direction.up)
    {
        int x;
        int y;

        switch (direction)
        {
            case Direction.up:
                //下向上更新
                x = m_centerTileInfo.TileX - (TileColumn - 1) / 2;
                y = m_centerTileInfo.TileY - (TileRow - 1) / 2 - 1;
                for (int i = 0; i < TileColumn; i++)
                {
                    //把最后一排搬到第一排
                    TileImageInfo info = TileMaps[i + TileColumn * (TileRow - 1)];
                    info.Go.transform.localPosition += new Vector3(0, TileWidthAndHeigth * TileRow * TileScale, 0);
                    info.TileX = x;
                    info.TileX = y;

                    StartCoroutine(Location.SetMap(x, y, info.Go.GetComponent<Image>(), TileZoom));
                    x++;
                    //冒泡
                    for (int j = 1; j <= TileRow - 1; j++)
                    {
                        int index1 = i + TileColumn * (TileRow - j);
                        int index2 = i + TileColumn * (TileRow - j - 1);
                        TileImageInfo temp = TileMaps[index1];
                        TileMaps[index1] = TileMaps[index2];
                        TileMaps[index2] = temp;
                    }
                }
                m_centerTileInfo.TileY--;
                break;
            case Direction.down:
                x = m_centerTileInfo.TileX - (TileColumn - 1) / 2;
                y = m_centerTileInfo.TileY + (TileRow - 1) / 2 + 1;
                for (int i = 0; i < TileColumn; i++)
                {
                    //把第一排搬到最后一排
                    TileImageInfo info = TileMaps[i];
                    info.Go.transform.localPosition -= new Vector3(0, TileWidthAndHeigth * TileRow * TileScale, 0);
                    info.TileX = x;
                    info.TileX = y;

                    StartCoroutine(Location.SetMap(x, y, info.Go.GetComponent<Image>(), TileZoom));
                    x++;
                    //冒泡
                    for (int j = 0; j < TileRow - 1; j++)
                    {
                        int index1 = i + TileColumn * j;
                        int index2 = i + TileColumn * (j + 1);
                        TileImageInfo temp = TileMaps[index1];
                        TileMaps[index1] = TileMaps[index2];
                        TileMaps[index2] = temp;
                    }
                }
                m_centerTileInfo.TileY++;
                break;
            case Direction.left:
                x = m_centerTileInfo.TileX - (TileColumn - 1) / 2 - 1;
                y = m_centerTileInfo.TileY - (TileRow - 1) / 2;
                for (int i = 0; i < TileRow; i++)
                {
                    //把最右列移到最左列
                    TileImageInfo info = TileMaps[i * TileColumn + (TileColumn - 1)];
                    info.Go.transform.localPosition -= new Vector3(TileWidthAndHeigth * TileColumn * TileScale, 0, 0);
                    info.TileX = x;
                    info.TileX = y;

                    StartCoroutine(Location.SetMap(x, y, info.Go.GetComponent<Image>(), TileZoom));
                    y++;
                    //冒泡
                    for (int j = 1; j <= TileColumn - 1; j++)
                    {
                        int index1 = i * TileColumn + (TileColumn - j);
                        int index2 = i * TileColumn + (TileColumn - j - 1);
                        TileImageInfo temp = TileMaps[index1];
                        TileMaps[index1] = TileMaps[index2];
                        TileMaps[index2] = temp;
                    }
                }
                m_centerTileInfo.TileX--;
                break;
            case Direction.right:
                x = m_centerTileInfo.TileX + (TileColumn - 1) / 2 + 1;
                y = m_centerTileInfo.TileY - (TileRow - 1) / 2;
                for (int i = 0; i < TileRow; i++)
                {
                    //把最左列移到最右列
                    TileImageInfo info = TileMaps[i * TileColumn];
                    info.Go.transform.localPosition += new Vector3(TileWidthAndHeigth * TileColumn * TileScale, 0, 0);
                    info.TileX = x;
                    info.TileX = y;

                    StartCoroutine(Location.SetMap(x, y, info.Go.GetComponent<Image>(), TileZoom));
                    y++;
                    //冒泡
                    for (int j = 0; j < TileColumn - 1; j++)
                    {
                        int index1 = i * TileColumn + j;
                        int index2 = i * TileColumn + (j + 1);
                        TileImageInfo temp = TileMaps[index1];
                        TileMaps[index1] = TileMaps[index2];
                        TileMaps[index2] = temp;
                    }
                }
                m_centerTileInfo.TileX++;
                break;
        }

        //每次修改 釋放資源
        Resources.UnloadUnusedAssets();
    }
}
using UnityEngine;
using UnityEngine.EventSystems;

public class MapPosManager : MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler
{
    [SerializeField]
    private GameObject Map;

    //上次拖拽的位置
    Vector2 DragPos;
    private bool isDrag = false;

    //更新 地圖的 位置邊界
    private float lx;
    private float rx;
    private float ty;
    private float by;

    //每次位置變化大小
    private float changeSzie;

    //是否移動
    private float DragFlag = 50f;

    //地圖
    private LocationMap map;

    private void Start()
    {
        map = Map.GetComponent<LocationMap>();

        changeSzie = LocationMap.TileWidthAndHeigth * LocationMap.TileScale;

        //初始化 邊界
        lx = changeSzie;
        rx = -changeSzie;
        ty = -changeSzie;
        by = changeSzie;

    }

    void Update()
    {
        //注意 沒有滑動時 不計算
        if (!isDrag) return;

        if (Map.transform.localPosition.x > lx)
        {
            map.MapUpdate(Direction.left);
            lx += changeSzie;
            rx += changeSzie;
        }
        if (Map.transform.localPosition.x < rx)
        {
            map.MapUpdate(Direction.right);
            rx -= changeSzie;
            lx -= changeSzie;
        }
        if (Map.transform.localPosition.y < ty)
        {
            map.MapUpdate(Direction.up);
            ty -= changeSzie;
            by -= changeSzie;

        }
        if (Map.transform.localPosition.y > by)
        {
            map.MapUpdate(Direction.down);
            by += changeSzie;
            ty += changeSzie;
        }
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        DragPos = eventData.position;
    }

    public void OnDrag(PointerEventData eventData)
    {
        if (Input.touchCount == 2) return;

        Vector2 offset = (eventData.position - DragPos).normalized;
        Map.transform.position += new Vector3(offset.x, offset.y , 0) * DragFlag;
        DragPos = eventData.position;
        isDrag = true;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        isDrag = false;
    }
}

創(chuàng)建ui面板,掛上腳本, 其中tileMap 為Image

unity 接高德地圖,Unity,unity,游戲引擎文章來源地址http://www.zghlxwxcb.cn/news/detail-631528.html

到了這里,關于基于高德地圖 瓦片 實現 unity lbs的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Unity 3D中使用tilemap創(chuàng)建關卡地圖,瓦片間隙有漏縫

    Unity 3D中使用tilemap創(chuàng)建關卡地圖,瓦片間隙有漏縫

    我們使用一張圖片來作為Sprite圖集,創(chuàng)建地形圖: 運行后,會發(fā)現,瓦片之間似乎總是有間距。 檢查了圖片發(fā)現,并不是圖片邊界存在間隙。 最后發(fā)現問題是出在圖片資源中的線性過濾屬性值: 在設計界面就能夠看的很清楚。 起初還以為是tilemap的屬性值設置不正確導致。

    2024年02月13日
    瀏覽(26)
  • unity游戲地圖如何實現大世界地圖

    unity游戲地圖如何實現大世界地圖

    ????????大世界地圖是游戲地圖開發(fā)中不可或缺的場景,玩家可以在其中自由探索和移動。然而,實現大世界地圖需要解決與大量地圖數據處理和加載渲染優(yōu)化有關的技術問題。本文將介紹如何利用unity游戲地圖實現大世界地圖。 ????????地圖數據處理是實現大世界地

    2024年02月06日
    瀏覽(22)
  • 【Unity 實用工具篇】?| 學會使用 可編程瓦片Tile Map,快速搭建2D地圖
  • UE5、CesiumForUnreal接入XYZ格式地圖瓦片如高德地圖、OSM、ArcGIS等

    UE5、CesiumForUnreal接入XYZ格式地圖瓦片如高德地圖、OSM、ArcGIS等

    通過改造 cesium-native 和 cesiumforunreal 插件,參考 tms 的柵格地圖瓦片加載邏輯,實現在UE5、CesiumForUnreal中接入 XYZ 格式的地圖瓦片服務。 以高德XYZ格式地圖加載為例,GIF動圖如下: 首先對比 tms與xyz 瓦片的區(qū)別

    2024年02月13日
    瀏覽(146)
  • 手把手教你搭建個人地圖服務器(高德離線部署解決方案):獲取地圖瓦片數據、高德JS API、私有化部署和調用。。。

    手把手教你搭建個人地圖服務器(高德離線部署解決方案):獲取地圖瓦片數據、高德JS API、私有化部署和調用。。。

    眾所周知,目前常見的地圖(高德、百度、騰訊等)只提供在線API服務,對于一些內網應用而言,如果需要使用地圖展示,則由于不能訪問互聯網而無法使用類似的第三方地圖服務。 本文,通過將高德地圖瓦片數據 和 在線JS API做了本地部署,并修改API,將其所有的網絡請求

    2024年02月04日
    瀏覽(27)
  • 瓦片地圖編輯器——實現卡馬克卷軸的編輯,鍵盤控制游戲移動和鼠標點擊游戲編輯通過同一個視口實現。

    瓦片地圖編輯器——實現卡馬克卷軸的編輯,鍵盤控制游戲移動和鼠標點擊游戲編輯通過同一個視口實現。

    ? 左邊是游戲地圖編輯區(qū),右邊是地圖緩沖區(qū),解決了地圖緩沖區(qū)拖動bug,成功使得緩沖區(qū)可以更新。 AWSD進行移動 鼠標左右鍵分別是繪制/拖動 按F1健導出為mapv3.txt F2清空數組 打印的是游戲數組 easyx開發(fā)devcpp 5.11 easyx20220922版本

    2024年01月25日
    瀏覽(31)
  • 【實現100個unity游戲之20】制作一個2d開放世界游戲,TileMap+柏林噪聲生成隨機地圖(附源碼)

    【實現100個unity游戲之20】制作一個2d開放世界游戲,TileMap+柏林噪聲生成隨機地圖(附源碼)

    我的上一篇文章介紹了TileMap的使用,主要是為我這篇做一個鋪墊,看過上一篇文章的人,應該已經很好的理解TileMap的使用了,這里我就不需要過多的解釋一些繁瑣而基礎的知識了,省去很多時間。所有沒看過上一篇文章的小伙伴我強烈建議先去看看:

    2024年01月20日
    瀏覽(57)
  • 游戲開發(fā)之Unity2021智能導航地圖烘焙

    游戲開發(fā)之Unity2021智能導航地圖烘焙

    單獨調整移動某一顆樹或者其它東西的時候可以按住 Ctrl+shift ,可以幫助我們自動吸附到某一個表面上 ?調出智能導航的面板,選擇窗口,選擇AI,選擇導航 將地面設置為靜態(tài)的,否則就不能進行烘焙,在導航中選擇對象,選擇可移動的 在導航中選擇烘焙,選擇bake ?bake完之

    2024年02月10日
    瀏覽(18)
  • Unity2D繪制游戲地圖

    Unity2D繪制游戲地圖

    首先,我們選擇我們的地圖素材(由于筆者在前段時間已經進行切割,最近才開始整理這一段,所以這個是用的老素材,可能有朋友就會覺得切割前后不一致,但是思路是一樣的,大家學習思路即可) ?接著,我們找到右上角的Slice進行圖片切割,我這邊簡單介紹一下這個切

    2024年02月08日
    瀏覽(30)
  • 基于Unity+MySQL實現貪吃蛇小游戲

    基于Unity+MySQL實現貪吃蛇小游戲

    【主界面控制程序】: using TMPro; using UnityEngine; using UnityEngine.UI; public class MainUIController : MonoBehaviour { ? ? private static MainUIController _instance; //制作外部調用的方法 ? ? public static MainUIController Instance ? ?//制作外部調用的方法 ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    2023年04月15日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包