рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдХреЛ рдПрдХрддрд╛ рдореЗрдВ рдПрдХ рдЦреЗрд▓ рдмрдирд╛рдирд╛: рджреБрд╢реНрдордиреЛрдВ рдХреА рдкрд░рд┐рджреГрд╢реНрдп рдФрд░ рд▓рд╣рд░реЗрдВ

[рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рдкрд╣рд▓рд╛ , рджреВрд╕рд░рд╛ , рддреАрд╕рд░рд╛ рдФрд░ рдЪреМрдерд╛ рднрд╛рдЧ]

  • рдЫреЛрдЯреЗ, рдордзреНрдпрдо рдФрд░ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рджреБрд╢реНрдордиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред
  • рджреБрд╢реНрдордиреЛрдВ рдХреА рдХрдИ рд▓рд╣рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдкрд░рд┐рджреГрд╢реНрдп рдмрдирд╛рдПрдБред
  • рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдЧреЗрдордкреНрд▓реЗ рд░рд╛рдЬреНрдп рдХрд╛ рдкреГрдердХреНрдХрд░рдгред
  • рдкреНрд░рд╛рд░рдВрдн, рд░реЛрдХреЗрдВ, рдЬреАрддреЗрдВ, рд╣рд╛рд░реЗрдВ рдФрд░ рдЦреЗрд▓ рдХреЛ рдЧрддрд┐ рджреЗрдВред
  • рдЕрдВрддрд╣реАрди рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рджреГрд╢реНрдп рдмрдирд╛рдПрдВред

рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдЦреЗрд▓ рдмрдирд╛рдиреЗ рдкрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрд╛рдВрдЪрд╡рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕рдореЗрдВ, рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЧреЗрдордкреНрд▓реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рджреБрд╢реНрдордиреЛрдВ рдХреА рддрд░рдВрдЧреЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдПрдХрддрд╛ 2018.4.6f1 рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдпрд╣ рдмрд╣реБрдд рдЖрд░рд╛рдорджрд╛рдпрдХ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдЕрдзрд┐рдХ рд╢рддреНрд░реБ


рд╣рд░ рдмрд╛рд░ рдПрдХ рд╣реА рдиреАрд▓рд╛ рдХреНрдпреВрдм рдмрдирд╛рдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдЧреЗрдордкреНрд▓реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдХрджрдо рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╢рддреНрд░реБ рд╡рд┐рдиреНрдпрд╛рд╕


рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдмрдирд╛рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ: рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЫреЛрдЯреЗ, рдордзреНрдпрдо рдФрд░ рдмрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЯреИрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ EnemyType рдЧрдгрди рдмрдирд╛рдПрдБред

 public enum EnemyType { Small, Medium, Large } 

EnemyFactory рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рд╕рднреА рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рддреНрд░реБрдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗред рд╕рднреА рддреАрди рджреБрд╢реНрдордиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрди рд╕рднреА рд╕реЗ рдпреБрдХреНрдд EnemyConfig рдиреЗрд╕реНрдЯреЗрдб рдХреНрд▓рд╛рд╕ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рддреАрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реАрд▓реНрдб рдлрд╝реИрдХреНрдЯрд░реА рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдХреЗрд╡рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЖрдк рдмрд╕ рдЗрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХрд╛рд░рдЦрд╛рдирд╛ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХреЗред EnemyConfig рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

 public class EnemyFactory : GameObjectFactory { [System.Serializable] class EnemyConfig { public Enemy prefab = default; [FloatRangeSlider(0.5f, 2f)] public FloatRange scale = new FloatRange(1f); [FloatRangeSlider(0.2f, 5f)] public FloatRange speed = new FloatRange(1f); [FloatRangeSlider(-0.4f, 0.4f)] public FloatRange pathOffset = new FloatRange(0f); } [SerializeField] EnemyConfig small = default, medium = default, large = default; тАж } 

рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рд╢рддреНрд░реБ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЕрдиреБрдХреВрд▓рди рднреА рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ рдХрд┐ рдмрдбрд╝реЗ рд╢рддреНрд░реБ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВред

  [FloatRangeSlider(10f, 1000f)] public FloatRange health = new FloatRange(100f); 

