@strelok_1014

Ошибка: Trying to Invoke method: Player.Lose couldn't be called?

Добпый день, я хочу активировать возврат своего персонажа после смерти. То есть, чтобы игра автоматически перезапускалась. Но у меня выскакиет - "Trying to Invoke method: Player.Lose couldn't be called". Я пытался найти ошибку в коде, но безуспешно. Буду рад если поможете)

Первая часть кода:
< code lang = "cs" >
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Main : MonoBehaviour
{
public void Lose()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}


Вторая часть кода:
< code lang = "cs" >
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
Rigidbody2D rb;
public float speed;
public float jumpHeight;
public Transform groundCheck;
bool isGrounded;
Animator anim;
int curHp; //current health point (текущее количество жизней)
int maxHp = 3; //максимальное количество жизней
bool isHit = false;
public Main main;

void Start()
{
rb = GetComponent();
anim = GetComponent();
curHp = maxHp;
}

void Update()
{

CheckGround();
if (Input.GetAxis("Horizontal") == 0 && (isGrounded))
{
anim.SetInteger("State", 1);
}
else
{
Flip();
if (isGrounded)
anim.SetInteger("State", 2);
}
}

void FixedUpdate()
{
rb.velocity = new Vector2(Input.GetAxis("Horizontal") * speed, rb.velocity.y);
if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
rb.AddForce(transform.up * jumpHeight, ForceMode2D.Impulse);
}

void Flip()
{
if (Input.GetAxis("Horizontal") > 0)
transform.localRotation = Quaternion.Euler(0, 0, 0);
if (Input.GetAxis("Horizontal") < 0)
transform.localRotation = Quaternion.Euler(0, 180, 0);
}

void CheckGround()
{
Collider2D[] colliders = Physics2D.OverlapCircleAll(groundCheck.position, 0.2f);
isGrounded = colliders.Length > 1;
if (!isGrounded)
anim.SetInteger("State", 3);
}

public void RecountHp(int deltaHp)
{
curHp = curHp + deltaHp;
if (deltaHp < 0)
{
StopCoroutine(OnHit()); // чтобы корутины не накладывались друг на друга
isHit = true; // и не происходило конкурирующего значения между
StartCoroutine(OnHit()); // значениями зелёного и синего цветов
}
print(curHp);
if (curHp <= 0)
{
//.enabled позволяет выключить или включить любой компонент у объекта
GetComponent().enabled = false;
Invoke("Lose", 2f);
}

IEnumerator OnHit()
{
if (isHit) // сначала начинается карутина
GetComponent().color = new Color(1f, GetComponent().color.g - 0.04f, GetComponent().color.b - 0.04f);
// затем идёт к красному цвету
else
GetComponent().color = new Color(1f, GetComponent().color.g + 0.04f, GetComponent().color.b + 0.04f);
// после isHit = false, мы будем к стандартному цвету и до него дойдём, а после условие будет проверятся заново, заново и заново (пока g == 1f)
if (GetComponent().color.g == 1f)
StopCoroutine(OnHit());
if (GetComponent().color.g <= 0) // когда мы достигаем красного цвета мы делаем
isHit = false; // то мы isHit делаем false

yield return new WaitForSeconds(0.02f);
StartCoroutine(OnHit());
}

void Lose()
{
main.GetComponent().Lose();
}
}
}
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
StopCoroutine(OnHit());
Неправильное использование. По факту у вас ничего не останавливается.
Поэтому Lose вызывается много раз и в конечном итоге тогда, когда объекта уже не существует.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы