Сбой редактора Unity 3D, когда я вставляю этот код и нажимаю кнопку воспроизведения, вы можете помочь мне найти проблему? - PullRequest
0 голосов
/ 01 февраля 2019

Я делаю игру для мобильных устройств и

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

float RandX;

public GameObject[] elenco = new GameObject[5];
GameObject ciao;
int indice;
float RandxV = 2f;
Vector2 whereToSpawn;
public int nEnemy = 2;
public GameObject entrata;
public GameObject uscita;

void Start()
{
    for (int i = 0; i < nEnemy; i++)
    {
        indice = Mathf.RoundToInt(Random.Range(0f, 4.0f));
        Debug.Log(indice);
        if (indice == 2)
        {
            spawnaPortale();
        }
        else
        {
            RandX = Random.Range(-0.9f, 0.9f);
            while (RandxV == RandX)
            {
                RandX = Random.Range(-0.9f, 0.9f);
            }
            ciao = (GameObject)elenco[indice];
            whereToSpawn = new Vector2(RandX, transform.position.y);
            Instantiate(ciao, whereToSpawn, Quaternion.identity);
            RandxV = RandX;
        }
    }
}

void spawnaPortale()
{
    float entrataX;
    float entrataY;
    float uscitaX;
    float uscitaY;

    entrataX = Random.Range(-0.9f, 0.9f);
    uscitaX = Random.Range(-0.9f, 0.9f);
    float diffx = entrataX - uscitaX;
    while (diffx < 0.3f || diffx > -0.3f)
    {
        uscitaX = Random.Range(-0.9f, 0.9f);
    }
    float valori = this.transform.position.y - 0.5f;
    entrataY = Random.Range(valori, this.transform.position.y);
    uscitaY = Random.Range(valori, this.transform.position.y);
    float diffy = entrataY - uscitaY;
    while (diffy < 0.3f || diffy > -0.3f)
    {
        uscitaY = Random.Range(valori, this.transform.position.y);
    }
    Vector2 whereToSpawnEntrata = new Vector2(entrataX, entrataY);
    Vector2 whereToSpawnUscita = new Vector2(uscitaX, uscitaY);
    Instantiate(entrata, whereToSpawnEntrata, Quaternion.identity);
    Instantiate(uscita, whereToSpawnUscita, Quaternion.identity);
}

Этот код должен вызывать случайного врага, но он падает

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Это потому, что вы выполняете функцию с for (), но в этой функции вы используете while (), так что происходит сбой единицы.Попробуйте использовать if вместо while.Это похоже на помещение цикла внутри функции update ().

0 голосов
/ 01 февраля 2019

Проблема:

В spawnaPortale у вас есть два while цикла, например

float diffx = entrataX - uscitaX;
while(diffx < 0.3f || diffx > -0.3f)
{
    uscitaX = Random.Range(-0.9f, 0.9f);
}

// ...

float diffy = entrataY - uscitaY;
while(diffy < 0.3f || diffy > -0.3f)
{
    uscitaY = Random.Range(valori, this.transform.position.y);
}

, но внутри циклов вы никогда не обновляете значения diffx и diffy, поэтому они всегда будут иметь одно и то же значение , а именно те, которые были у них до входа в циклы ... так что одна из двух while условий будет true оно всегда останется true => вы навсегда замкнуты в петле.


Исправлено:

Обновитезначения внутри while циклов

float diffx = entrataX - uscitaX;
while(diffx < 0.3f || diffx > -0.3f)
{
    uscitaX = Random.Range(-0.9f, 0.9f);
    diffx = entrataX - uscitaX;
}

// ...

float diffy = entrataY - uscitaY;
while(diffy < 0.3f || diffy > -0.3f)
{
    uscitaY = Random.Range(valori, this.transform.position.y);
    diffy = entrataY - uscitaY;
}

Подсказка

, если для diffx и diffy используется Math.Abs вместо

float diffx = Mathf.Abs(entrataX - uscitaX);

ваши while условия становятся более сложными для интерпретации:

while(diffx < 0.3f)
{ 
    ... 
}

Также обратите внимание:

Никогда не используйте == для прямого сравнения двух значений с плавающей запятой!

Из-за точности с плавающей запятой два значения с плавающей запятой в большинстве случаев не равны

, поэтому вашиwhile состояние в Start будет, вероятно, never be true!

Неточность с плавающей запятой делает сравнение чисел с плавающей запятой неточным.Например, (1.0 == 10.0 / 10.0) может не возвращать true каждый раз.

В первом случае использование == нормально, так как вы сначала анализируете int.Но при сравнении значений float всегда используйте Mathf.Approximately like

if(Mathf.Approximately(RandxV , RandX))

Approximately () сравнивает два числа с плавающей запятой и возвращает true, если они находятся в пределах небольшого значения (Epsilon)друг друга.

Или, по крайней мере, определите диапазон, в пределах которого вы считаете два значения равными, например

if(Math.Abs(RandxV - RandX) < 0.0001f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...