LevelManager.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using System;
  2. using System.Collections;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5. public class LevelManager
  6. {
  7. public static string SceneName
  8. {
  9. get
  10. {
  11. return SceneManager.GetActiveScene().name;
  12. }
  13. }
  14. private static int DeathCount
  15. {
  16. get
  17. {
  18. return RoundStorage.Get("DeathCount", 0);
  19. }
  20. set
  21. {
  22. RoundStorage.Set("DeathCount", value);
  23. }
  24. }
  25. public static AsyncOperation LoadScene(string levelName)
  26. {
  27. if (LevelManager._asyncOperation != null && !LevelManager._asyncOperation.isDone)
  28. {
  29. return LevelManager._asyncOperation;
  30. }
  31. LevelManager._asyncOperation = SceneManager.LoadSceneAsync(levelName);
  32. if (LevelManager._asyncOperation == null)
  33. {
  34. Log.Alert(levelName + "场景不存在,是不是没放在build里?还是名字写错了?");
  35. }
  36. return LevelManager._asyncOperation;
  37. }
  38. public static Coroutine LoadLevelByGateId(string levelName, SceneGate.OpenType openType = SceneGate.OpenType.None)
  39. {
  40. return LevelManager.LoadLevelByGateId(levelName, 1, openType);
  41. }
  42. public static Coroutine LoadLevelByGateId(string levelName, int gateId, SceneGate.OpenType openType = SceneGate.OpenType.None)
  43. {
  44. return R.SceneGate.Enter(new SwitchLevelGateData
  45. {
  46. ToLevelId = levelName,
  47. ToId = gateId,
  48. OpenType = openType
  49. }, false);
  50. }
  51. public static Coroutine LoadLevelByPosition(string levelName, Vector3 position, bool needProgressBar = false)
  52. {
  53. return R.SceneGate.Enter(new SwitchLevelGateData
  54. {
  55. ToLevelId = levelName,
  56. ToId = -1,
  57. TargetPosition = position
  58. }, needProgressBar);
  59. }
  60. public static Coroutine OnRoundOver()
  61. {
  62. return R.Coroutine.Start(LevelManager.RoundOverCoroutine());
  63. }
  64. public static Coroutine OnPlayerDie(bool recordDeath = true)
  65. {
  66. return R.Coroutine.Start(LevelManager.LoadGame(recordDeath));
  67. }
  68. private static IEnumerator RoundOverCoroutine()
  69. {
  70. yield return R.Ui.LevelSelect.OpenWithAnim(true, true);
  71. yield break;
  72. }
  73. private static IEnumerator LoadGame(bool recordDeath)
  74. {
  75. R.DeadReset();
  76. yield return R.GameData.Load();
  77. yield return LevelManager.LoadLevelByPosition(R.GameData.SceneName, R.GameData.PlayerPosition, false);
  78. if (recordDeath)
  79. {
  80. LevelManager.DeathCount++;
  81. R.GameData.Save(true);
  82. }
  83. R.Player.Transform.position = R.GameData.PlayerPosition;
  84. R.Player.Action.TurnRound(R.GameData.PlayerAttributeGameData.faceDir);
  85. R.Camera.Controller.CameraResetPostionAfterSwitchScene();
  86. PlayerAction.Reborn();
  87. yield break;
  88. }
  89. private static AsyncOperation _asyncOperation;
  90. public struct LevelName
  91. {
  92. public const string Start = "ui_start";
  93. }
  94. }