Как сделать следующий уровень доступным только после сбора определенного количества монет?

#c# #2d #collision-detection #levels

#c# #2d #обнаружение столкновений #уровни

Вопрос:

В настоящее время я программирую короткую игру в Unity с использованием c #, где игрок собирает 10 монет, чтобы перейти на следующий уровень. У меня возникли проблемы с тем, чтобы мой скрипт DoorController распознал количество собранных монет.

Моя цель — заблокировать heavengate до тех пор, пока игрок не достигнет значения 10, в этот момент он разблокирует heavengate, через который игрок может пройти, чтобы загрузить следующий уровень. Используя этот скрипт, я не получаю ошибок, но дверь не действует так, как я ожидаю, поскольку она все равно позволяет мне пройти, не собирая все монеты.

 using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using UnityEngine;

public class DoorController : MonoBehaviour
{
public int index;
public string levelName;
public int coinValue;

void  OnTriggerEnter2D(Collider2D heavengate)
{
    if (heavengate.gameObject.CompareTag("Player") amp;amp; coinValue >= 10)
    Debug.Log("Coins collected"   coinValue);
    {
        SceneManager.LoadScene("EndScreenScene");
    }
}
 

‘heavengate’ — это название двери на следующий уровень, и для него установлено значение ‘Is Trigger’, в то время как ‘Player’, очевидно, является тегом для игрока и не устанавливается в качестве триггера!

У игрока и heavengate есть Box Collider 2d и Rigidbody 2d. heavengate также устанавливается как кинематический, пока игрок динамичен.

У меня также есть скрипт CoinCollector на моем плеере, чтобы уничтожать монеты при столкновении и суммировать собранные монеты, я добавлю это, если это может помочь!

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CoinCollector : MonoBehaviour
{
public int coinsCollected;

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Coin"))
    {
        coinsCollected  ;
        Destroy(other.gameObject);
    }
}
 

}

Если кто-нибудь может мне помочь, я был бы очень признателен, я застрял на этом пару дней, просматривая учебные пособия и читая сообщения здесь и на других форумах, кажется, ничего не работает: (Вероятно, это что-то очень простое, но я этого не вижу! Спасибо!!

Комментарии:

1. Вы должны быть немного более конкретными, вы даже не упомянули, какой это игровой движок, я предполагаю, что Unity, но это также может быть, например, Godot. Более того, не очень понятно, в чем ваша проблема, вы только что сказали, что это не работает, но есть ли какие-либо ошибки или просто ничего. Кроме того, ни в одном из фрагментов кода вы не можете увидеть, передали ли вы какие-либо данные из одного scipt в другой или нет. Поэтому постарайтесь обновить свой вопрос, чтобы люди могли вам помочь.

2. Привет, спасибо, что указали на это, я не был уверен, что необходимо для контекста! Я думаю, что теперь я все исправил? Когда я изначально пытался добавить код в StackOverflow, он неправильно форматировал мой код, поэтому я предположил, что ему не нужен добавленный контекст, извините.

Ответ №1:

Хм, для меня это не имеет особого смысла, если только вы все еще не забыли что-то показать. Во втором скрипте вы присваиваете переменную самому скрипту, я не могу вспомнить ни одного случая, когда это было бы полезно. Затем вы написали метод, который вы никогда не вызываете (измените оценку), и в классе CoinCollector вы присваиваете собранные монеты int, но никогда не используете его ни в одном из других сценариев. Вот как я бы это сделал:

  1. Ссылочный совпадающий коллектор в DoorController public CoinController coincontroller;
  2. Установите coinsCollected на public static int coinsCollected;
  3. В OnTrigger вы выполняете coinValue = CoinCollector.coinsCollected; перед операцией if

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

Комментарии:

1. Привет, большое спасибо за ответ! Я следовал вашим инструкциям и добавил все ссылки, но, похоже, у меня все та же проблема: ( Похоже, что OnTriggerEnter теперь считает heavengate как монету, поэтому я сделал пустое обновление и поместил в него «coinValue = CoinCollector.coinsCollected;», но он по-прежнему обновляется только тогда, когда я просматриваюворота. Я не совсем уверен, какую еще информацию я мог бы добавить, извините. Я пытаюсь заставить coinValue повышаться только при прохождении монеты, как только я достигну coinValue>= 10, я бы хотел, чтобы heavengate был доступен, но ни в коем случае до этого он не должен активировать LoadScene