备份CatanBuilding瘦身独立工程

This commit is contained in:
JSD\13999
2026-05-26 16:15:54 +08:00
commit 2d0e6a61b7
12001 changed files with 2431925 additions and 0 deletions

View File

@@ -0,0 +1,449 @@
using asap.core;
using cfg;
using Cinemachine;
using GameCore;
using System;
using System.Collections;
using System.Collections.Generic;
using UniRx;
using UnityEngine;
namespace game
{
public class WashingGameBase : MonoBehaviour
{
[Tooltip("游戏ID")]
public int m_GameID = 0;
[Tooltip("摄像机跟随路径")]
public CinemachinePath m_CameraPath;
[Tooltip("路径停歇点索引,循环执行。eg:5个点执行到最后一个位置会从移动到初始位置开始。")]
public List<int> m_RestIndexList = new List<int>();
[Tooltip("摄像机移动速度")]
public float m_CameraSpeed = 4f;
[Tooltip("磁性距离,距离目标点一定距离,即认为到达目标点。")]
public float m_MagneticDistance = 0.01f;
[Tooltip("摄像机聚焦的位置(Transform)。")]
[SerializeField] protected Transform m_CameraFocusedTransform;
#region
protected CameraFollowPathMoveController m_CameraMoveController;
/// <summary>
/// 停靠点数量
/// </summary>
/// <returns></returns>
protected int GetCameraPathRestCount()
{
if (m_CameraMoveController == null) return 0;
return m_CameraMoveController.RestCount;
}
/// <summary>
/// 摄像机跳转停靠点索引
/// </summary>
/// <param name="index"></param>
protected void JumpCameraToRestIndex(int index)
{
if (m_CameraMoveController == null) return;
m_CameraMoveController.JumpToRestIndex(index);
}
/// <summary>
/// 摄像机向前移动到下一个停靠点
/// </summary>
protected void ForwardCameraToNextRest()
{
if (m_CameraMoveController is null) return;
m_CameraMoveController.ForwardToNextRest();
}
/// <summary>
/// 摄像机向后移动到下一个停靠点
/// </summary>
protected void BackwardCameraToNextRest()
{
if (m_CameraMoveController is null) return;
m_CameraMoveController.BackwardToNextRest();
}
/// <summary>
/// 当前停靠点索引
/// </summary>
/// <returns></returns>
public int GetCameraCurrentMoveIndex()
{
if (m_CameraMoveController is null) return 0;
return m_CameraMoveController.MoveIndex;
}
/// <summary>
/// 向前跳到下一个停靠点
/// </summary>
protected void JumpCameraToNextRestForward()
{
if (m_CameraMoveController is null) return;
m_CameraMoveController.JumpToNextRestForward();
}
/// <summary>
/// 向后跳到下一个停靠点
/// </summary>
protected void JumpCameraToNextRestBackward()
{
if (m_CameraMoveController is null) return;
int index = m_CameraMoveController.JumpToNextRestBackward();
}
#endregion
#region &
// 游戏类型
protected EventWashingOperation m_GameType = EventWashingOperation.None;
public EventWashingOperation GameType { get => m_GameType; }
protected string m_GameName;
//private bool m_IsGamePausing = false;
protected CinemachineVirtualCamera m_VirtualCamera;
public int GameID { get => m_GameID; }
protected EventWashingDataManager m_DataManager;
/// <summary>
/// 设置数据
/// </summary>
/// <param name="virtualCamera"></param>
/// <param name="cameraFollowPathMoveController"></param>
/// <param name="tool"></param>
public virtual void ResetAndInitData(CinemachineVirtualCamera virtualCamera, CameraFollowPathMoveController cameraFollowPathMoveController, OperatingToolsBase tool)
{
if (virtualCamera != null)
{
m_VirtualCamera = virtualCamera;
if (m_CameraFocusedTransform != null)
{
m_VirtualCamera.LookAt = m_CameraFocusedTransform;
}
}
else
{
Debug.LogError("--- WashingGameBase ResetAndInitData 找不到虚拟相机virtualCamera");
}
if (cameraFollowPathMoveController != null && m_CameraPath != null && m_RestIndexList != null)
{
m_CameraMoveController = cameraFollowPathMoveController;
m_CameraMoveController.ResetAndInit(m_CameraPath, m_RestIndexList, m_MagneticDistance);
m_CameraMoveController.JumpToRestIndex(0);
m_CameraMoveController.enabled = true;
m_CameraMoveController.Speed = m_CameraSpeed;
}
else
{
Debug.LogError("--- WashingGameBase ResetAndInitData 找不到正确的路径配置PathMoveControlle、CameraPath 或者 RestIndexList");
}
if (tool != null)
{
m_Tool = tool;
m_Tool.gameObject.SetActive(true);
m_Tool.JumpToExhibition();
m_Tool.StopExecuting();
}
else
{
Debug.LogError("--- WashingGameBase ResetAndInitData 找不到工具包");
}
}
protected EventWashingActionStatus m_Status = EventWashingActionStatus.Invalid;
/// <summary>
/// 切换状态
/// </summary>
/// <param name="status"></param>
protected void ChangeStatus(EventWashingActionStatus status)
{
m_Status = status;
}
#endregion
#region
protected List<UpdateOperationSet> m_UpdateOperationSets = new List<UpdateOperationSet>();
private bool m_IsShowingTokenNotEnough = false;
private float m_ShowingTokenNotEnoughCD = 0.0f;
/// <summary>
/// 代币是否足够消费
/// </summary>
/// <param name="spend"></param>
/// <returns></returns>
protected bool IsTokenEnough(int spend)
{
if (m_DataManager == null) return false;
bool isEnough = m_DataManager.IsEnough(spend);
if (isEnough == false && m_IsShowingTokenNotEnough == false)
{
ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_89"));
m_IsShowingTokenNotEnough = true;
}
m_ShowingTokenNotEnoughCD = 0.3f;
return isEnough;
}
protected bool ConsumeTokens(int count)
{
if (m_DataManager == null) return false;
bool isEnough = m_DataManager.ConsumeTokens(count);
if (isEnough == false)
{
if (m_IsShowingTokenNotEnough == false)
{
ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_89"));
m_IsShowingTokenNotEnough = true;
}
m_ShowingTokenNotEnoughCD = 0.3f;
m_DataManager.SetEnergy(0f, 0f);
SetEnergyShortage();
PauseGame();
}
else
{
ResumeGame();
SetEnergyEnough();
float step = 1f / m_DataManager.WashingData.StepEnergyConsume;
m_DataManager.SetEnergy(1f, step);
UpdateOperationSet updateOperationSet = GetUpdateOperationSet();
if (updateOperationSet != null) m_UpdateOperationSets.Add(updateOperationSet);
}
return isEnough;
}
protected virtual void UpdateTokenConsume()
{
if (m_DataManager == null || m_DataManager.WashingData == null) return;
if (m_DataManager.WashingData.Energy <= 0f || m_DataManager.WashingData.EnergyConsumptionSpeed <= 0f) return;
ResumeGame();
SetEnergyEnough();
UpdateOperationSet updateOperationSet = GetUpdateOperationSet();
if (updateOperationSet != null) m_UpdateOperationSets.Add(updateOperationSet);
}
protected virtual UpdateOperationSet GetUpdateOperationSet()
{
if (m_DataManager == null) return null;
UpdateOperationSet updateOperationSet = new UpdateOperationSet();
updateOperationSet.Update = m_DataManager.UpdateToken;
updateOperationSet.IsUpdateOver = m_DataManager.IsUpdateTokenOver;
updateOperationSet.Callback = ConsumeTokens;
return updateOperationSet;
}
protected virtual void SetEnergyShortage()
{
}
protected virtual void SetEnergyEnough()
{
}
protected bool HaveEnergy()
{
if (m_DataManager != null && m_DataManager.WashingData != null) return m_DataManager.WashingData.Energy > 0f;
return false;
}
#endregion
#region
// 操作工具
protected OperatingToolsBase m_Tool;
public OperatingToolsBase ToolsBase { get => m_Tool; }
/// <summary>
/// 工具跳转到展示区
/// </summary>
public void JumpToolToExhibition()
{
if (m_Tool == null) return;
m_Tool.JumpToExhibition();
}
/// <summary>
/// 工具移动到操作区 Transform
/// </summary>
/// <param name="transform"></param>
public void MoveToolToTransform(Transform transform)
{
if (m_Tool is null) return;
m_Tool.MoveToTransform(transform);
}
/// <summary>
/// 工具移动到展示区
/// </summary>
public void MoveToolToExhibition()
{
if (m_Tool is null) return;
m_Tool.MoveToExhibition();
}
#endregion
#region
protected bool m_IsGuiding = false;
#endregion
#region
protected virtual void OnEnable()
{
}
protected virtual void OnDisable()
{
disposables.Dispose();
}
protected virtual void OnDestroy()
{
disposables.Dispose();
disposables = null;
}
protected virtual void Update()
{
if (m_ShowingTokenNotEnoughCD > 0f)
{
m_ShowingTokenNotEnoughCD -= Time.deltaTime;
if (m_ShowingTokenNotEnoughCD <= 0f)
{
m_ShowingTokenNotEnoughCD = 0f;
m_IsShowingTokenNotEnough = false;
}
}
}
protected virtual void LateUpdate()
{
int count = m_UpdateOperationSets.Count;
for (int i = count - 1; i >= 0; i--)
{
var updateOperationSet = m_UpdateOperationSets[i];
if (updateOperationSet != null)
{
updateOperationSet.Update(Time.deltaTime);
if (updateOperationSet.IsUpdateOver())
{
if (!IsGameOver())
updateOperationSet.Callback(1);
m_UpdateOperationSets.Remove(updateOperationSet);
}
}
}
}
public virtual void InitGame(string name)
{
this.m_GameName = name;
this.m_GameType = EventWashingOperation.None;
this.m_Status = EventWashingActionStatus.Invalid;
}
public virtual void EnterGame()
{
}
protected virtual void AfterEnterGame()
{
if (m_DataManager != null)
{
if (m_DataManager.IsEnough(1)) SetEnergyEnough();
else SetEnergyShortage();
}
}
public virtual void SaveContext()
{
}
public virtual void LoadContext()
{
}
public virtual void SyncData()
{
if (m_DataManager != null)
{
m_DataManager.SyncData();
}
}
protected virtual void PauseGame()
{
//m_IsGamePausing = true;
}
protected virtual void ResumeGame()
{
//m_IsGamePausing = false;
}
public virtual void Fresh(EventWashingDataManager dataManager)
{
m_DataManager = dataManager;
SyncData();
UpdateTokenConsume();
if (m_DataManager != null && dataManager.WashingData != null) dataManager.WashingData.ClearLocalDataExceptGroup(m_GameName);
}
public virtual void GameOver()
{
SyncData();
if (m_CameraMoveController != null)
{
m_CameraMoveController.enabled = false;
}
if (m_Tool != null)
{
m_Tool.MoveToExhibition();
m_Tool.StopExecuting();
}
m_UpdateOperationSets.Clear();
}
public bool IsGameOver()
{
if (m_DataManager == null || m_DataManager.WashingData == null) return true;
bool isOver = m_DataManager.IsGameOver();
if (isOver) GameOver();
return isOver;
}
#endregion
#region
protected CompositeDisposable disposables = new CompositeDisposable();
public void Subscribe<T>(Action<T> eventAction, string eventId = null)
{
IObservable<T> observable = FishingYachtAct.GetEvent<T>(eventId);
if (observable != null)
{
observable.Subscribe<T>(eventAction).AddTo(disposables);
}
}
#endregion
}
}