先修复一下,错误的场景 删除不必要的钓场资产 修复into场景 update:更新meta文件,修复报错 update:修复资源 修复第一章节建造 修复建造第三章 update:删除多余内容 update:更新README.md update:还原图标 update:更新README update:更新配置
406 lines
13 KiB
C#
406 lines
13 KiB
C#
using asap.core;
|
||
using System.Threading.Tasks;
|
||
using UniRx;
|
||
using UnityEngine.AddressableAssets;
|
||
using GameCore;
|
||
using UnityEngine;
|
||
using System.Collections.Generic;
|
||
using cfg;
|
||
using System;
|
||
using System.Collections;
|
||
|
||
public struct AquariumEnterMapScene
|
||
{
|
||
public bool isShowUI;
|
||
}
|
||
public struct EnterMaped
|
||
{
|
||
|
||
}
|
||
public struct ChangeFishEvent
|
||
{
|
||
public List<int> addFish;
|
||
public List<int> removeFish;
|
||
}
|
||
|
||
public class FishingAquariumAct : AGameAct
|
||
{
|
||
/// <summary>
|
||
/// 1 == 进匹配 2 == 退出匹配 3 == 进水族馆 4 == 退出水族馆 5 == 退到匹配
|
||
/// </summary>
|
||
public static int CloudType = 0;
|
||
AquariumManager AM;
|
||
CompositeDisposable disposables;
|
||
GameObject aquarium;
|
||
AquariumFishController aquariumFishController;
|
||
cfg.Tables _tables;
|
||
Material mutantMaterial;
|
||
GameObject fxLeftEye;
|
||
GameObject fxRightEye;
|
||
|
||
/// <summary> 变异材质,供 Report 等复用,勿释放 </summary>
|
||
public Material MutantMaterial => mutantMaterial;
|
||
public GameObject FxLeftEyePrefab => fxLeftEye;
|
||
public GameObject FxRightEyePrefab => fxRightEye;
|
||
|
||
AquariumPanel aquariumPanel;
|
||
|
||
Dictionary<int, GameObject> fishUnDownloadAlter = new Dictionary<int, GameObject>();
|
||
public static EventAggregator eventAggregator;
|
||
|
||
public override async Task<bool> StartAsync()
|
||
{
|
||
eventAggregator = new EventAggregator();
|
||
_tables = GContext.container.Resolve<cfg.Tables>();
|
||
disposables = new CompositeDisposable();
|
||
GContext.container.Unregister<AquariumManager>();
|
||
GContext.container.Unregister<FishingData>();
|
||
var fishingData = new FishingData();
|
||
GContext.container.RegisterInstance(fishingData);
|
||
AM = new AquariumManager();
|
||
await AM.Synchrodata();
|
||
GContext.container.RegisterInstance(AM);
|
||
eventAggregator.GetEvent<AquariumEnterMapScene>().Subscribe(OnEnterMapScene).AddTo(disposables);
|
||
eventAggregator.GetEvent<ChangeFishEvent>().Subscribe(OnChangeFishEvent).AddTo(disposables);
|
||
disposables.Add(GContext.OnEvent<InGradeAquariumEvent>().Subscribe(OnInAquariumEnevt));
|
||
// 加载场景
|
||
GContext.Publish(new HideHomePanelEvent());
|
||
mutantMaterial = await Addressables.LoadAssetAsync<Material>(_tables.TbFishMutant.Material).Task;
|
||
fxLeftEye = await Addressables.LoadAssetAsync<GameObject>(_tables.TbFishMutant.FxLeftEye).Task;
|
||
fxRightEye = await Addressables.LoadAssetAsync<GameObject>(_tables.TbFishMutant.FxRightEye).Task;
|
||
|
||
if (AM.data.isHome || AM.data.slotDatas == null)
|
||
{
|
||
await EnterStartScene();
|
||
}
|
||
else
|
||
{
|
||
await EnterMapScene();
|
||
await Awaiters.Seconds(1);
|
||
ShowAquariumPanel();
|
||
}
|
||
|
||
return await base.StartAsync();
|
||
}
|
||
|
||
async void ShowAquariumPanel()
|
||
{
|
||
GameObject go = await UIManager.Instance.ShowUILoad(UITypes.AquariumPanel);
|
||
aquariumPanel = go.GetComponent<AquariumPanel>();
|
||
aquariumPanel.Init(this);
|
||
_ = StartCoroutine(StartTime());
|
||
aquariumFishController.cameraManager.MoveCamera();
|
||
}
|
||
|
||
async Task EnterStartScene()
|
||
{
|
||
await LoadScene();
|
||
await UIManager.Instance.ShowUILoad(UITypes.AquariumDetectPanel);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 提前加载地图,之后加载UI
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
async Task EnterMapScene()
|
||
{
|
||
List<AquariumSlotData> slotDatas = AM.data.slotDatas;
|
||
for (int i = 0; i < AM.data.slot; i++)
|
||
{
|
||
AquariumSlotData slotData = slotDatas[i];
|
||
Item item = _tables.TbItem.GetOrDefault(slotData.fishItemID);
|
||
if (!fishUnDownloadAlter.ContainsKey(item.Quality - 1))
|
||
{
|
||
int id = _tables.GetItemData(_tables.TbGlobalConfig.FishUnDownloadAlter[item.Quality - 1]).RedirectID;
|
||
FishData fishData = _tables.TbFishData.GetOrDefault(id);
|
||
fishUnDownloadAlter[item.Quality - 1] = await Addressables.LoadAssetAsync<GameObject>(fishData.Fbx).Task;
|
||
}
|
||
}
|
||
await LoadScene();
|
||
InitFish();
|
||
}
|
||
async Task LoadScene()
|
||
{
|
||
ReleaseAquarium();
|
||
|
||
var mapData = _tables.TbMapData.DataMap[AM.MapId];
|
||
|
||
string prefabName = mapData.AquariumPrefab;
|
||
aquarium = await Addressables.InstantiateAsync(prefabName).Task;
|
||
if (disposables == null)
|
||
{
|
||
ReleaseAquarium();
|
||
return;
|
||
}
|
||
aquariumFishController = aquarium.GetComponent<AquariumFishController>();
|
||
aquariumFishController.fishManager.MaxLoadTime = 50;
|
||
aquariumFishController.cameraManager.PlayAquarium(this);
|
||
}
|
||
|
||
async void OnEnterMapScene(AquariumEnterMapScene aem)
|
||
{
|
||
if (aem.isShowUI)
|
||
{
|
||
ShowAquariumPanel();
|
||
}
|
||
else if (AM.data.isHome || AM.data.slotDatas == null)
|
||
{
|
||
CloudType = 5;
|
||
await UIManager.Instance.ShowUINotLoading(UITypes.AquariumCloudPanel);
|
||
await Awaiters.Seconds(0.75f);
|
||
await EnterStartScene();
|
||
UIManager.Instance.DestroyUI(UITypes.AquariumReportPopupPanel);
|
||
aquariumPanel = null;
|
||
UIManager.Instance.DestroyUI(UITypes.AquariumPanel);
|
||
GContext.Publish(new EndTransition());
|
||
}
|
||
else
|
||
{
|
||
await EnterMapScene();
|
||
eventAggregator.Publish(new EnterMaped());
|
||
}
|
||
}
|
||
void OnChangeFishEvent(ChangeFishEvent e)
|
||
{
|
||
List<int> removeFish = e.removeFish;
|
||
if (removeFish != null && removeFish.Count > 0)
|
||
{
|
||
for (int i = 0; i < removeFish.Count; i++)
|
||
{
|
||
aquariumFishController.fishManager.RemoveFish(removeFish[i]);
|
||
}
|
||
}
|
||
|
||
List<int> addFish = e.addFish;
|
||
if (addFish != null && addFish.Count > 0)
|
||
{
|
||
List<AquariumSlotData> slotDatas = AM.data.slotDatas;
|
||
List<AquariumResultData> aquariumResultDatas = AM.data.aquariumResultDatas;
|
||
for (int i = 0; i < addFish.Count; i++)
|
||
{
|
||
//当蛋孵化时添加鱼
|
||
int index = addFish[i];
|
||
AquariumSlotData slotData = slotDatas[index];
|
||
var time = ZZTimeHelper.UtcNow();
|
||
if (slotData.FishHatchTime() < time && !slotData.IsResult() && !aquariumResultDatas[index].IsResult())
|
||
{
|
||
EggToFish(slotData, index);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
/// <summary>
|
||
///蛋孵化 添加鱼
|
||
/// </summary>
|
||
/// <param name="slotData"></param>
|
||
/// <param name="index"></param>
|
||
void EggToFish(AquariumSlotData slotData, int index)
|
||
{
|
||
aquariumFishController.fishEggManager.RemoveEgg(index);
|
||
AddFish(slotData, index, slotData.fishMQ);
|
||
}
|
||
void OnInAquariumEnevt(InGradeAquariumEvent e)
|
||
{
|
||
Debug.Log("OnInAquariumEnevt");
|
||
|
||
if (aquarium != null)
|
||
{
|
||
aquarium.SetActive(e.type == 1);
|
||
}
|
||
}
|
||
|
||
void InitFish()
|
||
{
|
||
List<AquariumSlotData> slotDatas = AM.data.slotDatas;
|
||
if (slotDatas == null)
|
||
{
|
||
return;
|
||
}
|
||
aquariumFishController.fishManager.fishUnDownloadAlter = fishUnDownloadAlter;
|
||
var time = ZZTimeHelper.UtcNow();
|
||
List<AquariumResultData> aquariumResultDatas = AM.data.aquariumResultDatas;
|
||
|
||
for (int i = 0; i < AM.data.slot; i++)
|
||
{
|
||
AquariumSlotData slotData = slotDatas[i];
|
||
slotData.index = i;
|
||
var HatchTime = slotData.FishHatchTime();
|
||
|
||
if (HatchTime < time)
|
||
{
|
||
if (!slotData.IsResult() && !aquariumResultDatas[i].IsResult())
|
||
{
|
||
//检查是否受伤
|
||
//正常的成长时间 自然时间+加速成长-总恢复时间
|
||
float normalH = (float)(time - HatchTime).TotalHours + slotData.accelerationGrowth - slotData.allRecoveryTime;
|
||
|
||
float injuryH = slotData.injuryGrowthTime;
|
||
int fishQ = slotData.fishMQ;
|
||
if (injuryH < normalH)
|
||
{
|
||
AM.data.aquariumHurtDatas[i].fishLQ = 0;
|
||
}
|
||
else
|
||
{
|
||
fishQ -= AM.data.aquariumHurtDatas[i].fishLQ;
|
||
if (fishQ <= 0)
|
||
{
|
||
fishQ = 1;
|
||
}
|
||
}
|
||
AddFish(slotData, i, fishQ);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//初始化蛋
|
||
aquariumFishController.fishEggManager.AddEgg(slotData);
|
||
}
|
||
}
|
||
}
|
||
IEnumerator StartTime()
|
||
{
|
||
List<AquariumSlotData> slotDatas = AM.data.slotDatas;
|
||
List<AquariumResultData> aquariumResultDatas = AM.data.aquariumResultDatas;
|
||
for (int i = 0; i < AM.Slot; i++)
|
||
{
|
||
if (!aquariumResultDatas[i].IsResult() && !slotDatas[i].IsResult())
|
||
{
|
||
SetFishScale(slotDatas[i], i);
|
||
}
|
||
}
|
||
while (aquariumPanel != null)
|
||
{
|
||
DateTime dateTime = ZZTimeHelper.UtcNow();
|
||
|
||
aquariumPanel.OnUpdate(dateTime);
|
||
for (int i = 0; i < AM.Slot; i++)
|
||
{
|
||
if (!aquariumResultDatas[i].IsResult() && !slotDatas[i].IsResult() && slotDatas[i].FishGrowthTime() > dateTime)
|
||
{
|
||
SetFishScale(slotDatas[i], i);
|
||
}
|
||
}
|
||
yield return Awaiters.Seconds(1);
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 加载鱼的模型
|
||
/// </summary>
|
||
/// <param name="aquariumSlotData"></param>
|
||
/// <param name="index"></param>
|
||
void AddFish(AquariumSlotData aquariumSlotData, int index, int count)
|
||
{
|
||
aquariumFishController.fishManager.AddFish(
|
||
mutantMaterial, fxLeftEye, fxRightEye,
|
||
aquariumSlotData, count, index);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 刷新鱼的大小
|
||
/// </summary>
|
||
/// <param name="aquariumSlotData"></param>
|
||
/// <param name="index"></param>
|
||
void SetFishScale(AquariumSlotData slotData, int index)
|
||
{
|
||
var dateTime = ZZTimeHelper.UtcNow();
|
||
DateTime startTime = slotData.FishHatchTime();
|
||
|
||
float normalH = (float)(dateTime - startTime).TotalHours + slotData.accelerationGrowth - slotData.allRecoveryTime;
|
||
|
||
float progress = normalH / slotData.growthTime;
|
||
if (progress > 1)
|
||
{
|
||
progress = 1;
|
||
}
|
||
Item item = _tables.TbItem.GetOrDefault(slotData.fishItemID);
|
||
FishData fishData = _tables.TbFishData.GetOrDefault(item.RedirectID);
|
||
float scale = fishData.AquariumMinScale + (fishData.AquariumMaxScale - fishData.AquariumMinScale) * progress;
|
||
aquariumFishController.fishManager.SetFishScale(index, scale, slotData.mutants, _tables.TbFishMutant.AquariumScale[fishData.Quality - 1]);
|
||
}
|
||
void ReleaseAquarium()
|
||
{
|
||
if (aquarium != null)
|
||
{
|
||
Addressables.ReleaseInstance(aquarium);
|
||
aquarium = null;
|
||
}
|
||
}
|
||
public override async System.Threading.Tasks.Task StopAsync()
|
||
{
|
||
if (mutantMaterial != null)
|
||
{
|
||
Addressables.Release(mutantMaterial);
|
||
mutantMaterial = null;
|
||
}
|
||
if (fxLeftEye != null)
|
||
{
|
||
Addressables.Release(fxLeftEye);
|
||
fxLeftEye = null;
|
||
}
|
||
if (fxRightEye != null)
|
||
{
|
||
Addressables.Release(fxRightEye);
|
||
fxRightEye = null;
|
||
}
|
||
|
||
eventAggregator = null;
|
||
ReleaseAquarium();
|
||
if (fishUnDownloadAlter != null)
|
||
{
|
||
foreach (var item in fishUnDownloadAlter)
|
||
{
|
||
Addressables.Release(item.Value);
|
||
}
|
||
}
|
||
disposables?.Dispose();
|
||
disposables = null;
|
||
aquariumPanel = null;
|
||
UIManager.Instance.DestroyUI(UITypes.AquariumDetectPanel);
|
||
UIManager.Instance.DestroyUI(UITypes.AquariumPanel);
|
||
GContext.container.Unregister<AquariumManager>();
|
||
GContext.container.Unregister<FishingData>();
|
||
await base.StopAsync();
|
||
}
|
||
|
||
public void OnClickFish(int index)
|
||
{
|
||
aquariumPanel.OnClickFish(index);
|
||
}
|
||
|
||
#region UI操作
|
||
|
||
public bool CanDragMove()
|
||
{
|
||
return aquariumPanel != null && aquariumPanel.CanDragMove;
|
||
}
|
||
|
||
public void FollowFishCamera(AquariumSlotData slotData, bool isEgg)
|
||
{
|
||
if (isEgg)
|
||
{
|
||
var egg = aquariumFishController.fishEggManager.GetEgg(slotData.index);
|
||
aquariumFishController.cameraManager.FollowFishCamera(egg);
|
||
}
|
||
else
|
||
{
|
||
var fish = aquariumFishController.fishManager.GetFish(slotData.index);
|
||
aquariumFishController.cameraManager.FollowFishCamera(fish);
|
||
}
|
||
|
||
}
|
||
|
||
public void StopFollowFishCamera()
|
||
{
|
||
aquariumFishController.cameraManager.StopFollowFishCamera();
|
||
}
|
||
|
||
#endregion
|
||
|
||
|
||
protected override void OnDestroy()
|
||
{
|
||
|
||
}
|
||
}
|