using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace AibisDream { [RequireComponent(typeof(Spawner))] public class SpawnScenePart : AbsScenePart { private Spawner _spawner; [SerializeField] private SpawnerPartAsset[] spawnerPartAssets; public override void Init(TimesOfDay time, Weather weather = Weather.Sunny) { _spawner = GetComponent(); // 处理数据切换 curWeather = weather; OnTimeChange(time); // 切换完成后再行初始化 _spawner.Init(); } public override void OnTimeChange(TimesOfDay time) { curTime = time; var timeArray = spawnerPartAssets.Where(item => item.time == time).ToArray(); if (timeArray.Length == 0) return; var res = timeArray.DefaultIfEmpty(timeArray[0]).First(item => item.weather == curWeather); UpdateSpawner(res.mobileAddressData); } public override void OnWeatherChange(Weather weather) { curWeather = weather; var weatherArray = spawnerPartAssets.Where(item => item.weather == weather).ToArray(); if (weatherArray.Length == 0) return; var res = weatherArray.DefaultIfEmpty(weatherArray[0]).First(item => item.time == curTime); UpdateSpawner(res.mobileAddressData); } private void UpdateSpawner(AddressArray[] addressArrays) { // 先把addressArray转为字典 var dict = addressArrays.ToDictionary(addressArray => addressArray.itemName); // 处理Spawner var newData = _spawner.mobileObjectDatas.Select(item => UpdateSpawnerData(item, dict)).ToArray(); _spawner.mobileObjectDatas = newData; // 处理下面的初始化物体 var initObjects = GetComponentsInChildren(); foreach (var initObject in initObjects) { initObject.mobileObjectData = UpdateSpawnerData(initObject.mobileObjectData, dict); } } private MobileObjectData UpdateSpawnerData(MobileObjectData mobileObjectData, Dictionary addressDict) { if (addressDict.TryGetValue(mobileObjectData.itemName, out var partAsset)) { mobileObjectData.assetAddressArray = partAsset.assetAddressArray; } return mobileObjectData; } } [Serializable] public struct SpawnerPartAsset { public TimesOfDay time; public Weather weather; public AddressArray[] mobileAddressData; } [Serializable] public struct AddressArray { public string itemName; public string[] assetAddressArray; } }