Get рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреБрд╢реНрдорди рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдордзреНрдпрдо рд╣реЛрдЧрд╛ред рд╣рдо рд╕рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп рддрд░реНрдХ рдХреЗ рд╕рд╛рде, рджреБрд╢реНрдорди рдХреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдмрдирд╛рдПрдВ рдФрд░ рд╢реБрд░реВ рдХрд░реЗрдВред

  EnemyConfig GetConfig (EnemyType type) { switch (type) { case EnemyType.Small: return small; case EnemyType.Medium: return medium; case EnemyType.Large: return large; } Debug.Assert(false, "Unsupported enemy type!"); return null; } public Enemy Get (EnemyType type = EnemyType.Medium) { EnemyConfig config = GetConfig(type); Enemy instance = CreateGameObjectInstance(config.prefab); instance.OriginFactory = this; instance.Initialize( config.scale.RandomValueInRange, config.speed.RandomValueInRange, config.pathOffset.RandomValueInRange, config.health.RandomValueInRange ); return instance; } 

Enemy.Initialize рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ рджреБрд╢реНрдорди рдХреЗ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

  public void Initialize ( float scale, float speed, float pathOffset, float health ) { тАж Health = health; } 

рд╣рдо рд╡рд┐рднрд┐рдиреНрди рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдмрдирд╛рддреЗ рд╣реИрдВ


рдЖрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддреАрди рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдореИрдВ рдЕрдзрд┐рдХрддрдо рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рдореИрдВрдиреЗ рджреБрд╢реНрдорди рдХреЗ рдореВрд▓ рдкреНрд░реАрдлрд╝реИрдм рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рддреАрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛, рдХреЗрд╡рд▓ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛: рдЫреЛрдЯреЗ рдХреЗ рд▓рд┐рдП рдкреАрд▓рд╛, рдордзреНрдпрдо рдХреЗ рд▓рд┐рдП рдиреАрд▓рд╛ рдФрд░ рдмрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рд▓ред рдореИрдВрдиреЗ рдкреНрд░реАрдлрд╝реИрдм рдХреНрдпреВрдм рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛, рд▓реЗрдХрд┐рди рдЖрдпрд╛рдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реИрдХреНрдЯрд░реА рд╕реНрдХреЗрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╕рд╛рде рд╣реА, рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдЙрдирдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рдмрдврд╝рд╛рдпрд╛ рдФрд░ рдЧрддрд┐ рдХреЛ рдХрдо рдХрд┐рдпрд╛ред


рддреАрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рджреБрд╢реНрдорди рдХреНрдпреВрдмреНрд╕ рдХреЗ рд▓рд┐рдП рдлреИрдХреНрдЯрд░реАред

рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЧреЗрдо рдХреЛ рдмрджрд▓рдХрд░ рдЧреЗрдо рдореЗрдВ рд╕рднреА рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред Game.SpawnEnemy рддрд╛рдХрд┐ рд╡рд╣ рдмреАрдЪ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреБрд╢реНрдорди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗред

  void SpawnEnemy () { GameTile spawnPoint = board.GetSpawnPoint(Random.Range(0, board.SpawnPointCount)); Enemy enemy = enemyFactory.Get((EnemyType)(Random.Range(0, 3))); enemy.SpawnOn(spawnPoint); enemies.Add(enemy); } 


рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рддреНрд░реБред

рдХрдИ рдХрд╛рд░рдЦрд╛рдиреЗ


рдЕрдм рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддреАрди рджреБрд╢реНрдорди рддрдп рдХрд░рддрд╛ рд╣реИред рдореМрдЬреВрджрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рддреАрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдХреНрдпреВрдмреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рд╣рдореЗрдВ рдПрдХ рдФрд░ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдФрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреАрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдЧреЛрд▓реЗред рд╣рдо рдЦреЗрд▓ рдореЗрдВ рдПрдХ рдФрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреА рдирд┐рдпреБрдХреНрддрд┐ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЧреЛрд▓рд╛рдХрд╛рд░ рд╢рддреНрд░реБред

рджреБрд╢реНрдордиреЛрдВ рдХреА рд▓рд╣рд░реЗрдВ


рдЧреЗрдордкреНрд▓реЗ рдкрд░рд┐рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдореЗрдВ рджреВрд╕рд░рд╛ рдХрджрдо рдПрдХ рдирд┐рд░рдВрддрд░ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рдЕрд╕реНрд╡реАрдХреГрддрд┐ рд╣реЛрдЧреАред рдЬрдм рддрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА рдпрд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣рд╛рд░ рдирд╣реАрдВ рдЬрд╛рддрд╛, рддрдм рддрдХ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд╣рд░реЛрдВ рдореЗрдВ рдкреИрджрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕реГрд╖реНрдЯрд┐ рдХреНрд░рдо


