Files
back_cantanBuilding/Assets/Scripts/SandDig/DiggingGameManager.cs
2026-05-26 16:15:54 +08:00

780 lines
25 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using asap.core;
using cfg;
using Cinemachine;
using game;
using GameCore;
using Script.RuntimeScript.ExplosionEffect;
using Script.RuntimeScript.model.Data;
using UnityEngine;
using UniRx;
using Game;
using UnityEngine.AddressableAssets;
namespace Script.RuntimeScript
{
public class DiggingGameManager
{
/// <summary>
/// 沙滩寻宝 测试 log 开启关闭
/// </summary>
private const bool LogOpen = false;
private MonoBehaviour _monoBehaviour;
public MonoBehaviour BaseMono => _monoBehaviour;
private DiggingGameModel _dataModel;
public DiggingGameModel DataModel => _dataModel;
private Animation _digAni;
private CinemachineVirtualCamera _cameraVir;
private GameObject fx_DgSanddig;
private GameObject fx_DgSanddighard;
/// <summary>
/// 通关爆炸动画
/// </summary>
private GameObject fx_DgSanddisappear;
/// <summary>
/// 游戏状态
/// </summary>
private SandDigGameState _gameState = SandDigGameState.Normal;
public SandDigGameState GameState
{
get { return _gameState; }
set
{
DiggingGameManager.LogError("沙滩寻宝状态:" + value.ToString());
_gameState = value;
}
}
public bool IsCanClick = true;
/// <summary>
/// 棋盘
/// </summary>
private GameBroadLogic _broadLogic;
public GameBroadLogic BroadLogic => _broadLogic;
/// <summary>
/// 棋盘格子背景容器
/// </summary>
private GameObject _broadContainer;
public GameObject BroadContainer => _broadContainer;
/// <summary>
/// 棋盘格子容器
/// </summary>
private GameObject _gridContianer;
public GameObject GridContainer => _gridContianer;
/// <summary>
/// 棋盘格子中道具容器
/// </summary>
private GameObject _gridPropContianer;
public GameObject GridPropContainer => _gridPropContianer;
/// <summary>
/// 宝箱道具容器
/// </summary>
private GameObject _propContainer;
public GameObject PropContainer => _propContainer;
private GameObject _showPropPositon;
public GameObject ShowPropPositon => _showPropPositon;
GameObject _DgSand_bgend => _bgSandBg?.DgSand_bgend;
private Tables _tables;
public Tables TableData => _tables;
/// <summary>
/// 爆炸管理器
/// </summary>
private ExplosionManager _explosionManager;
public ExplosionManager ExplosionManager => _explosionManager;
/// <summary>
/// 管卡是否通过
/// </summary>
public bool ClampIsPass = false;
public List<ItemData> itemDatas;
//奖励界面是否打开
private bool _awardPanelIsOpen = false;
Sound sanddig_dig_sound;
AudioClip sanddig_dig_audio;
AudioClip sanddig_dighard_audio;
DgSandBg _bgSandBg;
Transform _fxRoot;
public async System.Threading.Tasks.Task InitGame(MonoBehaviour monoBehaviour, CinemachineVirtualCamera camera, GameObject broadContainer, GameObject gridContainer, GameObject gridPropContianer, GameObject propContainer, GameObject showPropPositon, Transform fxRoot)
{
await _dataModel.InitServerData();
IniTable();
AddEventLister();
AudioLoad();
_monoBehaviour = monoBehaviour;
_cameraVir = camera;
_broadContainer = broadContainer;
_gridContianer = gridContainer;
_gridPropContianer = gridPropContianer;
_propContainer = propContainer;
_showPropPositon = showPropPositon;
_fxRoot = fxRoot;
_explosionManager = new ExplosionManager();
_explosionManager.Init();
await _dataModel.InitClientData(ClientDataHandleEnum.EnterGame);
await LoadGameObject();
}
async System.Threading.Tasks.Task LoadGameObject()
{
if (_broadLogic == null)
{
_broadLogic = new GameBroadLogic();
}
bool IsPassAll = IsPassAllClamps();
DiggingActivityInit digActivityConfig = _dataModel.digActivityConfig;
GameObject bg = await _broadLogic.LoadGameObject(digActivityConfig.Bg, _cameraVir.transform);
if (bg != null)
{
_bgSandBg = bg.GetComponent<DgSandBg>();
_DgSand_bgend?.SetActive(IsPassAll);
}
if (!IsPassAll)
{
Transform boxRoot = _propContainer.transform.Find("Box");
int count = boxRoot.childCount;
for (int i = 0; i < count; i++)
{
//宝箱加载
_ = _broadLogic.LoadGameObject(digActivityConfig.DiggingBoxList[i], boxRoot.GetChild(i));
}
GameObject dig = await _broadLogic.LoadGameObject(digActivityConfig.Shovel, _monoBehaviour.transform);
if (dig != null)
{
_digAni = dig.GetComponent<Animation>();
_digAni.gameObject.SetActive(false);
}
fx_DgSanddig = await Addressables.LoadAssetAsync<GameObject>(digActivityConfig.DiggingGridFxDg).Task;
fx_DgSanddighard = await Addressables.LoadAssetAsync<GameObject>(digActivityConfig.DiggingGridFxDh).Task;
fx_DgSanddisappear = await Addressables.LoadAssetAsync<GameObject>(digActivityConfig.DiggingGridFxDs).Task;
}
}
public void Destroy()
{
_explosionManager.Reset();
RemoveEventLister();
AudioRelease();
if (fx_DgSanddig != null)
{
Addressables.Release(fx_DgSanddig);
}
if (fx_DgSanddighard != null)
{
Addressables.Release(fx_DgSanddighard);
}
if (fx_DgSanddisappear != null)
{
Addressables.Release(fx_DgSanddisappear);
}
}
private IDisposable _onCloseAwardPanel = null;
void AddEventLister()
{
RemoveEventLister();
_onCloseAwardPanel = GContext.OnEvent<RewardPanelClose>().Subscribe(OnCloseAwardPanel);
}
void RemoveEventLister()
{
_onCloseAwardPanel?.Dispose();
_onCloseAwardPanel = null;
}
async void AudioLoad()
{
AudioRelease();
GContext.Publish(new EventBGMSound(_dataModel.digActivityConfig.Bgm));
sanddig_dig_audio = await Addressables.LoadAssetAsync<AudioClip>("audio_ui_sanddig_dig").Task;
sanddig_dighard_audio = await Addressables.LoadAssetAsync<AudioClip>("audio_ui_sanddig_dighard").Task;
sanddig_dig_sound = GContext.container.Resolve<ISoundService>().GetNewUISound(sanddig_dig_audio);
}
void AudioRelease()
{
sanddig_dig_sound?.ReturnPool();
sanddig_dig_sound = null;
if (sanddig_dig_audio != null)
{
Addressables.Release(sanddig_dig_audio);
sanddig_dig_audio = null;
}
if (sanddig_dighard_audio != null)
{
Addressables.Release(sanddig_dighard_audio);
sanddig_dighard_audio = null;
}
}
public void IniTable()
{
_tables = GContext.container.Resolve<Tables>();
}
public void InitServerData(Dictionary<string, string> userDatas = null)
{
if (_dataModel == null)
{
_dataModel = new DiggingGameModel();
}
}
public void Update()
{
if (_broadLogic != null)
{
_broadLogic.Update();
}
switch (_gameState)
{
case SandDigGameState.Normal:
break;
case SandDigGameState.LoadJson:
break;
case SandDigGameState.LoadJsonOver:
_gameState = SandDigGameState.Begin;
break;
case SandDigGameState.Begin: //开始游戏
_gameState = SandDigGameState.Going;
BeginGame();
break;
case SandDigGameState.Going: //游戏进行中
break;
case SandDigGameState.PropEffect: //挖出道具动画阶段
break;
case SandDigGameState.PropEffectEnd: //道具动画播放结束
if (ClampIsPass)
{
_gameState = SandDigGameState.Pass;
}
else
{
_gameState = SandDigGameState.Going;
}
break;
case SandDigGameState.Pass: //通关
DiggingGameManager.LogError("执行通关逻辑 ");
_gameState = SandDigGameState.Normal;
//数据再 model passClamp 中已经存储,这里显示奖励
//GContext.Publish(new ShowData());
_awardPanelIsOpen = true;
_dataModel.NewClampInit();
break;
case SandDigGameState.WaitPassLoading:
if (!_awardPanelIsOpen)
{
ShowLoadingEffect();
}
break;
case SandDigGameState.Loading:
break;
case SandDigGameState.LoadingOver:
//开始
_gameState = SandDigGameState.Begin;
break;
}
}
public void ShowFX(string fxName, bool show)
{
if (string.IsNullOrEmpty(fxName) || _fxRoot == null)
{
return;
}
Transform transform = _fxRoot.Find(fxName);
if (transform != null)
{
transform.gameObject.SetActive(show);
}
}
public void ShowFX(GridEffectType GridEffectType, Transform parent)
{
GameObject go = null;
switch (GridEffectType)
{
case GridEffectType.ClickDig:
case GridEffectType.DoubleClick:
if (fx_DgSanddig != null)
{
Transform tran = parent.Find(fx_DgSanddig.name);
if (tran == null)
{
go = GameObject.Instantiate(fx_DgSanddig, parent);
go.name = fx_DgSanddig.name;
}
else
{
go = tran.gameObject;
}
}
break;
case GridEffectType.ClickBigDig:
if (fx_DgSanddighard != null)
{
go = GameObject.Instantiate(fx_DgSanddighard, parent);
go.name = fx_DgSanddighard.name;
}
break;
case GridEffectType.PassiveBomb:
case GridEffectType.PassiveClear:
case GridEffectType.PassClamp:
if (fx_DgSanddisappear != null)
{
go = GameObject.Instantiate(fx_DgSanddisappear, parent);
go.name = fx_DgSanddisappear.name;
}
break;
}
if (go != null)
{
go.SetActive(true);
}
}
/// <summary>
/// 显示挖掘动画
/// </summary>
int digShowCount = 0;
public async void ShowDigEffect(ClickDigType type, Vector3 pos)
{
digShowCount++;
pos.z = -2;
if (_digAni != null)
{
_digAni.transform.position = pos;
_digAni.gameObject.SetActive(true);
DiggingActivityInit digActivityConfig = _dataModel.digActivityConfig;
if (type == ClickDigType.Smail)
{
_digAni.Play(digActivityConfig.DiggingShovelFxDg);
}
else
{
_digAni.Play(digActivityConfig.DiggingShovelFxDh);
}
}
int delay = 200;
if (type == ClickDigType.Smail)
{
await System.Threading.Tasks.Task.Delay(SandDigEventConst.ShovelAnimTime - delay);
//GContext.Publish(new EventUISound("audio_ui_sanddig_dig"));
if (sanddig_dig_sound != null)
{
sanddig_dig_sound.audioSource.clip = sanddig_dig_audio;
sanddig_dig_sound.audioSource.Play();
}
await System.Threading.Tasks.Task.Delay(delay);
}
else
{
await System.Threading.Tasks.Task.Delay(SandDigEventConst.BigShovelAnimTime - delay);
//GContext.Publish(new EventUISound("audio_ui_sanddig_dighard"));
if (sanddig_dig_sound != null)
{
sanddig_dig_sound.audioSource.clip = sanddig_dighard_audio;
sanddig_dig_sound.audioSource.Play();
}
await System.Threading.Tasks.Task.Delay(delay);
}
digShowCount--;
if (digShowCount <= 0 && _digAni != null)
{
_digAni.gameObject.SetActive(false);
}
}
public void BeginGame()
{
ClampIsPass = false;
if (_broadLogic == null)
{
_broadLogic = new GameBroadLogic();
}
else
{
_broadLogic.Reset();
}
int broadWidth = GetBroadWidth();
int broadHeight = GetBroadHeight();
Vector3 cameraPos = _cameraVir.transform.position;
DiggingDisplayInit diplayConfig = TableData.TbDiggingDisplayInit.GetOrDefault(broadHeight);
if (diplayConfig != null)
{
cameraPos.y = diplayConfig.VirtualCameraY;
}
_cameraVir.transform.position = new Vector3(broadWidth * 0.5f, cameraPos.y, cameraPos.z);
DiggingGameManager.LogError("当前管卡Id:::" + _dataModel.GetCurClampId() + " 棋盘宽度::" + broadWidth);
if (_dataModel.GetCurClampId() > 0)
{
_broadLogic.InitEvent();
_broadLogic.BuildBroadBack();
_broadLogic.BuildGrid();
_broadLogic.BuildProp();
_broadLogic.BuildTempProp();
_dataModel.SaveAll();
}
}
private void OnCloseAwardPanel(RewardPanelClose data)
{
//if (data.rewardType != RewardType.Destroy) return;
_awardPanelIsOpen = false;
if (_gameState == SandDigGameState.WaitPassLoading)
{
ShowLoadingEffect();
}
else if (IsPassAllClamps())
{
//通关所有关卡
DiggingGameManager.LogError("通关所有关卡!!!!!!!");
_broadLogic.Reset();
HidBox();
_DgSand_bgend?.SetActive(true);
}
}
public void GMSetClamp(int index)
{
_dataModel.GMSetClamp(index);
}
/// <summary>
/// 显示转场动画
/// </summary>
private async void ShowLoadingEffect()
{
_gameState = SandDigGameState.Loading;
await UIManager.Instance.ShowUI(UITypes.CloudTransitionPanel);
await System.Threading.Tasks.Task.Delay(500);
_gameState = SandDigGameState.LoadingOver;
GContext.Publish(new EndTransition());
}
public int GetActivityId()
{
return GContext.container.Resolve<FishingEventData>().GetEvent(4, 1);
}
public FishingEvent GetActivityConfig(int acId)
{
return GContext.container.Resolve<Tables>().TbFishingEvent.Get(acId);
}
/// <summary>
/// 获取当前管卡 是当前活动的第几关
/// </summary>
/// <returns></returns>
public int GetCurClampIndex()
{
List<int> allClamps = _dataModel.digActivityConfig.StageList;
int curClampId = _dataModel.GetCurClampId();
if (curClampId < 0)
{
return allClamps.Count - 1;
}
return allClamps.IndexOf(curClampId);
}
/// <summary>
/// 获取当前活动所有管卡数量
/// </summary>
/// <returns></returns>
public int GetAllClampCount()
{
List<int> allClamps = _dataModel.digActivityConfig.StageList;
return allClamps.Count;
}
/// <summary>
/// 通过全部管卡
/// </summary>
/// <returns></returns>
public bool IsPassAllClamps()
{
return _dataModel.GetServerData().ClampId < 0;
}
/// <summary>
/// 获取活动道具id
/// </summary>
/// <returns></returns>
public int GetActivityPropId()
{
return _dataModel.digActivityConfig.TokenID;
}
/// <summary>
/// 获取棋盘宽度
/// </summary>
/// <returns></returns>
public int GetBroadWidth()
{
BroadData[] allGrid = DataModel.GetAllBroadData();
int widthCount = 0;
for (int i = 0; i < allGrid.Length; i++)
{
if ((int)allGrid[i].LocalPos.y == 1)
{
widthCount++;
}
}
return widthCount + 1;
}
/// <summary>
/// 获取棋盘高度
/// </summary>
/// <returns></returns>
public int GetBroadHeight()
{
BroadData[] allGrid = DataModel.GetAllBroadData();
int widthCount = 0;
for (int i = 0; i < allGrid.Length; i++)
{
if ((int)allGrid[i].LocalPos.x == 1)
{
widthCount++;
}
}
return widthCount + 1;
}
/// <summary>
/// 获取棋子宽度数量
/// </summary>
/// <returns></returns>
public int GetGridWidth()
{
GridData[] allGrid = DataModel.GetAllGridData();
int minX = 0;
int maxX = 0;
for (int i = 0; i < allGrid.Length; i++)
{
if (allGrid[i].LocalPos.x < minX)
{
minX = (int)Math.Round(allGrid[i].LocalPos.x);
}
if (allGrid[i].LocalPos.x > maxX)
{
maxX = (int)Math.Round(allGrid[i].LocalPos.x);
}
}
return maxX - minX;
}
/// <summary>
/// 获取已经获得的目标道具
/// </summary>
/// <returns></returns>
public List<int> GetHasPassPropIds()
{
return DataModel.GetServerData().PassPropIds;
}
/// <summary>
/// 增加道具
/// </summary>
/// <param name="count"></param>
public void AddDigCount(int count)
{
_dataModel.AddDigCount(count);
}
public void ClearPropContianer()
{
foreach (Transform child in _propContainer.transform)
{
if (child && child.name != "Box")
GameObject.Destroy(child.gameObject);
}
}
public void DgSandBox()
{
DiggingStageReward config = GContext.container.Resolve<Tables>().TbDiggingStageReward.Get(_dataModel.GetServerData().ClampId);
Transform boxRoot = _propContainer.transform.Find("Box");
int count = boxRoot.childCount;
for (int i = 0; i < count; i++)
{
Transform box = boxRoot.GetChild(i);
box.gameObject.SetActive(box.name == config.StageBox);
}
}
void HidBox()
{
Transform boxRoot = _propContainer.transform.Find("Box");
int count = boxRoot.childCount;
for (int i = 0; i < count; i++)
{
Transform box = boxRoot.GetChild(i);
box.gameObject.SetActive(false);
}
}
public int GetCurLevel()
{
List<int> allClamps = _dataModel.digActivityConfig.StageList;
int level = allClamps.Count;
int curClampId = _dataModel.GetCurClampId();
if (curClampId > 0)
{
level = allClamps.IndexOf(curClampId) + 1;
}
return level;
}
/// <summary>
/// 沙滩寻宝打点
/// </summary>
public void SandDigPoint(GridType gridType, int level, int clickCount)
{
int type = 0;
switch (gridType)
{
case GridType.Normal:
type = 1;
break;
case GridType.Resource:
type = 3;
break;
case GridType.Special:
type = 2;
break;
}
#if AGG
using (var e = GEvent.GameEvent("beachcomb"))
{
e.AddContent("grid_type", type) //格子类型 空格子=0普通格子=1特殊事件=2资源道具=3
.AddContent("stage_lv", level) //关卡等级
.AddContent("click_times", clickCount) //点击次数
.AddContent("stage_clear", ClampIsPass ? 1 : 0); //关卡完成情况 未完成=0完成=1
if (itemDatas != null && itemDatas.Count > 0 && ClampIsPass == true)
{
for (int i = 0; i < itemDatas.Count; i++)
{
if (itemDatas[i].id == 1001)
{
e.AddContent("reward_hook", itemDatas[i].count);
}
else if (itemDatas[i].id == 1002)
{
e.AddContent("reward_cash", itemDatas[i].count);
}
}
}
}
#endif
}
public static void LogWarning(string value)
{
if (!LogOpen) return;
Debug.Log("<color=#ffff00>沙滩寻宝: " + value + "</color>");
}
public static void LogError(string value)
{
if (!LogOpen) return;
Debug.Log("<color=#00ff00>沙滩寻宝: " + value + "</color>");
}
public bool NewInfo()
{
int id = _dataModel.CurActivityId;
int oldId = PlayerPrefs.GetInt("DigGridData", -1);
if (id == oldId)
{
return false;
}
PlayerPrefs.SetInt("DigGridData", id);
//PlayerPrefs.Save();
return true;
}
}
/// <summary>
/// 资源路径类型
/// </summary>
public enum UrlType
{
Broad,
Grid,
GridProp,
Prop,
SpecialEvent
}
/// <summary>
/// grid 动画类型
/// </summary>
public enum GridEffectType
{
ClickDig, //普通挖掘
ClickBigDig, //挖出道具
DoubleClick, //需要点击两次
PassiveBomb, //特殊事件触发 爆炸
PassiveClear, //特殊事件触发 消除
PassClamp, //通关
}
public enum SandDigGameState
{
Normal,
Begin,
Going,
LoadJson,
LoadJsonOver,
WaveEffect,
PropEffect,
PropEffectEnd,
Pass, //通关
WaitPassLoading, //准备转场
Loading, //转场中
LoadingOver,
}
public enum GridMeshType
{
None,
Mesh1,
Mesh2,
}
public enum ClickDigType
{
Smail,
Big,
}
public enum ClientDataHandleEnum
{
Init,
PassClamp,
EnterGame
}
public enum GridType
{
Normal,
Resource,
Special,
None
}
}