2016-02-29 3 views
1

У меня есть простая аркадная игра с игроком и несколькими врагами. Я написал игру, что, когда все враги мертвы, уровень заканчивается. Я отслеживаю врагов bu, имеющих центральный GameplayController, у которого есть статический int, называемый количеством врагов. Я увеличиваю это значение с помощью активного метода скрипта, прикрепленного к каждому из объектов моего врага, и когда и враг умирает, я вызываю метод к этому контроллеру игрового процесса с именем CountEnemies, который уменьшает эту переменную, и если она равна нулю, заканчивается уровень.Unity3d иногда состояние окончания игры не срабатывает

Вот код моего CountEnemies methid называется классом врагов:

GameplayController.instance.CountEnemies(); 

где экземпляр просто возвращает одноэлементный экземпляр GameplayController.

Вот код моего метода CountEnemies:

Debug.Log("Inside Count Enemies"); 
    Debug.Log("Count Enemies before: " + enemiesCount); 
    enemiesCount--; 
    Debug.Log("Count Enemies after: " + enemiesCount); 

    if (enemiesCount == 0) 
    { 
     Debug.Log("Enemy Count is equal to zero"); 
     //Complete Level 
    } 
    Debug.Log("End Count Enemies"); 

Теперь вопрос он используется для работы в большинстве случаев. Но случайным образом, в какой-то момент, когда я пытаюсь запустить его на мобильном устройстве, он не может завершить уровень. Я много раз пытался диагностировать проблему, но каждый раз, когда я запускаю ее на ПК, кажется, что она работает безупречно и безотказно даже в редких случаях, когда она вызывала проблему, все, что я мог обнаружить, это то, что, несмотря на то, что CountEnemies вызывали на каждом шагу, по какой-то странной причине переменная счетчика врагов, кажется, не уменьшилась или, возможно, была увеличена.

Я отслеживаю код через видеокарту Visual Studio и ссылки, и только вместо метода Awake я увеличиваю переменную. Пожалуйста, помогите мне разобраться в этом или по крайней мере предложить мне, как его отлаживать, как всякий раз, когда значение этой переменной обновляет прикрепленный отладчик, позволяет мне знать или что-то в этом роде.

+0

Когда метод вызван? Это когда враг убивается в методе OnDeath()? – Chad

ответ

1

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

Возможно, это может быть ваша проблема.

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

Лучшим решением может быть сценарий, который периодически проверяет количество GameObjects с вашим компонентом, который в настоящее время существует в Сцене. В качестве альтернативы вы можете проверить, сколько осталось врагов, когда вы распоряжаетесь существующим противником (вы не хотите, чтобы часть Update или FixedUpdate).

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

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

+2

Общий принцип программирования, который мне нравится, - «Единственный источник истины». Никогда не имеет, например, класса Switch, который имеет как «bool isTurnedOn», так и «bool isTurnedOnByPlayer». Всегда должен быть только один способ получить конкретный номер или часть данных, которые вам нужны в вашем коде.В наибольшей степени кэшируйте производное значение перед вычислением (только если это окажется необходимым для производительности) и жестко контролируйте доступ к этому кешу. – Katana314

+0

Хорошо, я видел классы GameManager в нескольких учебниках и видеороликах для Unity, и я начал реализовывать аналогичную логику и в своих проектах. В этом случае количество врагов, которые была загружена в течение жизни, будет храниться здесь как собственность. – Chad

+0

@Polantris В качестве альтернативы вы можете проверить, сколько оставшихся врагов осталось, когда вы избавляетесь от существующего врага (вы не хотите, чтобы он был частью Update или FixedUpdate). Что вы имеете в виду не в обновлении? Я проверяю условие, чтобы уничтожить противника внутри метода Update, а затем я вызываю Destroy в свой игровой объект. В частности, в моем случае не было бы kay, если я вызову FindObjectsOfType в методе CountEnemies моего GameplayController? Во-вторых, скажем, если у меня будет около 15 врагов сразу, было бы дорого назвать это или нет? –

Смежные вопросы