рджреБрд╢реНрдордиреЛрдВ рдХреА рдПрдХ рд▓рд╣рд░ рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд▓рд╣рд░ рдкреВрд░реА рди рд╣реЛ рдЬрд╛рдПред рдПрдХ рд▓рд╣рд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рджреБрд╢реНрдорди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреА рд░рдЪрдирд╛ рдХреЗ рдмреАрдЪ рдХреА рджреЗрд░реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдкреИрдирд┐рдВрдЧ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдПрдХ рдирд┐рд░рдВрддрд░ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджреБрд╢реНрдорди рдмрдирд╛рддрд╛ рд╣реИред рддрдм рд▓рд╣рд░ рд╕рд┐рд░реНрдл рдРрд╕реЗ рджреГрд╢реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдЧреАред

рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ EnemySpawnSequence рд╡рд░реНрдЧ рдмрдирд╛рдПрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдлрд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓реЗрдВред рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд┐рд╕ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреБрд╢реНрдорди рдмрдирд╛рдирд╛ рд╣реИ, рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЖрд╡реГрддреНрддрд┐ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рд╡рд┐рд░рд╛рдо рдмрдирд╛ рджреЗрдВрдЧреЗ, рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓рд╛ рджреБрд╢реНрдорди рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рддрдирд╛ рд╕рдордп рдЧреБрдЬрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рд▓рд╣рд░ рдореЗрдВ рдХрдИ рджреБрд╢реНрдорди рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

 using UnityEngine; [System.Serializable] public class EnemySpawnSequence { [SerializeField] EnemyFactory factory = default; [SerializeField] EnemyType type = EnemyType.Medium; [SerializeField, Range(1, 100)] int amount = 1; [SerializeField, Range(0.1f, 10f)] float cooldown = 1f; } 

рд▓рд╣рд░реЗрдВ


рдПрдХ рд▓рд╣рд░ рджреБрд╢реНрдорди рдирд┐рд░реНрдорд╛рдг рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рд░рдгреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ EnemyWave EnemyWave рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдВ рдЬреЛ рдПрдХ рдорд╛рдирдХ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

 using UnityEngine; [CreateAssetMenu] public class EnemyWave : ScriptableObject { [SerializeField] EnemySpawnSequence[] spawnSequences = { new EnemySpawnSequence() }; } 

рдЕрдм рд╣рдо рджреБрд╢реНрдордиреЛрдВ рдХреА рд▓рд╣рд░реЗрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд▓рд╣рд░ рдмрдирд╛рдИ рдЬреЛ рджреЛ рдЫреЛрдЯреЗ рд╕реЗ рджреВрд╕рд░реЗ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рджрд╕ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рдХреНрдпреВрдмрд┐рдХ рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдкрд╛рдБрдЪ рдФрд╕рдд рдХреЗ рдмрд╛рдж рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдПрдХ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкрд╛рдВрдЪ рд╕реЗрдХрдВрдб рдХреЗ рдард╣рд░рд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝рд╛ рджреБрд╢реНрдордиред


рдмрдврд╝рддреЗ рдХреНрдпреВрдмреНрд╕ рдХреА рдПрдХ рд▓рд╣рд░ред

рдХреНрдпрд╛ рдореИрдВ рджреГрд╢реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рджреЗрд░реА рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ?
рдЖрдк рдЗрд╕реЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЫреЛрдЯреЗ рдФрд░ рдордзреНрдпрдо рдХреНрдпреВрдмреНрд╕ рдХреЗ рдмреАрдЪ рдЪрд╛рд░-рд╕реЗрдХрдВрдб рдХреА рджреЗрд░реА рдбрд╛рд▓реЗрдВ, рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдЫреЛрдЯреЗ рдХреНрдпреВрдмреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░реЗрдВ, рдФрд░ рдЪрд╛рд░ рд╕реЗрдХрдВрдб рдХреЗ рдард╣рд░рд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреЗ рдХреНрдпреВрдм рдХрд╛ рдЕрдиреБрдХреНрд░рдо рдбрд╛рд▓реЗрдВред


рдЫреЛрдЯреЗ рдФрд░ рдордзреНрдпрдо рдХреНрдпреВрдмреНрд╕ рдХреЗ рдмреАрдЪ рдЪрд╛рд░ рд╕реЗрдХрдВрдб рдХреА рджреЗрд░реАред

рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ


рдЧреЗрдордкреНрд▓реЗ рдкрд░рд┐рджреГрд╢реНрдп рддрд░рдВрдЧреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХрд▓ рд╕рд░рдгреА рддрд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде GameScenario рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐ GameScenario рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдкрд░рд┐рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

 using UnityEngine; [CreateAssetMenu] public class GameScenario : ScriptableObject { [SerializeField] EnemyWave[] waves = {}; } 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЫреЛрдЯреЗ-рдордзреНрдпрдо-рдмрдбрд╝реЗ рджреБрд╢реНрдордиреЛрдВ (MSC) рдХреА рджреЛ рддрд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдмрдирд╛рдпрд╛, рдкрд╣рд▓реЗ рдХреНрдпреВрдмреНрд╕ рдХреЗ рд╕рд╛рде, рдлрд┐рд░ рдЧреЛрд▓реЗ рдХреЗ рд╕рд╛рдеред


