как удалять клон объекта , если таких объекта два или больше на сцене?
когда игрок касается объекта с тэгом "target" он удаляет объект который не тот которого он коснулся, а если нажму на кнопку Е ещё раз, то до объекта которого коснулся он удолится
public bool finded = false; public string nameobject;
void Update()
{
if (finde && Input.GetKey(KeyCode.E))
{
Destroy(GameObject.Find(nameobjet));
}
}
private void OnTriggerEnter(Collider other)
{
if (other.tag == "target")
{
finded = true;
nameobject = other.name;
}
}
private void OnTriggerExit(Collider other)
{
if (other.tag == "target")
{
finded = false;
nameobject = other.name;
}
}
Ответы (1 шт):
Учитывая что вы в качестве идентификации используете имя тут мягко говоря нечему удивляца. Нужно иметь ссылку на сам объект что бы потом его не разыскивать по мутному описанию.
GameObject.Find пользоваться не рекомендуется, потому, что это грузная операция. А по хорошему нельзя потому, что это абсудрндное проектирование кода, где нет связонности одного с другим из-за чего и приходится жмя гашетку в пол искать непонятно где.
Сравнение по тегу тоже не рекомендуется использовать поскольку это строковый литерал и он не безопасен: ошибки, опечатки, переименование тега ломает игру об колено и потом замучаешься искать причины, если вообще заметишь что ошибка есть.
Еще если я не ошибаюсь у вас косяк, если уничтожить объект, то OnTriggerExit не произойдет, а флаг finde так и останется true и при попытке взаимодействия вы словите Null Reference Exception.
Еще очень плохо что уничтожение это единственная функция в игре, где есть взаимодействие с окружением. Тип взаимодействия нужно скрыть под абстракцией в виде интерфейса а детали реализовывать в самом объекте взаимодействия.
public interface IInteractable
{
bool LostAfterInteract { get; }
void Interact ();
}
public class InteractEnvironment : MonoBehaviour
{
public event Action<IInteractable> TargetAppeared;
public event Action<IInteractable> TargetLost;
public IInteractable Target { get; private set; }
public bool HaveTarget => Target != null;
private void OnTriggerEnter (Collider other)
{
if (other.TryGetComponent(out IInteractable interactable))
{
Target = interactable;
TargetAppeared?.Invoke();
}
}
private void OnTriggerExit (Collider other)
{
if (other.TryGetComponent(out IInteractable interactable))
{
if (Target == interactable)
RemoveTarget();
}
}
public void TryInteract ()
{
if (HaveTarget)
{
Target.Interact();
if (Target.LostAfterInteract)
RemoveTarget();
}
}
private void RemoveTarget ()
{
Target = null;
TargetLost?.Invoke();
}
}
Реализация уничтожиммого объект:
public class InteractableDestroy : MonoBehaviour, IInteractable
{
public bool LostAfterInteract => true;
public void Interact ()
{
Destroy(gameObject);
}
}
Под тем же интерфейсом можно сделать дверь:
[RequireComponent(typeof(Animator))]
public class InteractableDoor : MonoBehaviour, IInteractable
{
private bool _opened = false;
public bool LostAfterInteract => false;
private void Start ()
{
_animator = GetComponent<Animator>();
}
public void Interact ()
{
if (_opened)
Close();
else
Open();
}
private void Open ()
{
_opened = true;
_animator.SetTrigger("Open");
}
private void Close ()
{
_opened = false;
_animator.SetTrigger("Close");
}
}
И все что угодно.