74 lines
2.5 KiB
C#
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);
|
|
}
|
|
}
|
|
} |