OvertakingLegend/Assets/Script/GuidanceManger.cs

457 lines
17 KiB
C#

using BX;
using Config.config;
using DG.Tweening;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
/// <summary>
/// 引导管理器
/// </summary>
public class GuidanceManger : MBSingletonManager<GuidanceManger>
{
/// <summary>
/// 固定车数
/// </summary>
private int fixedCarNumber;
/// <summary>
/// 变道车数
/// </summary>
private int changeLanesCarNumber;
/// <summary>
/// 是否变道引导完成
/// </summary>
public bool isChannelChangeguidanceOver;
/// <summary>
/// 是否使用技能引导完成
/// </summary>
private bool isUseSkillguidanceOver;
/// <summary>
/// 生成NPCcar
/// </summary>
private bool isGenerateNpcCar;
/// <summary>
/// 开启正常模式
/// </summary>
public bool isEnableNormalMode;
/// <summary>
/// 是否加速度
/// </summary>
public bool isAcceleratedSpeed;
/// <summary>
/// 是否技能结束
/// </summary>
public bool isSkillOver;
/// <summary>
/// 引导UI
/// </summary>
private TeachUI teachUI;
/// <summary>
/// 车
/// </summary>
private NPCCar npcCar;
/// <summary>
/// 是否滑动
/// </summary>
public bool isSlide;
/// <summary>
/// 生成时间
/// </summary>
private float generateTime;
/// <summary>
/// NPCCar列表
/// </summary>
private List<NPCCar> nPCCars;
private void Awake()
{
if(UserDataManager.Instance.userData.guidance.isOverInitialEntry)
{
isChannelChangeguidanceOver = true;
isUseSkillguidanceOver = true;
isEnableNormalMode = true;
isAcceleratedSpeed = true;
isSkillOver = true;
isSlide = true;
}
else
{
UIManager.Instance.SetPostProcessVolume(true);
nPCCars = new List<NPCCar>();
}
}
private void FixedUpdate()
{
if (!UserDataManager.Instance.userData.guidance.isOverInitialEntry)
{
Trial();
PutCar();
}
}
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
UIManager.Instance.AsynShowUI<TeachUI>((teachUI) =>
{
this.teachUI = teachUI;
});
}
/// <summary>
/// 点击开始
/// </summary>
public void TapPlay(MainUI mainUI)
{
DelayedProcessingManager.Instance.DelayDoSecond(this, 0.1f, () =>
{
teachUI.SetFocus(E_FocusType.Square);
teachUI.SetHandState(mainUI.playBtn.transform.position, E_HandAniKindType.Tap);
teachUI.SetLookState(mainUI.playBtn.transform.position, true, (mainUI.playBtn.transform as RectTransform).sizeDelta+Vector2.one*20);
teachUI.SetBtnState(mainUI.playBtn.transform.position, (mainUI.playBtn.transform as RectTransform).sizeDelta + Vector2.one * 30, () =>
{
ExecuteEvents.Execute(mainUI.playBtn.gameObject, new PointerEventData(EventSystem.current), ExecuteEvents.pointerClickHandler);
UIManager.Instance.HideUI<TeachUI>();
UIManager.Instance.SetPostProcessVolume(false);
});
});
}
/// <summary>
/// 变道引导
/// </summary>
public void ChannelChangeguidance()
{
if (!UserDataManager.Instance.userData.guidance.isOverInitialEntry)
{
isSlide = true;
UIManager.Instance.SetPostProcessVolume(true);
DelayedProcessingManager.Instance.DelayDoSecond(this, 0.1f, () =>
{
UIManager.Instance.AsynShowUI<TeachUI>();
teachUI.SetMaskBGRay(false);
teachUI.SetHandState(teachUI.transform.position, E_HandAniKindType.Slide);
teachUI.SetTalkText("SLIDE TO CHANGE LANE");
});
}
}
/// <summary>
/// 变道引导完成
/// </summary>
public void ChannelChangeguidanceOver()
{
if (isChannelChangeguidanceOver) return;
BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary<string, object>()
{
{"Guide_Step","ChangeLane"}
});
isChannelChangeguidanceOver = true;
if (!UserDataManager.Instance.userData.guidance.isOverInitialEntry)
{
DelayedProcessingManager.Instance.DelayDoSecond(this, 0.5f, () =>
{
teachUI.SetGuidelinesCG(false);
teachUI.SetDialogueCGCG(false);
GenerateFixedNpcCar();
});
}
}
/// <summary>
/// 生成固定NPC车
/// </summary>
public void GenerateFixedNpcCar()
{
isSlide = false;
DelayedProcessingManager.Instance.DelayDoSecond(this, 1, () =>
{
npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 80, "Car_2");
SetTimeScale(false, () =>
{
teachUI.SetFocus(E_FocusType.Round);
teachUI.SetLookState(Camera.main.WorldToScreenPoint(npcCar.transform.position + Vector3.right * 3), false, new Vector2(400, 400));
teachUI.SetTapEvent(true);
teachUI.SetTalkText("AVOID OTHER CARS!");
});
UIManager.Instance.AddCustomEventListener(teachUI.tapEvent, EventTriggerType.PointerDown, (data) =>
{
BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary<string, object>()
{
{"Guide_Step","DodgeCar"}
});
teachUI.SetGuidelinesCG(false);
teachUI.SetDialogueCGCG(false);
teachUI.SetMaskBGCG(false);
teachUI.SetTapEvent(false);
SetTimeScale(true);
isSlide = true;
UIManager.Instance.RemoveCustomEventListener(teachUI.tapEvent, EventTriggerType.PointerDown);
DelayedProcessingManager.Instance.DelayDoSecond(this, 1, () =>
{
Destroy(npcCar.gameObject);
npcCar = null;
GenerateChangeLanesNpcCar();
});
});
});
}
/// <summary>
/// 生成变道NPC车
/// </summary>
public void GenerateChangeLanesNpcCar()
{
isSlide = false;
DelayedProcessingManager.Instance.DelayDoSecond(this, 1, () =>
{
if (Scenes.Instance.player.moveIndex < Scenes.Instance.player.sectionRoad.maxIndex)
{
npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 100 - Vector3.forward * 4.4f, "Car_6");
npcCar.SetData(Scenes.Instance.player.moveIndex+1, Scenes.Instance.player.sectionRoad);
npcCar.SetRightLeft(E_DirectionType.Left);
}
else
{
npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 100 +Vector3.forward * 4.4f, "Car_6");
npcCar.SetData(Scenes.Instance.player.moveIndex-1, Scenes.Instance.player.sectionRoad);
npcCar.SetRightLeft(E_DirectionType.Right);
}
SetTimeScale(false, () =>
{
teachUI.SetFocus(E_FocusType.Round);
teachUI.SetLookState(Camera.main.WorldToScreenPoint(npcCar.transform.position + Vector3.right * 3), false, new Vector2(400, 400));
teachUI.SetTapEvent(true);
teachUI.SetTalkText("WATCH FOR INDICATORS!");
});
UIManager.Instance.AddCustomEventListener(teachUI.tapEvent, EventTriggerType.PointerDown, (data) =>
{
BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary<string, object>()
{
{"Guide_Step","Indicator"}
});
teachUI.SetGuidelinesCG(false);
teachUI.SetDialogueCGCG(false);
teachUI.SetMaskBGCG(false);
teachUI.SetTapEvent(false);
SetTimeScale(true);
isSlide = true;
UIManager.Instance.RemoveCustomEventListener(teachUI.tapEvent, EventTriggerType.PointerDown);
UIManager.Instance.SetPostProcessVolume(false);
DelayedProcessingManager.Instance.DelayDoSecond(this, 2, () =>
{
Destroy(npcCar.gameObject);
npcCar = null;
isGenerateNpcCar = true;
Scenes.Instance.player.moveSpeed = 70;
});
});
});
}
/// <summary>
/// 试炼
/// </summary>
private void Trial()
{
if (isGenerateNpcCar)
{
generateTime += Time.deltaTime;
if (generateTime >= 1 && !Scenes.Instance.player.isChangeLanes)
{
if (fixedCarNumber != 10)
{
if (ProbabilityManager.Instance.GetPercent(50))
{
if (ProbabilityManager.Instance.GetPercent(50))
{
if (Scenes.Instance.player.moveIndex < Scenes.Instance.player.sectionRoad.maxIndex)
{
nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 - Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24)));
}
else
{
nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 + Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24)));
}
}
else
{
if (Scenes.Instance.player.moveIndex > Scenes.Instance.player.sectionRoad.minIndex)
{
nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 + Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24)));
}
else
{
nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 - Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24)));
}
}
}
nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200, "Car_" + Random.Range(1, 24)));
fixedCarNumber++;
}
else if (changeLanesCarNumber != 8)
{
if (ProbabilityManager.Instance.GetPercent(50))
{
if (Scenes.Instance.player.moveIndex < Scenes.Instance.player.sectionRoad.maxIndex)
{
npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 - Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24));
npcCar.SetRightLeft(E_DirectionType.Left);
npcCar.SetData(Scenes.Instance.player.moveIndex + 1, Scenes.Instance.player.sectionRoad);
}
else
{
npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 + Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24));
npcCar.SetRightLeft(E_DirectionType.Left);
npcCar.SetData(Scenes.Instance.player.moveIndex - 1, Scenes.Instance.player.sectionRoad);
}
}
else
{
if (Scenes.Instance.player.moveIndex > Scenes.Instance.player.sectionRoad.minIndex)
{
npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 + Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24));
npcCar.SetRightLeft(E_DirectionType.Left);
npcCar.SetData(Scenes.Instance.player.moveIndex - 1, Scenes.Instance.player.sectionRoad);
}
else
{
npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 - Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24));
npcCar.SetRightLeft(E_DirectionType.Left);
npcCar.SetData(Scenes.Instance.player.moveIndex + 1, Scenes.Instance.player.sectionRoad);
}
}
nPCCars.Add(npcCar);
changeLanesCarNumber++;
}
generateTime = 0;
}
if (fixedCarNumber >= 10 && changeLanesCarNumber >= 8)
{
isGenerateNpcCar = false;
UseSkill();
}
}
}
/// <summary>
/// 放回车
/// </summary>
private void PutCar()
{
if(nPCCars.Count>0)
{
for (int i = 0; i < nPCCars.Count; i++)
{
if(nPCCars[i].transform.position.x<Scenes.Instance.player.transform.position.x-10)
{
CachePoolManager.Instance.Put(nPCCars[i].gameObject);
nPCCars.RemoveAt(i);
}
}
}
}
/// <summary>
/// 使用技能
/// </summary>
public void UseSkill()
{
DelayedProcessingManager.Instance.DelayDoSecond(this, 4, () =>
{
UIManager.Instance.GetUI<GameUI>().OpenSkin();
Scenes.Instance.player.FullEnergy();
teachUI.SetTalkText("DOUBLE TAP TO USE");
teachUI.SetGuidelinesCG(false);
teachUI.SetHandState(teachUI.transform.position, E_HandAniKindType.DoubleClick);
});
}
/// <summary>
/// 使用技能引导完成
/// </summary>
public void UseSkillguidanceOver()
{
if (isUseSkillguidanceOver) return;
BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary<string, object>()
{
{"Guide_Step","Skill"}
});
isUseSkillguidanceOver = true;
teachUI.SetTalkText("INVINCIBLE IN THIS FROM!");
isEnableNormalMode= true;
Scenes.Instance.gameScene.mapManager.InitguidanceGenerateNPCCar();
teachUI.SetGuidelinesCG(false);
isAcceleratedSpeed = true;
}
/// <summary>
/// 技能释放结束
/// </summary>
public void SkillOver()
{
if (isSkillOver) return;
isSkillOver = true;
BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary<string, object>()
{
{"Guide_Step","StartCount"}
});
UIManager.Instance.GetUI<GameUI>().OpenOthe();
UIManager.Instance.GetUI<GameUI>().Flicker();
teachUI.SetDialogueCGCG(false);
Scenes.Instance.gameScene.GenerateEnd(1500);
}
/// <summary>
/// 设置时间缩放
/// </summary>
private void SetTimeScale(bool isTrue, UnityAction callBack = null)
{
float startValue;
float endValue;
if (isTrue)
{
teachUI.SetMaskBGRay(false);
Scenes.Instance.player.RunningSound(true);
startValue = 0;
endValue = 1;
DOTween.To(() => startValue, x => startValue = x, endValue, 1.5f).SetEase(Ease.InQuad).SetUpdate(true).OnUpdate(() =>
{
Time.timeScale = startValue;
});
}
else
{
startValue = 1;
endValue = 0;
teachUI.SetMaskBGRay(true);
DOTween.To(() => startValue, x => startValue = x, endValue, 1.5f).SetEase(Ease.InQuad).SetUpdate(true).OnUpdate(() =>
{
Time.timeScale = startValue;
}).OnComplete(() =>
{
Scenes.Instance.player.RunningSound(false);
callBack?.Invoke();
});
}
}
}