Не реализуется Destroy.Object в unity
Идея состояла в том, что префабы генерируются рандомно из папки значений, доходят до второй точки, происходит итерация с игроком, там они уходят на выход, и исчезают. Но дестрой не происходит, а также объекты идут раньше, чем прошлый выйдет со второй позиции. Как можно это изменить?
Скрипт контролера "НПС"
using UnityEngine;
using System.Collections;
public class CustomerController : MonoBehaviour
{
private Transform targetPoint;
private Transform exitPoint;
public float moveSpeed = 2f;
private bool interacted = false;
private bool isMoving = true;
private Renderer customerRenderer;
public Material glowMaterial;
private Material originalMaterial;
public delegate void CustomerExitHandler();
public event CustomerExitHandler OnCustomerExit;
private void Start()
{
customerRenderer = GetComponent<Renderer>();
originalMaterial = customerRenderer.material;
Glow(true);
Debug.Log("Customer started.");
}
private void Update()
{
if (isMoving && targetPoint != null)
{
MoveTowardsTarget(targetPoint);
}
}
public void SetTarget(Transform target, Transform exit)
{
targetPoint = target;
exitPoint = exit;
Debug.Log("Target and Exit points set. Target: " + target.position + ", Exit: " + exit.position);
}
private void MoveTowardsTarget(Transform target)
{
Vector3 direction = (target.position - transform.position).normalized;
transform.position += direction * moveSpeed * Time.deltaTime;
if (Vector3.Distance(transform.position, target.position) < 0.1f)
{
isMoving = false;
if (target == targetPoint)
{
Debug.Log("Reached target point");
// Ожидание взаимодействия
}
else if (target == exitPoint)
{
Debug.Log("Reached exit point, destroying object.");
OnCustomerExit?.Invoke();
Destroy(gameObject);
}
}
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player") && !interacted)
{
interacted = true;
isMoving = false;
StartCoroutine(InteractAndLeave());
}
}
public void HandleInteraction()
{
if (!interacted)
{
interacted = true;
isMoving = false;
StartCoroutine(InteractAndLeave());
}
}
private IEnumerator InteractAndLeave()
{
Glow(false);
Debug.Log("Привет - Привет");
while (!Input.GetButtonDown("Interact"))
{
yield return null;
}
Debug.Log("Диалог закончился");
isMoving = true;
targetPoint = exitPoint;
}
private void Glow(bool state)
{
if (customerRenderer == null)
{
Debug.LogError("Renderer component is not set.");
return;
}
customerRenderer.material = state ? glowMaterial : originalMaterial;
}
private void OnDestroy()
{
Debug.Log("Object destroyed.");
OnCustomerExit?.Invoke();
}
}
Скрипт менеджера объектов который в моменте после создания назначение префабам 2 точки
using UnityEngine;
public class ObjectManager : MonoBehaviour
{
public static ObjectManager Instance;
public Transform targetPoint;
public Transform exitPoint;
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject);
}
}
}
Скрипт на всякий случай самого спаунера
using UnityEngine;
using System.Collections;
public class CustomerSpawner : MonoBehaviour
{
public GameObject[] customerPrefabs; // Массив префабов
public Transform spawnPoint; // Точка спауна
public float spawnInterval = 5f; // Интервал спауна
private void Start()
{
StartCoroutine(SpawnCustomers());
}
private IEnumerator SpawnCustomers()
{
while (true)
{
SpawnCustomer();
yield return new WaitForSeconds(spawnInterval);
}
}
private void SpawnCustomer()
{
int randomIndex = Random.Range(0, customerPrefabs.Length);
GameObject customer = Instantiate(customerPrefabs[randomIndex], spawnPoint.position, spawnPoint.rotation);
CustomerController customerController = customer.GetComponent<CustomerController>();
customerController.SetTarget(ObjectManager.Instance.targetPoint, ObjectManager.Instance.exitPoint);
customerController.OnCustomerExit += HandleCustomerExit;
}
private void HandleCustomerExit()
{
Debug.Log("Customer exited the target zone.");
}
}