Требуется помощь в написании скрипта Unity (C#)

при создании своей игры столкнулся с проблемой в написании скрипта. Задумка игры такова: Персонаж бегает по карте и собирает монетки, падающие с неба. Если монетку он упускает и она падает вниз - то та исчезает и у игрока отнимается жизнь - как раз с этим у меня проблема. Я попробовал создать условие, что если монетка будет на определённой позиции, то-бишь уже находясь внизу, то она исчезает, а надпись в углу показывает что у игрока отнялась жизнь. Отчасти скрипт выполняет работу - он удаляет объект, но с жизнями проблема. Объект удалился, а жизни не отнялись и надпись так и осталась прежней. Долго думал в чём проблема, много чего пробовал, но мой разум начинающего геймдева так и не додумался, потому прошу помощи.

Вот скрипт самой монеты Coin:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Coin : MonoBehaviour
{
   public GameObject coin;
   public Player player;
   Animator anim;
   public float speed;

   private void Start()
   {
       player = GetComponent<Player>();
       anim = GetComponent<Animator>();
   }
   private void Update()
   {
       transform.Translate(Vector2.down * speed);
       if (coin.transform.position.y <= -6.84f)
       {
           Destroy(coin);
           player.health--;
           player.healthText.text = "Health: " + player.health;
       }
   }

   private void OnTriggerEnter2D(Collider2D collision)
   {
       if (collision.CompareTag("Player")){
           Destroy(coin);
       }
   }
}

А вот код персонажа, собственно в котором и было написано условие:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Player : MonoBehaviour
{
   public float speed;
   public float run;
   private float moveInput;

   public int health = 5;

   public GameObject coin;
   public Text healthText;
   public Text scoreText;
   private int score = 0;

   public GameObject flipObject;
   private bool facingRight = true;

   private Animator anim;

   private void Start()
   {
       anim = GetComponent<Animator>();
   }
   private void Update()
   {
       moveInput = Input.GetAxis("Horizontal");
       transform.position += new Vector3(moveInput, 0, 0) * speed * Time.deltaTime;

       if (facingRight == false && moveInput > 0)
       {
           Flip();
       }
       else if (facingRight == true && moveInput < 0)
       {
           Flip();
       }

       if(moveInput == 0)
       {
           anim.SetBool("isRunning", false);
       }
       else
       {
           anim.SetBool("isRunning", true);
       }

       if(Input.GetKeyDown(KeyCode.LeftShift))
       {
           speed += run;
       }
       if (Input.GetKeyUp(KeyCode.LeftShift))
       {
           speed -= run;
       }
   }

   void Flip()
   {
       facingRight = !facingRight;
       Vector3 scaler = flipObject.transform.localScale;
       scaler.x *= -1;
       flipObject.transform.localScale = scaler;
   }

   private void OnTriggerEnter2D(Collider2D collision)
   {
       if(collision.gameObject.tag == "Coin")
       {
           score++;
           scoreText.text = "Score: " + score;
       }
   }

}

Если этого не хватает - вот скрины инспектора игрока, иерархии и сцены: введите сюда описание изображения

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Швеев Алексей

У вас буквально ошибка снизу на скрине... Предполагаю, что там NullReferenceException - player is null или что то в этом роде.

Метод ((GameObject)this).GetComponent<ComponentType>() ищет и возвращает компонент с this объекта.

Вам же надо получить компонент Player из другого объекта

Самый простой способ: если у вас монета в префабе, то просто удалите строку

player = GetComponent<Player>();

И вручную в инспекторе перенесите игрока в поле player.

И не забывайте читать и отправлять код ошибки в следующий раз

→ Ссылка