Советы по инстанции? - PullRequest
       14

Советы по инстанции?

1 голос
/ 30 сентября 2019

Это мой первый вопрос о переполнении стека. Я новичок в коде, так что, пожалуйста, потерпите меня и мой ужасный код.

void ChickenInstantiate()
    {
        LocOfChkn.Add(spawnLoc);
        int i = 0;
        for (int ChickenCount = 0; ChickenCount < maxChickenCount; ChickenCount++)
        {
            while (Vector3.Distance(spawnLoc, LocOfChkn[i]) < 2)
            {
                spawnLoc = new Vector3(Random.Range(randXMin, randXMax), Random.Range(randYMin, randYMax), 1);
                spawnLoc.z = 5;
                i += 1;
                if (i >= LocOfChkn.Count)
                {
                    break;
                }
            }
            Instantiate(ChickenPrefab1, spawnLoc, Quaternion.identity);
            LocOfChkn.Add(spawnLoc);
            i = 0;
        }
    }

Это некоторый код для создания префаба, но я должен убедиться, что он не создан в какой-либо области, и, честно говоря, я 'я не уверен, как я должен это исправить - он полностью сломан;цыплята не появляются, я даже не уверен, что они появляются в правильных областях и т. д. (кстати, при запуске определяется первый экземпляр spawnLoc)

Я использую текущую последнюю версиюЕдинство и визуальная студия.

1 Ответ

0 голосов
/ 01 октября 2019
  • Вы должны Instantiate курица для первого места, которое вы добавляете к locOfChkn. Это будет служить как для гарантии того, что ваш код работает, так и для избежания лишнего места.

  • Используйте VSCode или вашу любимую среду IDE для пошаговой оценки вашей функции, чтобыточно знать, что происходит. За исключением этого, добавьте Debug.Log s для каждого шага.

  • Проверьте иерархию для всех порожденных цыплят. Возможно, они отключены.

Теперь по другим вопросам:

  • Пожалуйста, следуйте соглашению C # для написания кода. Chkn и Loc почти не интуитивно понятны.

  • Если вы игнорируете позицию z при оценке расстояний, пожалуйста, используйте Vector2.Distance.

  • Использование поля для значения, которое вы используете только внутри одной функции, бесполезно. Просто установите spawnLoc как переменную внутри ChickenInstantiate.

Вот очищенная версия вашего кода

void InstantiateChicken()
{
    List<Vector3> chickenPositions = new List<Vector3>();

    for (int i = 0; i < maxChickenCount; i++)
    {
        bool doesCollide;
        Vector3 spawnLocation;
        do
        {
            spawnLocation = new Vector3(
                Random.Range(randXMin, randXMax),
                Random.Range(randYMin, randYMax),
                5);
            doesCollide = false;
            foreach (var pos in chickPositions)
            {
                if (Vector2.Distance(pos, spawnLocation) < 2f)
                    doesCollide = true;
            }
        }
        while (doesCollide);

        Instantiate(chickenPrefab1, spawnLocation, Quaternion.identity);
        chickenPositions.Add(spawnLocation);
    }
}

В качестве альтернативы, просто поместите всех своих цыплят поруки, и заставить их смещать свои позиции случайным фактором, когда они появляются.

...