Метод My Death () работает над сговором, но не может получить deathMenu, когда я падаю - PullRequest
0 голосов
/ 26 января 2019

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

У меня в основном работают 3 сценария, и я следовал руководству N3K по бесконечному бегуну на YouTube. Первый скрипт PlayerMotor и вызывает метод OnDeath скрипта PlayerScore, когда наш контроллер сталкивается с препятствием. Метод OnDeath сценария PlayerScore вызывает метод ToggleEndMenu сценария DeathMenu, который активирует игровой объект DeathMenu со счетом, который у нас есть на смерть.

PlayerMotor скрипт:

 void Update()
 {
       if (transform.position.y < -1)
         {
             Death();
         }
 }
 private void OnControllerColliderHit(ControllerColliderHit hit)
     {
         if (hit.point.z > transform.position.z + 0.1f && hit.gameObject.tag == "Enemy")
         {
             Death();
         }
     }

     private void Death()
     {
         isDead = true;
         GetComponent<PlayerScore>().OnDeath();
     }

Скрипт PlayerScore:

public void OnDeath()
     {
         isDead = true;

         if (PlayerPrefs.GetFloat("Highscore") < score)
         PlayerPrefs.SetFloat("Highscore", score);

         deathMenu.ToggleEndMenu(score);
     }

Сценарий DeathMenu:

public void ToggleEndMenu(float score)
     {
         gameObject.SetActive(true);
         scoreText.text = ((int)score).ToString();
         isShown = true;
     }

Так что моя проблема в том, что когда я сталкиваюсь с препятствием, метод Death () работает отлично, и мое меню смерти появляется сразу с моим счетом. Однако, когда мой персонаж падает с моста или чего-то еще, мой метод Death () в классе Update останавливает счетчик очков на экране, но не устанавливает активный игровой объект DeathMenu, поэтому мое меню смерти не появляется на моем экране. Я действительно запутался, почему это не работает. Может кто-то помочь мне с этим? Примечание. Я удалил несвязанные строки кодов из своих сценариев.

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Что если вы попытаетесь активировать свою deathMenu прямо из OnDeath ().

0 голосов
/ 26 января 2019

Вместо того, чтобы проверять, находится ли игрок за определенной точкой y, я добавил коллайдер коробки под все мои повторно созданные префабы и добавил эту строку кода в свой PlayerMotor, и он работает как шарм.Тем не менее, я определенно буду использовать подход @zambari, почему это не сработало.Спасибо за помощь.

 private void OnControllerColliderHit(ControllerColliderHit hit)
 {
     if (hit.point.z > transform.position.z + 0.1f && hit.gameObject.tag == "Enemy")
     {
         Death();
     }
     if (hit.point.y < transform.position.y + 0.5f && hit.gameObject.tag == "Enemy")
     {
         Death();
     }
 }
0 голосов
/ 26 января 2019

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

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

Хотя на самом деле это не ответ, изучите подход, который должен помочь вам отследить вашу проблему. Просто добавьте много вызовов Debug.Log () в каждое возможное место, чтобы вы могли отслеживать, как проходит ваш вызов. Хотя ваш код выглядит относительно простым, я часто сталкиваюсь с похожими ошибками с моим собственным кодом.

Что я делаю, так это просто спам Debug.Logs () на каждую запись и выход из ветки. когда программа запускается, я могу сравнить то, что, по моему мнению, происходит с тем, что происходит на самом деле.

в вашем коде я вижу несколько вещей, которые могут привести к остановке выполнения. ScoreText может быть нулевым, playerprefs не может иметь клавишу Highscroe, может отсутствовать компонент playesrscore или не вызывается метод OnControllerColliderHit.

public void OnDeath()
     {
         Debug.Log("on death started");//debug
         isDead = true;
         if (PlayerPrefs.GetFloat("Highscore") < score)
         PlayerPrefs.SetFloat("Highscore", score);
         deathMenu.ToggleEndMenu(score);
         Debug.Log("on death finished");//debug
     }
public void ToggleEndMenu(float score)
     {
         Debug.Log("toggle end menu called with score"+score);//debug
         gameObject.SetActive(true);
         scoreText.text = ((int)score).ToString();
         isShown = true;
         Debug.Log("toggle end menu finished");//debug
     }
 void Update()
 {
       if (transform.position.y < -1)
         {              
         Debug.Log("calling death from update started");//debug
         Death();
         Debug.Log("calling death from update finished"); //debug
     }
 }


private void OnControllerColliderHit(ControllerColliderHit hit)
     {
         Debug.Log("on colliderhit entered");//debug
         if (hit.point.z > transform.position.z + 0.1f && hit.gameObject.tag == "Enemy")
         {
             Death();
         }
Debug.Log("on colliderhit finished");//debug
     }

     private void Death()
     {
        Debug.Log("on death entered");//debug
         isDead = true;
         GetComponent<PlayerScore>().OnDeath();
           Debug.Log("on death finished");//debug
     }

Когда вы нажимаете на строку отладки в консоли, Unity отображает дамп трассировки стека, показывая вам точный путь выполнения (включая номера строк), который привел к моменту времени, когда строка отладки печатается.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...