457 lines
17 KiB
C#
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();
|
|
});
|
|
}
|
|
}
|
|
}
|