2015-03-30 2 views
-1

Пожалуйста, помогите, я новичок в Unity и программировании: У меня есть два Bouncing Ball, тег как BouncingBall1 и BouncingBall2, я хочу, чтобы пуля ударила и для уничтожения, и если время не было превышено displaySecond, и вы уничтожили шары, которые вы выиграли, но моя проблема - OnCollisionEnter не работает. Часть выигрыша не работает, остальные фрагменты кода ниже.OnCollisionEnter не работает:

function OnCollisionEnter(col.collision) { 
    if ((displaySecond < 30) && (
      col.gameObject.tag == 
      BouncingBall1 == null && 
      col.gameObject.tag == 
      BouncingBall1 == null)) { 
     print("You have won"); 
    } 
} 
+0

Что значит, что он не работает? Является ли функция не вызываемой в первую очередь или есть ошибка в коде внутри функции? Вы можете добавить инструкцию 'Debug.Log()' для проверки этого. –

+0

col.gameObject.tag == BouncingBall1 == null Uhm, no. Здесь что-то не так. Этот тест не имеет смысла. Просто сделайте col.gameObject.tag == BouncingBall1, чтобы проверить, является ли тег BouncingBall1. –

+0

Извините, парни; если я появился в дампе, я просто пытался выяснить, уничтожены ли BouncingBall1 и BouncingBall2, поэтому я установил его в null. Я удалил null, см. Мой код ниже, но если я нажму на игру, сразу же консоль покажет результат Debug.log(), даже если я не уничтожу Bouncing ball: см. Мой новый код ниже функции OnCollisionEnter (col: Collision) { if (col.gameObject.tag == "BouncingBall1" && col.gameObject.tag == "BouncingBall1") { Debug.Log ("Collision"); }} –

ответ

0
col.gameObject.tag == BouncingBall1 == null 

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

Попробуйте изменить его

if ((displaySecond < 30) && 
(col.gameObject.tag == "BouncingBall1")) { 
Debug.Log("You have won!") 
} 
+0

Спасибо RoseHardt; когда я помещаю в свой код, работает только (displaySecond <30), он показал «Вы выиграли», когда displaySecond равен <30, но col.gameObject.tag == «BouncingBall1» просто покажет «У вас есть выиграл ", когда я нажимаю игру. Я просто хочу показать, что вы выиграли, когда displaySecond <30 и BouncingBall1 и BouncingBall2 были уничтожены. –

+0

Вы не можете сделать это в одном выражении if. Как вы написали это, теперь пуля должна была ударить одновременно как ball1, так и ball2. Вы могли бы попробовать иметь два булевых шара 1hit и ball2hit и три оператора if, которые проверяли бы, если бы мяч был поражен, и установив первое значение boolean в true. И один проверяет, ударил ли мяч два и установил, что boolean - true. то, если логическое одно и boolean два являются истинными печатью, которую вы выиграли. – ILiveForVR

0

Похоже, что вы хотите отслеживать, был ли уничтожен каждый мяч и надпись «Вы выиграли «когда оба были уничтожены. Этот код немного сырой, но должен достичь этого:

var ball1Destroyed = false; 
var ball2Destroyed = false; 

... 

function OnCollisionEnter(col : Collision) { 
    if (col.gameObject.tag == "BouncingBall1") { 
     ball1Destroyed = true; 
    } 
    if (col.gameObject.tag == "BouncingBall2") { 
     ball2Destroyed = true; 
    } 
    if (displaySecond < 30 && ball1Destroyed && ball2Destroyed) { 
     Debug.Log("You have won"); 
    } 
} 

Этого код предполагает, что только столкновения будут между пулями и шариками (а не между одним шариком и другим), это может быть сделано с collision layers.

+0

Спасибо Адаму Х, да, столкновение должно быть между только пулей и двумя шарами, я пробовал свой код, но даже когда мяч не разрушен, а displaySecond <30 все еще говорит «Ты выиграл», я не знаю, что я ошибся –

+0

Я немного изменил код, чтобы сделать условие выигрыша более понятным. Я предлагаю вам добавить 'Debug.Log' внутри блоков 'if', чтобы вы могли видеть, когда шары уничтожаются. Или, еще лучше, присоедините отладчик и поставьте точку прерывания внутри функции, чтобы вы могли видеть, когда она попадает. –

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