Files
aibis-dream/Assets/Scripts/SceneManagement/SpawnerKit/Spawner.cs
T

74 lines
2.5 KiB
C#

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<MobileObjectData> _selector;
private MobileObjectFactory _factory;
public readonly List<AbsMobileObject> mobileObjects = new();
private float _curInterval;
private float _targetInterval;
public void Awake()
{
// 先为Data赋一些公共值
var newMobileDatas = new List<MobileObjectData>();
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<MobileObjectData>(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);
}
}
}