| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474 |
- using ProjectBase.Event;
- using ShotSimulator.Event;
- using ShotSimulator.Target;
- using ShotSimulator.Train.Info;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- namespace ShotSimulator.Train
- {
- public abstract class BaseTrainHandle
- {
- private BaseTrainCallBack m_TrainCallBack;
- private BaseTrainInfo m_TrainInfo;
- private BaseFirearmData m_FirearmData;
- public TrainTaskFinishType m_TrainTaskFinishType;
- public TimeTask m_TaskTimer;
- private int currentNumber;
- public int CurrentNumber
- {
- get { return currentNumber; }
- protected set
- {
- currentNumber = value;
- if(TrainInfo != null&& TrainInfo.finishType == TrainTaskFinishType.Number)
- {
- ExecutingTrainEventData data = new ExecutingTrainEventData()
- {
- maxNumber = TrainInfo.maxNumber,
- currentNumber = CurrentNumber
- };
- EventCenter.GetInstance().RunEvent(EventKey.OnExecutingTrainDataUpdated, data);
- if (CurrentNumber <= 0)
- {
- CompleteTrain();
- }
- }
- }
- }
- private TrainResultData m_TrainResult;
- public DifficultyType m_DifficultyType;
- private int Score;
- private TimeTask m_BestHitTimer;
- protected bool m_IsBestHit;
- protected int comboNums;
- public BaseTrainInfo TrainInfo { private set { m_TrainInfo = value; } get { return m_TrainInfo; } }
- public bool IsRunning { protected set; get; }
- public bool IsComplete { protected set; get; }
- public bool IsPause { protected set; get; }
- private bool m_IsChambered;
- protected float separationMagazineTime;
- public int m_MagazineBulletNums;
- public int MagazineBulletNums
- {
- protected set
- {
- m_MagazineBulletNums = value;
- OnBulletNumsChanged();
- }
- get { return m_MagazineBulletNums; }
- }
- public bool IsChambered
- {
- set
- {
- m_IsChambered = value;
- OnChamberStateUpdated();
- }
- get { return m_IsChambered; }
- }
- public BaseFirearmData FirearmData
- {
- protected set { m_FirearmData = value; }
- get { return m_FirearmData; }
- }
- private Dictionary<ShotTargetInteractiveType, Action<BaseShotTarget>> m_InteractiveEvents = new Dictionary<ShotTargetInteractiveType, Action<BaseShotTarget>>();
- #region Init
- public BaseTrainHandle(BaseTrainCallBack callBack, BaseTrainInfo info, DifficultyType difficultyType)
- {
- this.m_TrainCallBack = callBack;
- this.TrainInfo = info;
- m_TrainTaskFinishType = info.finishType;
- m_DifficultyType = difficultyType;
- m_TrainResult = new TrainResultData(TrainInfo.metrics);
- }
- public void InitGunData(BaseFirearmData gunData)
- {
- FirearmData = gunData;
- }
- #endregion
- #region Train
- protected abstract void ResetTrain();
- public virtual void PrepareTrain()
- {
- IsRunning = false;
- IsComplete = false;
- IsPause = false;
- CurrentNumber = TrainInfo.maxNumber;
- m_TrainResult.ResetMetricsDataValue();
- Score = 0;
- TimerSystem.GetInstance().RemoveTimeTask(m_BestHitTimer);
- m_BestHitTimer = null;
- m_IsBestHit = false;
- comboNums = 0;
- TimerSystem.GetInstance().RemoveTimeTask(m_TaskTimer);
- ResetTrain();
- TriggerTrainEvent(TrainEventType.OnPrepare);
- }
- public virtual void StartTrain()
- {
- IsRunning = true;
- TimerSystem.GetInstance().RemoveTimeTask(m_TaskTimer);
- switch (m_TrainTaskFinishType)
- {
- case TrainTaskFinishType.Time:
- m_TaskTimer = TimerSystem.GetInstance().AddTimeTask(CompleteTrain, TrainInfo.duration);
- break;
- default:
- m_TaskTimer = TimerSystem.GetInstance().AddTimeTask(null, 60 * 60 * 5);
- break;
- }
- if (TrainInfo.m_TrainFirearmConfig.isNeedConsumeBullet)
- {
- if (TrainInfo.m_TrainFirearmConfig.DontApplyFirearmConfig)
- {
- MagazineBulletNums = TrainInfo.m_TrainFirearmConfig.magazineCapacity;
- }
- else
- {
- MagazineBulletNums = FirearmData.magazineCapacity;
- }
- }
- if (FirearmData.needChambered)
- {
- IsChambered = true;
- }
- TriggerTrainEvent(TrainEventType.OnStartTrain);
- if (TrainInfo.bgm)
- {
- SoundManager.GetInstance().PlayBGM("Audio/音效/背景音效/bgm1");
- }
- else
- {
- SoundManager.GetInstance().StopBGM();
- }
- }
- public virtual void PauseTrain()
- {
- IsPause = true;
- if (m_TaskTimer != null)
- {
- m_TaskTimer.pause = true;
- }
- if (m_BestHitTimer != null)
- {
- m_BestHitTimer.pause = true;
- }
- TriggerTrainEvent(TrainEventType.OnPauseTrain);
- }
- public virtual void ContinueTrain()
- {
- IsPause = false;
- if (m_TaskTimer != null)
- {
- m_TaskTimer.pause = false;
- }
- if (m_BestHitTimer != null)
- {
- m_BestHitTimer.pause = false;
- }
- TriggerTrainEvent(TrainEventType.OnContinueTrain);
- }
- public virtual void CompleteTrain()
- {
- CalculateTrainResult();
- IsRunning = false;
- IsComplete = true;
- m_TaskTimer = null;
- ResetTrain();
- TriggerTrainEvent(TrainEventType.OnCompleteTrain);
- SoundManager.GetInstance().StopBGM();
- }
- public virtual void ExitTrain()
- {
- IsRunning = false;
- IsComplete = false;
- TimerSystem.GetInstance().RemoveTimeTask(m_TaskTimer);
- m_TaskTimer = null;
- ResetTrain();
- m_TrainResult.ResetMetricsDataValue();
- TriggerTrainEvent(TrainEventType.OnExitTrain);
- SoundManager.GetInstance().StopBGM();
- }
- #endregion
- #region ShotTarget
- protected void SetShotTargetInteractiveEvent(ShotTargetInteractiveType type, Action<BaseShotTarget> action)
- {
- if(m_InteractiveEvents.TryGetValue(type, out var value))
- {
- value = action;
- }
- else
- {
- m_InteractiveEvents.Add(type, action);
- }
- }
- protected void TriggerShotTargetInteractiveEvent(ShotTargetInteractiveType type, BaseShotTarget target)
- {
- if (m_InteractiveEvents.TryGetValue(type, out var action))
- {
- if (action != null)
- {
- action(target);
- }
- }
- }
- public void OnEnteredTarget(BaseShotTarget target)
- {
- if (!IsRunning) return;
- if (target != null)
- {
- target.OnEnter();
- }
- TriggerShotTargetInteractiveEvent(ShotTargetInteractiveType.OnEnter, target);
- }
- public void OnHoveringTarget(BaseShotTarget target)
- {
- if (!IsRunning || IsPause) return;
- if (target != null)
- {
- target.OnHovering();
- }
- TriggerShotTargetInteractiveEvent(ShotTargetInteractiveType.OnHovering, target);
- }
- public void OnShottedTarget(BaseShotTarget target, Vector2 ShotScreenPos)
- {
- if (!IsRunning || IsPause) return;
- if (TrainInfo.m_TrainFirearmConfig.isNeedConsumeBullet && MagazineBulletNums <= 0)
- {
- SoundManager.GetInstance().PlaySoundEffect("Audio/音效/手枪格洛克没子弹", false);
- EventCenter.GetInstance().RunEvent(EventKey.OnShootWitchEmptyBullets, null);
- return;
- }
- if (FirearmData.needChambered)
- {
- if (!IsChambered)
- {
- EventCenter.GetInstance().RunEvent(EventKey.OnShootWitchChamberEmpty, null);
- return;
- }
- }
- if (TrainInfo.m_TrainFirearmConfig.isNeedConsumeBullet)
- {
- MagazineBulletNums--;
- }
- SoundManager.GetInstance().PlaySoundEffect("Audio/音效/手枪格洛克射击1", false);
- if (target != null)
- {
- target.OnClick();
- }
- else
- {
- GameObject emptyEffect = GameObject.Instantiate(Resources.Load<GameObject>("UnityTechnologies/EffectExamples/WeaponEffects/Prefabs/BulletImpactStoneEffect"));
- emptyEffect.transform.position = Camera.main.ScreenToWorldPoint(new Vector3(ShotScreenPos.x, ShotScreenPos.y, 5f));
- }
- TriggerShotTargetInteractiveEvent(ShotTargetInteractiveType.OnClick, target);
- //if (m_TrainTaskFinishType == TrainTaskFinishType.BulletNums)
- //{
- // if (MagazineBulletNums <= 0)
- // {
- // CompleteTrain();
- // }
- //}
- }
- public void OnExitedTarget(BaseShotTarget target)
- {
- if (!IsRunning || IsPause) return;
- if (target != null)
- {
- target.OnExit();
- }
- TriggerShotTargetInteractiveEvent(ShotTargetInteractiveType.OnExit, target);
- }
- public void OnNotEnteringTarget(BaseShotTarget target)
- {
- if (!IsRunning || IsPause) return;
- TriggerShotTargetInteractiveEvent(ShotTargetInteractiveType.OnNotEntering, null);
- }
- private void TriggerTrainEvent(TrainEventType type)
- {
- if (m_TrainCallBack != null)
- {
- m_TrainCallBack.TriggerTrainEvent(type, this);
- }
- }
- #endregion
- #region Magazine
- public virtual void SeparationMagazine()
- {
- separationMagazineTime = m_TaskTimer.remainingTime;
- MagazineStateEventData data = new MagazineStateEventData()
- {
- state = MagazineState.Separation,
- };
- EventCenter.GetInstance().RunEvent(EventKey.OnMagazineStateChanged, data);
- }
- public virtual void ReloadMagazine()
- {
- if (TrainInfo.m_TrainFirearmConfig.isNeedConsumeBullet)
- {
- if (MagazineBulletNums < FirearmData.magazineCapacity)
- {
- if (TrainInfo.m_TrainFirearmConfig.unlimitedMagazine)
- {
- if (TrainInfo.m_TrainFirearmConfig.DontApplyFirearmConfig)
- {
- MagazineBulletNums = TrainInfo.m_TrainFirearmConfig.magazineCapacity;
- }
- else
- {
- MagazineBulletNums = FirearmData.magazineCapacity;
- }
- }
- }
- SoundManager.GetInstance().PlaySoundEffect("Audio/音效/装卸弹匣", false);
- }
- MagazineStateEventData data = new MagazineStateEventData()
- {
- state = MagazineState.ReLoad,
- reloadedTime = separationMagazineTime - m_TaskTimer.remainingTime
- };
- EventCenter.GetInstance().RunEvent(EventKey.OnMagazineStateChanged, data);
- }
- private void OnBulletNumsChanged()
- {
- if (MagazineBulletNums == 0)
- {
- IsChambered = false;
- }
- BulletNumsEventData data = new BulletNumsEventData()
- {
- magazineBulletNums = MagazineBulletNums,
- magazineCapacity = TrainInfo.m_TrainFirearmConfig.DontApplyFirearmConfig ?
- TrainInfo.m_TrainFirearmConfig.magazineCapacity : FirearmData.magazineCapacity
- };
- EventCenter.GetInstance().RunEvent(EventKey.OnBulletNumsChanged, data);
- }
- #endregion
- #region Chamber
- private void OnChamberStateUpdated()
- {
- ChamberStateEventData data = new ChamberStateEventData()
- {
- IsChambered = this.IsChambered
- };
- EventCenter.GetInstance().RunEvent(EventKey.OnChamberStateUpdated, data);
- if (IsChambered)
- {
- SoundManager.GetInstance().PlaySoundEffect("Audio/音效/上膛", false);
- }
- }
- #endregion
- #region TrainResult
- public TrainResultData GetTrainResultData()
- {
- return m_TrainResult;
- }
- public abstract void CalculateTrainResult();
- protected void IncreaseScore(int value)
- {
- Score += value;
- if (Score < 0)
- {
- Score = 0;
- }
- SetResultMetricsDataValue(MetricsType.Score, Score);
- }
- public void SetResultMetricsDataValue(MetricsType type, double value)
- {
- if(m_TrainResult.SetMetricsDataValue(type, value))
- {
- TrainResultEventData data = new TrainResultEventData()
- {
- type = type,
- value = value
- };
- try
- {
- EventCenter.GetInstance().RunEvent(EventKey.OnTrainResultMetricsDataUpdated, data);
- }
- catch(Exception e)
- {
- Debug.LogException(e);
- }
- }
- }
- protected void StartBestHitTimer()
- {
- TimerSystem.GetInstance().RemoveTimeTask(m_BestHitTimer);
- m_IsBestHit = true;
- m_BestHitTimer = TimerSystem.GetInstance().AddTimeTask(() =>
- {
- m_IsBestHit = false;
- }, 0.8f);
- }
- #endregion
- }
- }
|