Files
aibis-dream/Assets/Scripts/SceneManagement/SpawnerKit/Spawner.cs
T
2025-06-04 14:53:27 +08:00

108 lines
3.3 KiB
C#

using System.Collections.Generic;
using AibisDream.Framework;
using UnityEngine;
namespace AibisDream
{
public class Spawner : MonoBehaviour
{
[SerializeField] private MobileObjectData[] mobileObjectDatas;
[SerializeField] private bool isDistanceMode = true;
[SerializeField] private float existTime;
[SerializeField] private float existDistance;
[SerializeField] protected Vector2 intervalRange;
protected ISelector<MobileObjectData> selector;
protected MobileObjectFactory factory;
public readonly List<AbsMobileObject> mobileObjects = new();
protected float curInterval;
protected float targetInterval;
private void Awake()
{
Init();
}
private void Init()
{
// 先为Data赋一些公共值
var newMobileDatas = SetPublicVariable();
// 处理随机权重
selector = CreateSelector(newMobileDatas);
// 创建工厂
factory = new MobileObjectFactory(transform);
// 收集初始物体
CollectDefaultMobiles();
// 间隔归零
curInterval = 0;
targetInterval = Random.Range(intervalRange.x, intervalRange.y);
// 生成第一个物体
Spawn();
}
protected virtual ISelector<MobileObjectData> CreateSelector(IEnumerable<MobileObjectData> datas)
{
return new RandomSelector<MobileObjectData>(datas, data => data.weight);
}
private List<MobileObjectData> SetPublicVariable()
{
var res = new List<MobileObjectData>();
foreach (var temp in mobileObjectDatas)
{
var dataItem = temp;
dataItem.isDistanceMode = isDistanceMode;
dataItem.existTime = existTime;
dataItem.existDistance = existDistance;
res.Add(dataItem);
}
return res;
}
private void CollectDefaultMobiles()
{
// 为工厂收集一些初始物体
var initObjects = GetComponentsInChildren<AbsMobileObject>();
factory.AddRecycleMobiles(initObjects);
foreach (var initObject in initObjects)
{
initObject.Init();
mobileObjects.Add(initObject);
initObject.OnDisposed += o => mobileObjects.Remove(o);
}
}
private void Update()
{
OnUpdate();
}
protected virtual void OnUpdate()
{
curInterval += Time.deltaTime;
// 按时间间隔生成物体
if (curInterval >= targetInterval)
{
Spawn();
curInterval = 0;
targetInterval = Random.Range(intervalRange.x, intervalRange.y);
}
}
protected virtual void Spawn()
{
// 生成物体
var data = selector.Select();
var mobileObj = factory.CreateMobileObject(data);
mobileObjects.Add(mobileObj);
// 销毁时同样记录
mobileObj.OnDisposed += o => mobileObjects.Remove(o);
}
}
}