рдПрдордПрд╕рд╕реА рдХреА рджреЛ рддрд░рдВрдЧреЛрдВ рд╡рд╛рд▓рд╛ рдкрд░рд┐рджреГрд╢реНрдпред

рдЕрдиреБрдХреНрд░рдо рдЖрдВрджреЛрд▓рди


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕реЗрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпреЗ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЧреЗрдо рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЦреЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкреВрд░реА рд╕рдВрдкрддреНрддрд┐ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рд░рд╛рдЬреНрдп рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдВрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рддреЛ рдЪрд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ State рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ EnemySpawnSequence ред рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдорд╛рдиреНрдп рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╡рд┐рдзрд┐ рджреЗрдВрдЧреЗред


рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд░рд╛рдЬреНрдп рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЗрд╕рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

 public class EnemySpawnSequence { тАж public class State { EnemySpawnSequence sequence; public State (EnemySpawnSequence sequence) { this.sequence = sequence; } } } 

рдЬрдм рд╣рдо рдПрдХ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдХреЗ рдПрдХ рдирдП рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Begin рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдиреБрдХреНрд░рдо рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рд░рд╛рдЬреНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬреЛ рдХреЛрдИ рднреА рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд░рд╛рдЬреНрдп рдХреЗ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛, рдФрд░ рдЕрдиреБрдХреНрд░рдо рд╕реНрд╡рдпрдВ рд╣реА рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд░рд╣реЗрдЧрд╛ред рдПрдХ рд╣реА рдХреНрд░рдо рдореЗрдВ рдХрдИ рдмрд╛рд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

 public class EnemySpawnSequence { тАж public State Begin () => new State(this); public class State { тАж } } 

рд░рд╛рдЬреНрдп рдХреЛ рдЧрд░реНрдо рд░рд┐рдмреВрдЯ рдХреЗ рдмрд╛рдж рдЬреАрд╡рд┐рдд рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреНрд░рдордмрджреНрдз рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  [System.Serializable] public class State { тАж } 

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ рдЕрдиреБрдХреНрд░рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рд░рд╛рдЬреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдХрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рддрдм рддрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдЬрдм рддрдХ рд╕реНрдерд┐рддрд┐ рдЫреЛрдЯреА рд░рд╣рддреА рд╣реИред рдмрд╕ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд░рд╛рдЬреНрдп рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╣реИред рдЬрдм рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдЯреНрд░реИрдХ рдХрд░реЗрдВред

  [System.Serializable] public struct State { тАж } 

рдЕрдиреБрдХреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдкрд╣рд▓реВ рд╣реЛрддреЗ рд╣реИрдВ: рдЙрддреНрдкрдиреНрди рджреБрд╢реНрдордиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдард╣рд░рд╛рд╡ рд╕рдордп рдХреА рдкреНрд░рдЧрддрд┐ред рд╣рдо Progress рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдордп рдбреЗрд▓реНрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рдард╣рд░рд╛рд╡ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ Game.Update рдореЗрдВ рдкреАрдврд╝реА рдХреЗ рд╕рдордп рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рджреБрд╢реНрдордиреЛрдВ рдХреА рдЧрд┐рдирддреА рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдард╣рд░рд╛рд╡ рдореВрд▓реНрдп рдХреЛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЕрдиреБрдХреНрд░рдо рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрд┐рдирд╛ рдард╣рд░рд╛рд╡ рдХреЗ рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗред

  int count; float cooldown; public State (EnemySpawnSequence sequence) { this.sequence = sequence; count = 0; cooldown = sequence.cooldown; } public void Progress () { cooldown += Time.deltaTime; while (cooldown >= sequence.cooldown) { cooldown -= sequence.cooldown; count += 1; } } 


