Unity3D - изменение значения переменной внутри класса приводит к изменению значений во всех объектах

Примитивный скрипт обработки клика на базовом Cube

using UnityEngine;
using System.Collections;

public class TileClickController : MonoBehaviour
{
    Ray ray;
    RaycastHit hit;

    [SerializeField] private int health = 5;
    [SerializeField] private int maxHealth = 0;
    //status
    //0 - closed
    //1 - opened
    [SerializeField] private int status = 0;

    void Start()
    {
      this.maxHealth = this.health;
    }
    // Update is called once per frame
    void Update()
    {
      ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if(Physics.Raycast(ray, out hit))
        {
          if(Input.GetMouseButtonDown(0))
          {
            if( this.health <= 0 )
            {
              this.status = 1;
            }
            else
            {
              this.health--;
            }
          
          print(hit.collider.name);
        }

      }

    }
}

Этот скрипт привязан к префабу. На сцене размещено два и более экземпляра префаба.

Проблемы:

  1. При клике на любой объект, значение переменной меняется во всех экземплярах префаба.
  2. В консоль выводится уведомление о клике столько раз, сколько экземпляров размещено (скрин прикладываю). При этом каждые экземпляр имеет своё уникальное имя, но выводится в консоль имя именно "кликнутого" объекта.

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

Базово в скрипте отсутствовал this


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

Автор решения: aepot

Проверяете, попал ли луч, а вот куда попал - не проверяете.

Кстати, переместите if (Input.GetMouseButtonDown(0)) во внешнее условие, чтобы не рэйкастить впустую, если кнопка не была нажата. Наличие this. здесь ни на что не влияет.

public class TileClickController : MonoBehaviour
{
    [SerializeField] private int health;
    [SerializeField] private int maxHealth = 5;
    [SerializeField] private int status;

    void Start()
    {
        health = maxHealth;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.gameObject == gameObject)
            {
                if (health <= 0)
                {
                    status = 1;
                }
                else
                {
                    health--;
                }
          
                print(hit.collider.name);
            }
        }
    }
}
→ Ссылка