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);
}
}
}
}
Этот скрипт привязан к префабу. На сцене размещено два и более экземпляра префаба.
Проблемы:
- При клике на любой объект, значение переменной меняется во всех экземплярах префаба.
- В консоль выводится уведомление о клике столько раз, сколько экземпляров размещено (скрин прикладываю). При этом каждые экземпляр имеет своё уникальное имя, но выводится в консоль имя именно "кликнутого" объекта.
Базово в скрипте отсутствовал 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);
}
}
}
}