рд░рд╛рдЬреНрдп рдореЗрдВ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдореИрдВ рд░рд╛рдЬреНрдп рд╕реЗ EnemySpawnSequence.cooldown рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ State рдПрдХ рд╣реА рджрд╛рдпрд░реЗ рдореЗрдВ рд╕реЗрдЯ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдЬреА рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдкреНрд░рдЧрддрд┐ рддрдм рддрдХ рдЬрд╛рд░реА рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рджреБрд╢реНрдорди рдкреИрджрд╛ рди рд╣реЛ рдЬрд╛рдПрдВ рдФрд░ рд╡рд┐рд░рд╛рдо рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, Progress рдХреЛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдореВрд▓реНрдп рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХреВрджреЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рдордп рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рдо рдореЗрдВ рдЙрдиреНрдирддрд┐ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдордп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдордп рдбреЗрд▓реНрдЯрд╛ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдореЗрдВ рдпрд╣ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреА рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ, рдФрд░ рдпрд╣ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  public float Progress (float deltaTime) { cooldown += deltaTime; while (cooldown >= sequence.cooldown) { cooldown -= sequence.cooldown; if (count >= sequence.amount) { return cooldown; } count += 1; } return -1f; } 

рдХрд╣реАрдВ рднреА рджреБрд╢реНрдорди рдкреИрджрд╛ рдХрд░реЛ


рджреБрд╢реНрдордиреЛрдВ рдХреЛ Game.SpawnEnemy рд▓рд┐рдП рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ Game.SpawnEnemy рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд Game.SpawnEnemy рд╣реЛрдЧрд╛ред

  public static void SpawnEnemy (EnemyFactory factory, EnemyType type) { GameTile spawnPoint = instance.board.GetSpawnPoint( Random.Range(0, instance.board.SpawnPointCount) ); Enemy enemy = factory.Get(type); enemy.SpawnOn(spawnPoint); instance.enemies.Add(enemy); } 

рдЪреВрдВрдХрд┐ Game рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрдм рджреБрд╢реНрдорди рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рджреБрд╢реНрдорди рдХреЗ рдХрд╛рд░рдЦрд╛рдиреЗ, рдирд┐рд░реНрдорд╛рдг рдХреА рдЧрддрд┐, рд╕реГрдЬрди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ Update рд╕реЗ рджреБрд╢реНрдорди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛрдб рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред

  void Update () { } 

рд╣рдо рджреБрд╢реНрдордиреЛрдВ рдХреА рдЧрд┐рдирддреА рдмрдврд╝рд╛рдиреЗ рдХреЗ рдмрд╛рдж Game.SpawnEnemy рдореЗрдВ EnemySpawnSequence.State.Progress рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред

  public float Progress (float deltaTime) { cooldown += deltaTime; while (cooldown >= sequence.cooldown) { тАж count += 1; Game.SpawnEnemy(sequence.factory, sequence.type); } return -1f; } 

рд╡реЗрд╡ рдЙрдиреНрдирддрд┐


рдЖрдЗрдП рд╣рдо рдПрдХ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдкреВрд░реА рд▓рд╣рд░ рдХреЗ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВред рдЖрдЗрдП EnemyWave рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ EnemyWave рддрд░реАрдХрд╛ рджреЗрдВ, рдЬреЛ рдиреЗрд╕реНрдЯреЗрдб State рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рд╛рдЬреНрдп рдореЗрдВ рддрд░рдВрдЧ рдЕрдиреБрдХреНрд░рдо рдФрд░ рд╕рдХреНрд░рд┐рдп рдЕрдиреБрдХреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рдЕрдиреБрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред


рдПрдХ рддрд░рдВрдЧ рдЕрд╡рд╕реНрдерд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдХреНрд░рдо рдХреА рдЕрд╡рд╕реНрдерд╛ рд╣реЛрддреА рд╣реИред

 public class EnemyWave : ScriptableObject { [SerializeField] EnemySpawnSequence[] spawnSequences = { new EnemySpawnSequence() }; public State Begin() => new State(this); [System.Serializable] public struct State { EnemyWave wave; int index; EnemySpawnSequence.State sequence; public State (EnemyWave wave) { this.wave = wave; index = 0; Debug.Assert(wave.spawnSequences.Length > 0, "Empty wave!"); sequence = wave.spawnSequences[0].Begin(); } } } 

рд╣рдо EnemyWave.State рдореЗрдердб Progress рдХреЛ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдЕрдкреНрд░реЛрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд╕рдХреНрд░рд┐рдп рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рд╕рдордп рдбреЗрд▓реНрдЯрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрдмрдХрд┐ рд╕рдордп рдмрдЪрд╛ рд╣реИ, рд╣рдо рдЕрдЧрд▓реЗ рдХреНрд░рдо рдкрд░ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдпрд╣ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкрд░ рдкреНрд░рдЧрддрд┐ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдЕрдиреБрдХреНрд░рдо рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИ, рддреЛ рд╣рдо рд╢реЗрд╖ рд╕рдордп рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ; рдЕрдиреНрдпрдерд╛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд▓реМрдЯрд╛рдПрдВред

  public float Progress (float deltaTime) { deltaTime = sequence.Progress(deltaTime); while (deltaTime >= 0f) { if (++index >= wave.spawnSequences.Length) { return deltaTime; } sequence = wave.spawnSequences[index].Begin(); deltaTime = sequence.Progress(deltaTime); } return -1f; } 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкреНрд░рдЪрд╛рд░


