Unity - пытается добавить элементы в указанных c местах в Mapbox - PullRequest
0 голосов
/ 05 февраля 2020

Я следовал руководству на YouTube, где разработчик добавил элементы, появляющиеся вокруг игрока через определенный интервал, с максимальным расстоянием на плитке в MapBox. То, чего я пытаюсь добиться, - это добавить их с указанием c долготы и широты.

Изменения, которые я внес, были сделаны в l oop через максимальное количество элементов, которые я хочу добавить, увеличивая i переменная. Затем вместо того, чтобы вызывать предмет вокруг игрока, как newLat = getPlayerPosition() + random;, я жестко закодировал лат и лон, как: case 0: newLat = 48.30791f; newLon = 18.08611f; millenium_item.tag = "MI0"; break;

И каждый предмет добавляется в список предметов. Я ожидаю, что добавлю каждый элемент в список, а затем выведу их на карту, но вместо этого добавляется только один элемент, который имеет ту же широту и долготу, что и игрок:

case 3: newLat = 48.32232f; newLon = 18.09462f; millenium_item.tag = "MI3"; break;

Случай 3 добавляется, поскольку он имеет те же значения широты и долготы, что и у моего проигрывателя (где на самом деле находится телефон).

case 4: newLat = 48.32232f; newLon = 18.09538f; millenium_item.tag = "MI4"; break;

Случай 4 не добавляется, но, как вы можете видеть, он довольно близок к местонахождение дела 3.

Я не знаю, что я делаю неправильно. Полный код:

void SpawnItems() {

        itemindex = 100;
        for(int i = 0; i < count; i++)
        {
            if (googleSignIn.locationdata[i] == false)
            {
            MilleniumItemType type = (MilleniumItemType)(int)UnityEngine.Random.Range(0, Enum.GetValues(typeof(MilleniumItemType)).Length);
            float newLat = 0; 
            float newLon = 0;

            MilleniumPuzzle prefab = Resources.Load("MilleniumItems/puzzle", typeof(MilleniumPuzzle)) as MilleniumPuzzle;
            MilleniumPuzzle millenium_item = Instantiate(prefab, Vector3.zero, Quaternion.Euler(-100, 0, 0)) as MilleniumPuzzle;
            millenium_item.tileManager = tileManager;

                switch (i)
                {
                     ...
                case 3: newLat = 48.32232f; newLon = 18.09462f; millenium_item.tag = "MI3"; break;
                case 4: newLat = 48.32232f; newLon = 18.09538f; millenium_item.tag = "MI4"; break;
                case 5: newLat = 48.32310f; newLon = 18.09536f; millenium_item.tag = "MI5"; break;
                     ...
                }
                /// OUR LAT: 48.32232 OUR LON: 18.09462

                    millenium_item.Init(newLat, newLon);
                    items.Add(millenium_item);
        }
        }

Тогда Init выглядит так:

public void Init(float _lat, float _lon) {
    lat = _lat;
    lon = _lon;
    UpdatePosition ();
}

и:

public void UpdatePosition() {
    float x, y;
    Vector3 position = Vector3.zero;

    geodeticOffsetInv (tileManager.getLat * Mathf.Deg2Rad, tileManager.getLon * Mathf.Deg2Rad, lat * Mathf.Deg2Rad, lon * Mathf.Deg2Rad, out x, out y);

    if ((lat - tileManager.getLat) < 0 && (lon - tileManager.getLon) > 0 || (lat - tileManager.getLat) > 0 && (lon - tileManager.getLon) < 0) {
        position = new Vector3(x, .5f, y);
    }
    else {
        position = new Vector3 (-x, .5f, -y);
    } 

    position.x *= 0.300122f;
    position.z *= 0.123043f;

    Debug.Log("Position of inited millenium puzzle: " + position.x + " z: " + position.z);

    transform.position = position;
}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Я смог решить проблему сам. Добавление элементов с точными координатами никогда не работало, поэтому вместо этого я сохраняю координаты элементов в массиве. Затем в update() я сравниваю положение игрока с координатами, где должны быть предметы. Если разница между позициями будет между постоянными числами, которые я определил, то предметы будут появляться вокруг игрока, хотя не совсем в здании, но в моем случае я не против. Пример:

   `public void SpawnItems() {

    itemindex = 100;
    for(int i = 0; i < count; i++)
    {

        if (googleSignIn.locationdata[i] == false && spawnedItem[i] == false)
        {
            if(tileManager.getLat - itemLats[i] < 0.003f && tileManager.getLat - itemLats[i] > -0.003f && tileManager.getLon - itemLons[i] < 0.00103f && tileManager.getLon - itemLons[i] > -0.00103f)
            {
                    MilleniumItemType type = (MilleniumItemType)(int)UnityEngine.Random.Range(0, Enum.GetValues(typeof(MilleniumItemType)).Length);


                    MilleniumPuzzle prefab = Resources.Load("MilleniumItems/puzzle", typeof(MilleniumPuzzle)) as MilleniumPuzzle;
                    MilleniumPuzzle millenium_item = Instantiate(prefab, Vector3.zero, Quaternion.Euler(-100, 0, 0)) as MilleniumPuzzle;
                    millenium_item.tileManager = tileManager;

                    float newLat = tileManager.getLat + UnityEngine.Random.Range(-0.0001f, 0.0001f);
                    float newLon = tileManager.getLon + UnityEngine.Random.Range(-0.0001f, 0.0001f);

                    if(newLat == previousLat || newLon == previousLon)
                {
                     newLat = tileManager.getLat + UnityEngine.Random.Range(-0.0001f, 0.0001f);
                     newLon = tileManager.getLon + UnityEngine.Random.Range(-0.0001f, 0.0001f);
                }

                previousLon = newLon;
                previousLat = newLat;

                    spawnedItem[i] = true;

                    millenium_item.tag = "MI" + i;

                    millenium_item.Init(newLat, newLon);
                    items.Add(millenium_item);  
            }
    }
    }
}`
0 голосов
/ 17 февраля 2020

Трудно точно сказать, что является причиной этого, но у этого блока кода есть хорошие шансы получить индекс вне диапазона исключений.

for(int i = 0; i < count; i++)
{
    if (googleSignIn.locationdata[i] == false)
    {

Вместо этого вы должны сделать:

for(int i = 0; i < googleSignIn.locationdata.length; i++)
{
    if (googleSignIn.locationdata[i] == false)
    {

Но есть еще одна проблема.

И этот класс, и класс googleSignIn инициализируются в Start(), и вам не гарантируется, что googleSignIn будет выполняться первым. Чтобы это исправить, вы должны переместить вызов SpawnItems(); на Awake() вместо Start()

...