436 lines
13 KiB
C#
436 lines
13 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using System.Linq;
|
|||
|
|
|
|||
|
|
namespace GuruClient
|
|||
|
|
{
|
|||
|
|
public class GameManager : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
private static GameManager _instance;
|
|||
|
|
|
|||
|
|
public static GameManager Instance
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _instance;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[HideInInspector]
|
|||
|
|
[LunaPlaygroundField("Amount of lives1", 1, "Game Settings")]
|
|||
|
|
public int maxLives1 = 3;
|
|||
|
|
|
|||
|
|
[HideInInspector]
|
|||
|
|
[LunaPlaygroundField("Amount of lives2", 1, "Game Settings")]
|
|||
|
|
public int maxLives2 = 3;
|
|||
|
|
|
|||
|
|
[HideInInspector]
|
|||
|
|
[LunaPlaygroundField("Amount of lives3", 1, "Game Settings")]
|
|||
|
|
public int maxLives3 = 3;
|
|||
|
|
|
|||
|
|
public Camera UICamera;
|
|||
|
|
|
|||
|
|
public GameObjectPool PatchPool { set; get; }
|
|||
|
|
private bool _poolInited = false;
|
|||
|
|
|
|||
|
|
private GameModel _model;
|
|||
|
|
public UIGameView uiGameView;
|
|||
|
|
public GameObject uiGameWin;
|
|||
|
|
public GameObject patchTemplate;
|
|||
|
|
|
|||
|
|
//本关需要填充的补丁
|
|||
|
|
private List<APatch> _stageAllPatch = new List<APatch>();
|
|||
|
|
private List<APatch> _stageAllLine = new List<APatch>();
|
|||
|
|
private List<APatch> _stageCompletePatch = new List<APatch>();
|
|||
|
|
private List<APatch> _needAutoPatch = new List<APatch>();
|
|||
|
|
private List<APatch> _finishAutoPatch = new List<APatch>();
|
|||
|
|
//继续游戏时,需要恢复的拼图数据
|
|||
|
|
private List<APatch> _recoverPatch = new List<APatch>();
|
|||
|
|
|
|||
|
|
[HideInInspector]
|
|||
|
|
public bool _canDragging = false;
|
|||
|
|
//是否正在跨越关卡
|
|||
|
|
private bool _isStageCross = false;
|
|||
|
|
//是否已完成
|
|||
|
|
private bool _isGameWin = false;
|
|||
|
|
|
|||
|
|
[HideInInspector]
|
|||
|
|
public StartMode curStartMode;
|
|||
|
|
//当前局的bPlay次数
|
|||
|
|
private int _curBPlay;
|
|||
|
|
|
|||
|
|
//操作人员
|
|||
|
|
public string Operator {get; set;}
|
|||
|
|
|
|||
|
|
//从LevelStart时间开始记录,截止到LevelEnd事件的关卡时长
|
|||
|
|
private int _levelDuration;
|
|||
|
|
//从LevelStart时间开始记录,截止到LevelEnd事件的拼图数量
|
|||
|
|
private int _levelDurationStep;
|
|||
|
|
|
|||
|
|
public bool isOrientationPortrait = true;
|
|||
|
|
|
|||
|
|
// Start is called before the first frame update
|
|||
|
|
void Start()
|
|||
|
|
{
|
|||
|
|
_instance = this;
|
|||
|
|
|
|||
|
|
if(Screen.width > Screen.height)
|
|||
|
|
{
|
|||
|
|
Debug.Log("这是横屏");
|
|||
|
|
isOrientationPortrait = true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Debug.Log("这是竖屏");
|
|||
|
|
isOrientationPortrait = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GameManager.Instance.InitPatchPool();
|
|||
|
|
|
|||
|
|
_model = new GameModel();
|
|||
|
|
bool isSuccess = _model.InitializeLevel("395", StartMode.Continue, LevelType.MainLine);
|
|||
|
|
if (isSuccess)
|
|||
|
|
{
|
|||
|
|
Debug.Log("关卡初始化成功");
|
|||
|
|
_model.LoadAllPatches();
|
|||
|
|
Debug.Log("关卡拼图加载成功");
|
|||
|
|
uiGameView.StartGame();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void InitPatchPool()
|
|||
|
|
{
|
|||
|
|
if (_poolInited)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
PatchPool = GameObjectPool.CreatePool(patchTemplate, 50, false);
|
|||
|
|
_poolInited = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public GameModel GetModel()
|
|||
|
|
{
|
|||
|
|
return _model;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 开始关卡的Stage
|
|||
|
|
/// </summary>
|
|||
|
|
public void StartStage()
|
|||
|
|
{
|
|||
|
|
//根据当前数据恢复关卡
|
|||
|
|
if (_model.GetCurrentStage() > 1 || _model.GetCurrentStep() > 0 || _stageCompletePatch.Count > 0)
|
|||
|
|
{
|
|||
|
|
ToNextLevel(true);
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
ToNextLevel(false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 前往下一关
|
|||
|
|
/// </summary>
|
|||
|
|
private void ToNextLevel()
|
|||
|
|
{
|
|||
|
|
ToNextLevel(false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 前往下一关
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="isRecover">是否从进度文件恢复</param>
|
|||
|
|
public void ToNextLevel(bool isRecover)
|
|||
|
|
{
|
|||
|
|
if (!isRecover)
|
|||
|
|
{
|
|||
|
|
_model.SetCurrentStage(_model.GetCurrentStage() + 1);
|
|||
|
|
_model.SetCurrentStep(0);
|
|||
|
|
_stageCompletePatch.Clear();
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
uiGameView.LoadAutoPatches(_recoverPatch, false, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
_stageAllPatch.Clear();
|
|||
|
|
_stageAllLine.Clear();
|
|||
|
|
_needAutoPatch.Clear();
|
|||
|
|
_finishAutoPatch.Clear();
|
|||
|
|
|
|||
|
|
int curStage = _model.GetCurrentStage();
|
|||
|
|
List<APatch> tmp = _model.GetStageAllPatch(curStage);
|
|||
|
|
if (tmp != null)
|
|||
|
|
{
|
|||
|
|
_stageAllPatch = tmp;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tmp = _model.GetLineAllPatch(curStage);
|
|||
|
|
if (tmp != null)
|
|||
|
|
{
|
|||
|
|
_stageAllLine = tmp;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tmp = _model.GetAutoAllPatch(curStage);
|
|||
|
|
if (tmp != null)
|
|||
|
|
{
|
|||
|
|
_needAutoPatch = tmp;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
_finishAutoPatch.Add(_model.GetFinishPatch());
|
|||
|
|
|
|||
|
|
if (_stageAllPatch.Count > 0)
|
|||
|
|
{
|
|||
|
|
//加载关卡
|
|||
|
|
LoadLevel(isRecover, null);
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
CompletePage(null);
|
|||
|
|
}
|
|||
|
|
_isStageCross = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 关卡完成
|
|||
|
|
/// </summary>
|
|||
|
|
public void CompletePage(Action callback)
|
|||
|
|
{
|
|||
|
|
//自动补图
|
|||
|
|
if (uiGameView != null)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
uiGameView.LoadRole(true, false, callback);
|
|||
|
|
|
|||
|
|
Timer.Instance.SetTimeoutAsync(2.0f, () =>
|
|||
|
|
{
|
|||
|
|
GameWin();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
catch (Exception e)
|
|||
|
|
{
|
|||
|
|
Debug.Log(e);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void GameWin()
|
|||
|
|
{
|
|||
|
|
if (!_isGameWin)
|
|||
|
|
{
|
|||
|
|
//显示GameWin
|
|||
|
|
_isGameWin = true;
|
|||
|
|
|
|||
|
|
uiGameWin.SetActive(true);
|
|||
|
|
uiGameWin.GetComponent<UIGameWin>().OnBeforStart(_model.GetCurrentLevel());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 加载关卡
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="isRecover"></param>
|
|||
|
|
public void LoadLevel(bool isRecover, Action callback)
|
|||
|
|
{
|
|||
|
|
_canDragging = false;
|
|||
|
|
if (uiGameView != null)
|
|||
|
|
{
|
|||
|
|
if (!isRecover)
|
|||
|
|
{
|
|||
|
|
Timer.Instance.SetTimeoutAsync(0.5f, callback);
|
|||
|
|
}
|
|||
|
|
if (uiGameView != null)
|
|||
|
|
{
|
|||
|
|
if (_model.GetCurrentStage() == 1 || isRecover)
|
|||
|
|
{
|
|||
|
|
uiGameView.LoadBg(callback);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
LoadLevelInner(isRecover, callback);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void LoadLevelInner(bool isRecover, Action callback)
|
|||
|
|
{
|
|||
|
|
uiGameView.LoadRole(isRecover, false, callback);
|
|||
|
|
LoadLineTemplate(isRecover,null);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 加载线稿
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="isRecover"></param>
|
|||
|
|
private void LoadLineTemplate(bool isRecover, Action callback)
|
|||
|
|
{
|
|||
|
|
if(uiGameView != null)
|
|||
|
|
{
|
|||
|
|
uiGameView.LoadLineTemplate(callback);
|
|||
|
|
InitPatches(isRecover);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 是否可拖拽(拼图)
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool CanDragging()
|
|||
|
|
{
|
|||
|
|
return _canDragging;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 初始化拼图
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="isRecover">是否为恢复关卡</param>
|
|||
|
|
private void InitPatches(bool isRecover)
|
|||
|
|
{
|
|||
|
|
bool isShowCurrentPatche = _model.IsShowCurrentPatche();
|
|||
|
|
if(_model.GetCurrentStage() == 1 || isRecover || isShowCurrentPatche)
|
|||
|
|
{
|
|||
|
|
if(uiGameView != null)
|
|||
|
|
{
|
|||
|
|
uiGameView.InitPatches(isShowCurrentPatche ? _model.GetCurrentStage() : -1, () => {
|
|||
|
|
//第一阶段和恢复的保证加载完成后,才可拼图
|
|||
|
|
_canDragging = true;
|
|||
|
|
|
|||
|
|
uiGameView.ShowTips(true);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
//第二阶段,不需要加载拼图,直接可拼图
|
|||
|
|
_canDragging = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(isRecover)
|
|||
|
|
{
|
|||
|
|
CheckNextLevel();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
EventManager.Dispatch("START_NEXT_LEVEL");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 匹配后增加score分数
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="aPatch">拼图数据</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public int AddScore(APatch aPatch)
|
|||
|
|
{
|
|||
|
|
LevelDurationStepUpdate();
|
|||
|
|
_model.SetCurrentStep(_model.GetCurrentStep() + 1);
|
|||
|
|
int step = _model.AddTotalStep();
|
|||
|
|
_model.AddCompletePatchCount(1);
|
|||
|
|
Luna.Unity.Analytics.LogEvent($"CompleteStep_{step}", 0);
|
|||
|
|
_stageCompletePatch.Add(aPatch);
|
|||
|
|
return _stageCompletePatch.Count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool IsCompleteStage()
|
|||
|
|
{
|
|||
|
|
return _stageAllPatch.Count == _stageCompletePatch.Count && _stageAllPatch.Count != 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//关卡步数+1步
|
|||
|
|
public void LevelDurationStepUpdate()
|
|||
|
|
{
|
|||
|
|
_levelDurationStep ++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//获取一个未完成拼图
|
|||
|
|
public APatch GetOneUnCompletePatch()
|
|||
|
|
{
|
|||
|
|
IEnumerable<APatch> collection = _stageAllPatch.Except(_stageCompletePatch);
|
|||
|
|
foreach (APatch item in collection)
|
|||
|
|
{
|
|||
|
|
return item;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new APatch();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 检测某个拼图数据是否已完成
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="aPatch"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool IsCompletedPatch(APatch aPatch)
|
|||
|
|
{
|
|||
|
|
return _stageCompletePatch.Contains(aPatch);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 游戏是否已结束
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool IsGameWin()
|
|||
|
|
{
|
|||
|
|
return _isGameWin;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取当前阶段需要拼接的数据
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public List<APatch> GetCurrentStageData()
|
|||
|
|
{
|
|||
|
|
return _stageAllPatch;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取当前阶段的线稿数据
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public List<APatch> GetCurrentStageLineData()
|
|||
|
|
{
|
|||
|
|
return _stageAllLine;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 检测是否应该进入下一关
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="step"></param>
|
|||
|
|
public void CheckNextLevel(int step = -1)
|
|||
|
|
{
|
|||
|
|
if (!_isStageCross && (step == -1 ? _model.GetCurrentStep() : step) >= _stageAllPatch.Count)
|
|||
|
|
{
|
|||
|
|
_isStageCross = true;
|
|||
|
|
if (uiGameView != null)
|
|||
|
|
{
|
|||
|
|
uiGameView.RemoveLineTemplate(null);
|
|||
|
|
}
|
|||
|
|
if (_needAutoPatch.Count > 0)
|
|||
|
|
{
|
|||
|
|
//自动补图
|
|||
|
|
if (uiGameView != null)
|
|||
|
|
{
|
|||
|
|
if(uiGameView != null)
|
|||
|
|
{
|
|||
|
|
int curStage = _model.GetCurrentStage();
|
|||
|
|
List<APatch> tmp = _model.GetStageAllPatch(curStage + 1);
|
|||
|
|
if(tmp == null)
|
|||
|
|
{
|
|||
|
|
uiGameView.LoadAutoPatches(_needAutoPatch, false, false, () => {
|
|||
|
|
ToNextLevel();
|
|||
|
|
});
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
uiGameView.LoadAutoPatches(_needAutoPatch);
|
|||
|
|
ToNextLevel();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
ToNextLevel();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void OnApplicationQuit()
|
|||
|
|
{
|
|||
|
|
Luna.Unity.LifeCycle.GameEnded();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|