рдПрдХ рд╣реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг GameScenario рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд░рд╛рдЬреНрдп рдореЗрдВ рд╡реЗрд╡ рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рд╕рдХреНрд░рд┐рдп рддрд░рдВрдЧ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред

 public class GameScenario : ScriptableObject { [SerializeField] EnemyWave[] waves = {}; public State Begin () => new State(this); [System.Serializable] public struct State { GameScenario scenario; int index; EnemyWave.State wave; public State (GameScenario scenario) { this.scenario = scenario; index = 0; Debug.Assert(scenario.waves.Length > 0, "Empty scenario!"); wave = scenario.waves[0].Begin(); } } } 

рдЪреВрдБрдХрд┐ рд╣рдо рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рд╣реИрдВ, Progress рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрдк Time.deltaTime рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд╢реЗрд╖ рд╕рдордп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИред рд╣рдо рдЕрдВрддрд┐рдо рд▓рд╣рд░ рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж false рд▓реМрдЯреЗрдВрдЧреЗ рдФрд░ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП true рд╣реИ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд╣реИред

  public bool Progress () { float deltaTime = wave.Progress(Time.deltaTime); while (deltaTime >= 0f) { if (++index >= scenario.waves.Length) { return false; } wave = scenario.waves[index].Begin(); deltaTime = wave.Progress(deltaTime); } return true; } 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рди


Game рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реАрд▓реНрдб рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЬрд╛рдЧреГрдд рдореЗрдВ рдЪрд▓рд╛рдПрдВрдЧреЗ рдФрд░ рдЙрд╕ рдкрд░ Update рдЪрд▓рд╛рдПрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдмрд╛рдХреА рдЧреЗрдо рдХреА рд╕реНрдерд┐рддрд┐ рдЕрдкрдбреЗрдЯ рди рд╣реЛ рдЬрд╛рдПред

  [SerializeField] GameScenario scenario = default; GameScenario.State activeScenario; тАж void Awake () { board.Initialize(boardSize, tileContentFactory); board.ShowGrid = true; activeScenario = scenario.Begin(); } тАж void Update () { тАж activeScenario.Progress(); enemies.GameUpdate(); Physics.SyncTransforms(); board.GameUpdate(); nonEnemies.GameUpdate(); } 

рдЕрдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЧреЗрдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкрд░ рдкрджреЛрдиреНрдирддрд┐ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


рджреЛ рддрд░рдВрдЧреЛрдВ рдХреЛ 10 рдЧреБрдирд╛ рддреЗрдЬ рдХрд┐рдпрд╛ред

рдЧреЗрдо рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ


рд╣рдо рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдирдП рджреБрд╢реНрдорди рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗред рдЦреЗрд▓ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ, рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣рд╛рд░ рдЧрдпрд╛ / рдЬреАрддрд╛, рдирдП рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдХрдИ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреА рдкрд╕рдВрдж рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдо рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдПрдХ рдирдП рдЦреЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд


рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдПрдХ рдирдпрд╛ рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреВрд░реЗ рдЧреЗрдо рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╣рдореЗрдВ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, GameBehaviorCollection рдПрдХ Clear рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЗрд╕рдХреЗ рд╕рднреА рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

  public void Clear () { for (int i = 0; i < behaviors.Count; i++) { behaviors[i].Recycle(); } behaviors.Clear(); } 

рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХрд╛ рдирд┐рдкрдЯрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдпрд╣ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GameBehavior рдЕрдореВрд░реНрдд Recycle рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред

  public abstract void Recycle (); 

WarEntity рд╡рд░реНрдЧ рдХреА Recycle рд╡рд┐рдзрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

  public override void Recycle () { originFactory.Reclaim(this); } 

Enemy рдкрд╛рд╕ рдЕрднреА рддрдХ Recycle рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВред рдЙрд╕реЗ рдмрд╕ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рддрдм рд╣рдо Recycle рдХрд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рд╕реАрдзреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВред

  public override bool GameUpdate () { if (Health <= 0f) { Recycle(); return false; } progress += Time.deltaTime * progressFactor; while (progress >= 1f) { if (tileTo == null) { Recycle(); return false; } тАж } тАж } public override void Recycle () { OriginFactory.Reclaim(this); } 

