CustomizeTrainHandle.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. using LitJson;
  2. using ShotSimulator.Target;
  3. using ShotSimulator.Tool;
  4. using ShotSimulator.Train.Info;
  5. using System;
  6. using System.Collections;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using UnityEngine;
  10. using Random = UnityEngine.Random;
  11. namespace ShotSimulator.Train
  12. {
  13. public class CustomizeTrainHandle : BaseTrainHandle
  14. {
  15. private int maxTargetNum = 3;
  16. private List<TimeTask> generateTargetTimeTasks = new List<TimeTask>();
  17. private double score;
  18. private double totalHitNum;
  19. private double totalTargetNum;
  20. private double missHitNum;
  21. private List<SphereShotTarget> curTargets = new List<SphereShotTarget>();
  22. private List<Vector3> configPositions = new List<Vector3>();
  23. #if UNITY_EDITOR || UNITY_STANDALONE
  24. private readonly string configJsonPath = @"D:\ShotSimulatorCustomizeTrainConfig.json";
  25. #elif UNITY_ANDROID
  26. private readonly string configJsonPath = @"/storage/emulated/0/ShotSimulatorCustomizeTrainConfig.json";
  27. #else
  28. private readonly string configJsonPath = "";
  29. #endif
  30. public CustomizeTrainHandle(BaseTrainCallBack callBack, BaseTrainInfo info, DifficultyType difficultyType) : base(callBack, info, difficultyType)
  31. {
  32. SetShotTargetInteractiveEvent(ShotTargetInteractiveType.OnClick, OnShottedTargetEvent);
  33. }
  34. #region Train
  35. private void InitConfig()
  36. {
  37. JsonData data = FileTool.ReadJson(configJsonPath);
  38. for (int i = 0; i < data.Count; i++)
  39. {
  40. JsonData value = data[i];
  41. float x = Convert.ToSingle(value["x"].ToString());
  42. float y = Convert.ToSingle(value["y"].ToString());
  43. float z = Convert.ToSingle(value["z"].ToString());
  44. configPositions.Add(new Vector3(x, y, z));
  45. }
  46. }
  47. protected override void ResetTrain()
  48. {
  49. ResetTarget();
  50. for (int i = 0; i < generateTargetTimeTasks.Count; i++)
  51. {
  52. TimerSystem.GetInstance().RemoveTimeTask(generateTargetTimeTasks[i]);
  53. }
  54. generateTargetTimeTasks.Clear();
  55. configPositions.Clear();
  56. score = 0;
  57. totalHitNum = 0;
  58. totalTargetNum = 0;
  59. missHitNum = 0;
  60. }
  61. public override void StartTrain()
  62. {
  63. base.StartTrain();
  64. ResetTrain();
  65. InitConfig();
  66. InitShotTargets();
  67. }
  68. public override void PauseTrain()
  69. {
  70. base.PauseTrain();
  71. foreach (var timer in generateTargetTimeTasks)
  72. {
  73. timer.pause = true;
  74. }
  75. }
  76. public override void ContinueTrain()
  77. {
  78. base.ContinueTrain();
  79. foreach (var timer in generateTargetTimeTasks)
  80. {
  81. timer.pause = false;
  82. }
  83. }
  84. public override void CalculateTrainResult()
  85. {
  86. score = totalHitNum * 2;
  87. SetResultMetricsDataValue(MetricsType.Score, score);
  88. SetResultMetricsDataValue(MetricsType.Precision, Math.Round(totalHitNum / (totalHitNum + missHitNum), 2));
  89. SetResultMetricsDataValue(MetricsType.TimeToKill, Math.Round(TrainInfo.duration / totalHitNum, 2));
  90. SetResultMetricsDataValue(MetricsType.Kill_Sec, Math.Round(totalHitNum / TrainInfo.duration, 2));
  91. SetResultMetricsDataValue(MetricsType.Target, totalTargetNum);
  92. SetResultMetricsDataValue(MetricsType.KillTotal, totalHitNum);
  93. }
  94. #endregion
  95. #region ShootTarget
  96. private void OnShottedTargetEvent(BaseShotTarget target)
  97. {
  98. if (target != null)
  99. {
  100. totalHitNum++;
  101. DestroyShootTarget(target as SphereShotTarget);
  102. generateTargetTimeTasks.Add(TimerSystem.GetInstance().AddTimeTask(GenerateShotTarget, 0.5f));
  103. }
  104. else
  105. {
  106. missHitNum++;
  107. }
  108. }
  109. #endregion
  110. private void InitShotTargets()
  111. {
  112. int num = configPositions.Count - curTargets.Count;
  113. for (int i = 0; i < num; i++)
  114. {
  115. GenerateShotTarget();
  116. }
  117. }
  118. private void GenerateShotTarget()
  119. {
  120. GameObject obj = GameObject.Instantiate<GameObject>(Resources.Load<GameObject>("Prefabs/SphereTarget"));
  121. SphereShotTarget target = obj.GetComponent<SphereShotTarget>();
  122. target.IsRunning = true;
  123. target.onClickCanChangeColor = false;
  124. target.onHoveringCanChangeColor = false;
  125. target.defaultColor = Color.green;
  126. target.Init(1, ReduceHealthTriggerType.OnClick, false, ReduceHealthType.Per, MotionType.None, GetPosition());
  127. curTargets.Add(target);
  128. totalTargetNum++;
  129. }
  130. private Vector3 GetPosition()
  131. {
  132. for (int i = 0; i < configPositions.Count; i++)
  133. {
  134. if (!CurrentTargetsIsPos(configPositions[i]))
  135. {
  136. return configPositions[i];
  137. }
  138. }
  139. return Vector3.zero;
  140. }
  141. private bool CurrentTargetsIsPos(Vector3 pos)
  142. {
  143. for (int i = 0; i < curTargets.Count; i++)
  144. {
  145. if (curTargets[i].transform.position == pos)
  146. {
  147. return true;
  148. }
  149. }
  150. return false;
  151. }
  152. private void DestroyShootTarget(SphereShotTarget target)
  153. {
  154. if (target != null)
  155. {
  156. curTargets.Remove(target);
  157. target.IsRunning = false;
  158. GameObject.Destroy(target.gameObject);
  159. }
  160. }
  161. private void ResetTarget()
  162. {
  163. for (int i = 0; i < curTargets.Count; i++)
  164. {
  165. curTargets[i].IsRunning = false;
  166. GameObject.Destroy(curTargets[i].gameObject);
  167. }
  168. curTargets.Clear();
  169. }
  170. }
  171. }