using System.Collections.Generic; using AibisDream.Framework; using UnityEngine; namespace AibisDream { public class Spawner : MonoBehaviour { [SerializeField] private MobileObjectData[] mobileObjectDatas; [SerializeField] private bool flip; [SerializeField] private bool isDistanceMode = true; [SerializeField] private float existTime; [SerializeField] private float existDistance; [SerializeField] private bool isFixedInterval = true; [SerializeField] private float fixedInterval; [SerializeField] private Vector2 intervalRange; private RandomSelector _selector; private MobileObjectFactory _factory; public readonly List mobileObjects = new(); private float _curInterval; private float _targetInterval; public void Awake() { // 先为Data赋一些公共值 var newMobileDatas = new List(); foreach (var temp in mobileObjectDatas) { var dataItem = temp; dataItem.isFlip = flip; dataItem.isDistanceMode = isDistanceMode; dataItem.existTime = existTime; dataItem.existDistance = existDistance; newMobileDatas.Add(dataItem); } // 处理随机权重 _selector = new RandomSelector(newMobileDatas, data => data.weight); // 创建工厂 _factory = new MobileObjectFactory(transform); // 间隔归零 _curInterval = 0; _targetInterval = isFixedInterval ? fixedInterval : Random.Range(intervalRange.x, intervalRange.y); } public void Update() { _curInterval += Time.deltaTime; // 按时间间隔生成物体 if (_curInterval >= _targetInterval) { Spawn(); _curInterval = 0; _targetInterval = isFixedInterval ? fixedInterval : Random.Range(intervalRange.x, intervalRange.y); } } private void Spawn() { // 生成物体 var data = _selector.Select(); var mobileObj = _factory.CreateMobileObject(data); mobileObjects.Add(mobileObj); // 销毁时同样记录 mobileObj.OnDisposed += o => mobileObjects.Remove(o); } } }