GameBoard рднреА рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ Clear рд╡рд┐рдзрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдХреЛ рдЦрд╛рд▓реА рдХрд░рддрд╛ рд╣реИ, рд╕рднреА рд╕реГрдЬрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдорд╛рдирдХ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рдмрд┐рдВрджреБ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░, рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо Initialize рдХреЗ рдЕрдВрдд рдореЗрдВ Clear рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред

  public void Initialize ( Vector2Int size, GameTileContentFactory contentFactory ) { тАж for (int i = 0, y = 0; y < size.y; y++) { for (int x = 0; x < size.x; x++, i++) { тАж } } Clear(); } public void Clear () { foreach (GameTile tile in tiles) { tile.Content = contentFactory.Get(GameTileContentType.Empty); } spawnPoints.Clear(); updatingContent.Clear(); ToggleDestination(tiles[tiles.Length / 2]); ToggleSpawnPoint(tiles[0]); } 

рдЕрдм рд╣рдо Game , рдбрдВрдкрд┐рдВрдЧ рджреБрд╢реНрдордиреЛрдВ, рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП BeginNewGame рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдирдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  void BeginNewGame () { enemies.Clear(); nonEnemies.Clear(); board.Clear(); activeScenario = scenario.Begin(); } 

рдпрджрд┐ рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ B рджрдмрд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдо Update рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред

  void Update () { тАж if (Input.GetKeyDown(KeyCode.B)) { BeginNewGame(); } activeScenario.Progress(); тАж } 

рд╣рд╛рдирд┐


рдЧреЗрдо рдХрд╛ рд▓рдХреНрд╖реНрдп рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рджреБрд╢реНрдордиреЛрдВ рдХреЛ рд╣рд░рд╛рдирд╛ рд╣реИред рд╣рд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рджреБрд╢реНрдордиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо Game рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЪреВрдБрдХрд┐ рд╣рдо рджреБрд╢реНрдордиреЛрдВ рдХреА рдЧрд┐рдирддреА рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рддреИрд░рдиреЗ рдХрд╛ рдирд╣реАрдВред

  [SerializeField, Range(0, 100)] int startingPlayerHealth = 10; 



рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдкрд╛рд╕ 10 рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╣реЛрддреЗ рд╣реИрдВред

рдЬрд╛рдЧрдиреЗ рдпрд╛ рдПрдХ рдирдП рдЦреЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

  int playerHealth; тАж void Awake () { playerHealth = startingPlayerHealth; тАж } void BeginNewGame () { playerHealth = startingPlayerHealth; тАж } 

рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ EnemyReachedDestination рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ EnemyReachedDestination рджреБрд╢реНрдорди Game рдХреЛ рдмрддрд╛ рд╕рдХреЗрдВ рдХрд┐ рд╡реЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рдХрдо рдХрд░реЗрдВред

  public static void EnemyReachedDestination () { instance.playerHealth -= 1; } 

рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ Enemy.GameUpdate рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВред рдЙрдЪрд┐рдд рд╕рдордп рдкрд░ Enemy.GameUpdate ред

  if (tileTo == null) { Game.EnemyReachedDestination(); Recycle(); return false; } 

рдЕрдм рд╣рдо Game.Update рдореЗрдВ рд╣рд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдпрд╛ рдЙрд╕рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╣рд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдкреИрджрд╛ рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╣рдо рдмрд╕ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреБрд░рдВрдд рдПрдХ рдирдпрд╛ рдЧреЗрдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рд╕рд╛рде рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рд░реВрдк рдореЗрдВ 0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдЦреЛрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП рд▓рд┐рдкрд┐рдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред

  if (playerHealth <= 0 && startingPlayerHealth > 0) { Debug.Log("Defeat!"); BeginNewGame(); } activeScenario.Progress(); 

рдЬреАрдд


рд╣рд╛рд░ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЬреАрдд рд╣реИ, рдЬреЛ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрднреА рднреА рдЬреАрд╡рд┐рдд рд╣реИред рдпрд╣реА рд╣реИ, рдЬрдм GameScenario.Progess рдХрд╛ рдкрд░рд┐рдгрд╛рдо false , рд╣рдо рд▓реЙрдЧ рдореЗрдВ рдПрдХ рдЬреАрдд рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдирдпрд╛ рдЧреЗрдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рддреБрд░рдВрдд рдЙрд╕ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

  if (playerHealth <= 0) { Debug.Log("Defeat!"); BeginNewGame(); } if (!activeScenario.Progress()) { Debug.Log("Victory!"); BeginNewGame(); activeScenario.Progress(); } 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреАрдд рдЖрдЦрд┐рд░реА рдард╣рд░рд╛рд╡ рдХреЗ рдмрд╛рдж рдЖрдПрдЧреА, рднрд▓реЗ рд╣реА рдореИрджрд╛рди рдкрд░ рдЕрднреА рднреА рджреБрд╢реНрдорди рд╣реЛрдВред рд╣рдореЗрдВ рдЬреАрдд рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рджреБрд╢реНрдорди рдЧрд╛рдпрдм рди рд╣реЛ рдЬрд╛рдПрдВ, рдЬреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рджреБрд╢реНрдордиреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдЦрд╛рд▓реА рд╣реИред рд╣рдо рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рдкрд╛рд╕ IsEmpty рд╕рдВрдкрддреНрддрд┐ рд╣реИред

  if (!activeScenario.Progress() && enemies.IsEmpty) { Debug.Log("Victory!"); BeginNewGame(); activeScenario.Progress(); } 

