Требуется помощь в написании скрипта 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.
И не забывайте читать и отправлять код ошибки в следующий раз
