using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Pool; public class BodyManager : MonoBehaviour { public static BodyManager _instance { get; private set; } public Body m_Rigidbody; public ObjectPool m_Pool; public float m_SpawnTime; public int m_DefaultPoolCapacity; public int m_MaxPoolCapacity; public Transform m_Parent; private Vector3 m_PelvisPosition; private void Awake() { if (_instance != null) Destroy(this); else _instance = this; } private void Start() { if (m_Rigidbody == null) Debug.Log($"Rigidbody is null"); m_Pool = new ObjectPool(CreateBody, OnTakeBodyFromPool, OnReturnBodyToPool, OnDestroyBody, true, m_DefaultPoolCapacity, m_MaxPoolCapacity); StartCoroutine(Spawn()); } private Body CreateBody() { Vector3 spawnPos = this.transform.position; Body body = Instantiate(m_Rigidbody, spawnPos, new Quaternion(Random.Range(0, 180), Random.Range(0, 180), Random.Range(0, 180), Random.Range(0, 180)), m_Parent); body.m_Pelvis.gameObject.GetComponent().AddForce(new Vector3(1, 1, 1)); m_PelvisPosition = body.m_Pelvis.position; body.SetPool(m_Pool); return body; } private void OnTakeBodyFromPool(Body body) { body.m_Pelvis.transform.position = m_PelvisPosition; body.gameObject.SetActive(true); } private void OnReturnBodyToPool(Body body) { body.gameObject.SetActive(false); } private void OnDestroyBody(Body body) { Destroy(body.gameObject); } IEnumerator Spawn() { yield return new WaitForSecondsRealtime(Random.Range(3f, 7f)); m_Pool.Get(); StartCoroutine(Spawn()); } }