GameBehaviorCollection рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВред

  public bool IsEmpty => behaviors.Count == 0; 

рд╕рдордп рдкрд░ рдирд┐рдпрдВрддреНрд░рдг


рдЪрд▓реЛ рд╕рдордп рдкреНрд░рдмрдВрдзрди рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдФрд░ рдЕрдХреНрд╕рд░ рдЧреЗрдордкреНрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Game.Update рдХреЛ рдПрдХ рд╕реНрдкреЗрд╕рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХрд░реЗрдВ, рдФрд░ рдЧреЗрдо рдореЗрдВ рдкреЙрдЬрд╝ рдХреЛ рд╕рдХреНрд╖рдо / рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рд╢реВрдиреНрдп рдФрд░ рдПрдХ рдХреЗ рдмреАрдЪ Time.timeScale рдорд╛рдиреЛрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЧреЗрдо рд▓реЙрдЬрд┐рдХ рдХреЛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛, рдмрд▓реНрдХрд┐ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдлреНрд░реАрдЬ рдХрд░ рджреЗрдЧрд╛ред рдпрд╛ рдЖрдк 0 рдХреЗ рдмрдЬрд╛рдп рдмрд╣реБрдд рдХрдо рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 0.01, рдЕрддреНрдпрдВрдд рдзреАрдореА рдЧрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

  const float pausedTimeScale = 0f; тАж void Update () { тАж if (Input.GetKeyDown(KeyCode.Space)) { Time.timeScale = Time.timeScale > pausedTimeScale ? pausedTimeScale : 1f; } if (Input.GetKeyDown(KeyCode.B)) { BeginNewGame(); } тАж } 

-, Game , .

  [SerializeField, Range(1f, 10f)] float playSpeed = 1f; 


.

, . .

  if (Input.GetKeyDown(KeyCode.Space)) { Time.timeScale = Time.timeScale > pausedTimeScale ? pausedTimeScale : playSpeed; } else if (Time.timeScale > pausedTimeScale) { Time.timeScale = playSpeed; } 


. , . , , , .


GameScenario , 1. , . , , , , .

  [SerializeField, Range(0, 10)] int cycles = 1; 


.

GameScenario.State .

  int cycle, index; EnemyWave.State wave; public State (GameScenario scenario) { this.scenario = scenario; cycle = 0; index = 0; wave = scenario.waves[0].Begin(); } 

Progress , false , . .

  public bool Progress () { float deltaTime = wave.Progress(Time.deltaTime); while (deltaTime >= 0f) { if (++index >= scenario.waves.Length) { if (++cycle >= scenario.cycles && scenario.cycles > 0) { return false; } index = 0; } wave = scenario.waves[index].Begin(); deltaTime = wave.Progress(deltaTime); } return true; } 


, . , . , . .

GameScenario . . , 0.5 ├Ч1, ├Ч1.5, ├Ч2, ├Ч2.5, .

  [SerializeField, Range(0f, 1f)] float cycleSpeedUp = 0.5f; 

GameScenario.State . 1 . Time.deltaTime .

  float timeScale; EnemyWave.State wave; public State (GameScenario scenario) { this.scenario = scenario; cycle = 0; index = 0; timeScale = 1f; wave = scenario.waves[0].Begin(); } public bool Progress () { float deltaTime = wave.Progress(timeScale * Time.deltaTime); while (deltaTime >= 0f) { if (++index >= scenario.waves.Length) { if (++cycle >= scenario.cycles && scenario.cycles > 0) { return false; } index = 0; timeScale += scenario.cycleSpeedUp; } wave = scenario.waves[index].Begin(); deltaTime = wave.Progress(deltaTime); } return true; } 


; .

? Patreon !



PDF

Source: https://habr.com/ru/post/hi466855/


All Articles