Часть кода работает (hp1 -= damage1;), а вторая часть не работает.
Где я сделал ошибку?
Вот части двух скриптов:
Player1.cs
private Bullet1 b1;
void Start()
{
b1 = FindObjectOfType<Bullet1>();
}
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag == "Bullet1")
{
hp1 -= damage1; // it works, my player loses hp
Destroy1(); // doesn't work
}
}
void Destroy1()
{
b1.hit1 = true; // hit for bullet1.cs
}
Bullet1.cs
public bool hit1;
void Update()
{
if (hit1)
{
hit1 = false;
Destroy(gameObject);
}
}
Если я переключаю bool hit = true в реальном времени в Unity, уничтожение работает. Это означает, что Bullet1.cs не может получить hit = true;
Если Меняю местами линии hp1 -= damage1;а такжеDestroy1();, мой игрок не может получить урон. Итак, Destroy1(); останавливает мой код и не может активировать другие строки. Также, если я изменю Destroy1(); на b1.hit1 = true;, ничего нового не произойдет.
Похоже, b1 для меня нулевой. Вы не на это проверяете.
В начале вашего плеера вы получаете ссылку на объект пули, но затем в своем объекте пули вы уничтожаете пулю. Ваша логика кода в этом очень странная. Вместо этого вы должны просто вызвать вызов, чтобы уничтожить пулю через обнаружение столкновения напрямую. Поместите Destroy(col.gameobject) внутри вашего обнаружения столкновений в плеере вместо того, чтобы делать то, что вы делаете с логическим значением.
@AlexMyers 1) NullReferenceException: Object reference not set to an instance of an object PlayerController.Destroy2 () (at Assets/Scripts/Game/PlayerController.cs:255) PlayerController.OnCollisionEnter2D (UnityEngine.Collision2D col) (at Assets/Scripts/Game/PlayerController.cs:116) 2) NullReferenceException: Object reference not set to an instance of an object PlayerController.Destroy2 () (at Assets/Scripts/Game/PlayerController.cs:255)
254-256: void Destroy2() { b2.hit2 = true; }
116: if (col.gameObject.tag == "Bullet1") { lasthit = 1f; hp1 -= damage1; Destroy1(); // 116 line }
Пожалуйста, обновите свой вопрос соответствующей информацией (например, NullReferenceException), а не добавляйте ее в комментарии.





Просто уничтожьте пулю через столкновение вместо использования логического значения. Это создает ненужное использование ресурсов. Из приведенного кода это все, что вам нужно сделать, чтобы уничтожить пулю с помощью скрипта плеера. Показанные части сценария маркера не нужны. Если вы хотите, чтобы дополнительная логика обрабатывалась внутри пули при ее уничтожении, используйте функцию OnDestroy для ее обработки.
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag == "Bullet1")
{
hp1 -= damage1;
Destroy(col.gameobject);
}
}
Мне нужно использовать больший код в Bullet1.cs, когда пуля сталкивается. Нравится Создание анимации и активация звука. Так что мне нужно изменить bool в Bullet1.cs
@ЯрославСмирнов Я добавил ссылку на функцию OnDestroy, чтобы узнать, как с этим справиться. Он вызывает функцию при получении команды Destroy в качестве последнего набора инструкций, которые необходимо выполнить перед уничтожением объекта.
Есть ли какая-либо ошибка в консоли, когда это происходит? Возможно, исключение нулевой ссылки? Если это так, нам нужно будет увидеть эту ошибку.