В общем, пожалуйста, избегайте вопросов, связанных с вашей игрой, в вопросах, чтобы они были более доступными для поиска.
Ваша проблема несколько общая, ваш метод вызывается в одной ситуации, но не вызывается в другой.
Хотя на самом деле это не ответ, изучите подход, который должен помочь вам отследить вашу проблему. Просто добавьте много вызовов 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 отображает дамп трассировки стека, показывая вам точный путь выполнения (включая номера строк), который привел к моменту времени, когда строка отладки печатается.
Хотя спам отладочных сообщений не является хорошей практикой, иногда это удобнее, чем использование полного отладчика.