рдПрдХрддрд╛ рдореЗрдВ рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдмрдирд╛рдирд╛: рдЯрд╛рд╡рд░реНрд╕ рдФрд░ рд╢реВрдЯрд┐рдВрдЧ рджреБрд╢реНрдорди

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

  • рд╣рдо рдЯреЙрд╡рд░ рдХреЗ рдореИрджрд╛рди рдкрд░ рдЬрдЧрд╣ рдмрдирд╛рддреЗ рд╣реИрдВред
  • рд╣рдо рднреМрддрд┐рдХреА рдХреА рдорджрдж рд╕реЗ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдирд┐рд╢рд╛рдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред
  • рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИред
  • рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рд▓реЗрдЬрд░ рдмреАрдо рдХреЗ рд╕рд╛рде рд╢реВрдЯ рдХрд░рддреЗ рд╣реИрдВред

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

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


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

рдЯреЙрд╡рд░ рдирд┐рд░реНрдорд╛рдг


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

рдЯрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА


рдЯрд╛рд╡рд░реНрд╕ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЯрд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА рд╣реИрдВ, рддреЛ GameTileContent рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝реЗрдВред

 public enum GameTileContentType { Empty, Destination, Wall, SpawnPoint, TowerтВм } 

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

  [SerializeField] GameTileContent towerPrefab = default; public GameTileContent Get (GameTileContentType type) { switch (type) { тАж case GameTileContentType.TowerтВм: return Get(towerPrefab); } тАж } 

рд▓реЗрдХрд┐рди рдЯрд╛рд╡рд░реЛрдВ рдХреЛ рд╢реВрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ Tower рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ рдЬреЛ GameTileContent рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред

 using UnityEngine; public class Tower : GameTileContent {} 

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

  Tower towerPrefab = default; 

рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд


рдЯреЙрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реАрдлреИрдм рдмрдирд╛рдПрдВред рдЖрдк рджреАрд╡рд╛рд░ GameTileContent рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдХреЗ рдФрд░ рдЗрд╕рдХреЗ GameTileContent рдШрдЯрдХ рдХреЛ Tower рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓рдХрд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЯреЙрд╡рд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЯреЙрд╡рд░ рдХреЛ рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреЙрд╡рд░ рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреАрд╡рд╛рд░ рдХреНрдпреВрдм рдХреЛ рдмрдЪрд╛рдПрдВред рдлрд┐рд░ рдЙрд╕рдХреЗ рдКрдкрд░ рдПрдХ рдФрд░ рдХреНрдпреВрдм рд░рдЦреЗрдВред рдореИрдВрдиреЗ рдЙрд╕реЗ 0.5 рдХрд╛ рдкреИрдорд╛рдирд╛ рджрд┐рдпрд╛ред рдЙрд╕ рдкрд░ рдПрдХ рдФрд░ рдХреНрдпреВрдм рд░рдЦреЛ, рдПрдХ рдмреБрд░реНрдЬ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реБрдП, рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рджреБрд╢реНрдордиреЛрдВ рдкрд░ рдирд┐рд╢рд╛рдирд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рдЧреЛрд▓реА рдорд╛рд░ рджреЗрдЧрд╛ред



рдПрдХ рдЯрд╛рд╡рд░ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рддреАрди рдХреНрдпреВрдмреНрд╕ред

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



рдХреЛрд▓рд╛рдЗрдбрд░ рдШрди рдЯреЙрд╡рд░ред

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

рд▓реЗрдЬрд░ рдмреАрдо

рдЕрдиреБрдХреНрд░рдо

рдПрдХ рд▓реЗрдЬрд░ рдмреАрдо рдХрд╛ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдШрдиред

рд▓реЗрдЬрд░ рдмреАрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рдПрдВред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдорд╛рдирдХ рдкрд╛рд░рднрд╛рд╕реА рдХрд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рд╕рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдЗрд╕реЗ рдПрдХ рд▓рд╛рд▓ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд░рдВрдЧ рднреА рджрд┐рдпрд╛ред

рд░рдВрдЧ

рдХреЛрдИ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдирд╣реАрдВ

рд▓реЗрдЬрд░ рдмреАрдо рдХреА рд╕рд╛рдордЧреНрд░реАред

рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рд▓реЗрдЬрд░ рдмреАрдо рдореЗрдВ рдХреЛрд▓рд╛рдЗрдбрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд╕реНрдЯ рдФрд░ рдЫрд╛рдпрд╛ рдХреЛ рднреА рдмрдВрдж рдХрд░ рджреЗрдВред


рд▓реЗрдЬрд╝рд░ рдмреАрдо рд╢реИрдбреЛ рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЯреЙрд╡рд░ рдкреНрд░реАрдлреИрдм рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред


рдЯрд╛рд╡рд░ рдХреЗ рд╕рд╛рде рдлреИрдХреНрдЯрд░реАред

рдЯреЙрд╡рд░ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ


рд╣рдо рдПрдХ рдФрд░ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рд╡рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗред рдЖрдк рдмрд╕ рд╡рд┐рдзрд┐ рдирд╛рдо рдФрд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдХрд░ GameBoard.ToggleWall рдирдХрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  public void ToggleTower (GameTile tile) { if (tile.Content.Type == GameTileContentType.TowerтВм) { tile.Content = contentFactory.Get(GameTileContentType.Empty); FindPaths(); } else if (tile.Content.Type == GameTileContentType.Empty) { tile.Content = contentFactory.Get(GameTileContentType.TowerтВм); if (!FindPaths()) { tile.Content = contentFactory.Get(GameTileContentType.Empty); FindPaths(); } } } 

Game.HandleTouch , рд╢рд┐рдлреНрдЯ рдХреА рдХреЛ рдкрдХрдбрд╝рдХрд░ рджреАрд╡рд╛рд░реЛрдВ рдХреА рдмрдЬрд╛рдп рдЯрд╛рд╡рд░реЛрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

  void HandleTouch () { GameTile tile = board.GetTile(TouchRay); if (tile != null) { if (Input.GetKey(KeyCode.LeftShift)) { board.ToggleTower(tile); } else { board.ToggleWall(tile); } } } 


рдореИрджрд╛рди рдкрд░ рдЯрд╛рд╡рд░реНрд╕ред

рдкрде рдЕрд╡рд░реБрджреНрдз


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

  public bool BlocksPath => Type == GameTileContentType.Wall || Type == GameTileContentType.TowerтВм; 

рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп GameTile.GrowPathTo рдореЗрдВ рдЗрд╕ рдЧреБрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

  GameTile GrowPathTo (GameTile neighbor, Direction direction) { тАж return //neighbor.Content.Type != GameTileContentType.Wall ? neighbor : null; neighbor.Content.BlocksPath ? null : neighbor; } 


рдЕрдм рдкрде рджреАрд╡рд╛рд░реЛрдВ рдФрд░ рдЯрд╛рд╡рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рд╣реИред

рджреАрд╡рд╛рд░реЛрдВ рдХреА рдЬрдЧрд╣


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

  public void ToggleTower (GameTile tile) { if (tile.Content.Type == GameTileContentType.Tower) { tile.Content = contentFactory.Get(GameTileContentType.Empty); FindPaths(); } else if (tile.Content.Type == GameTileContentType.Empty) { тАж } else if (tile.Content.Type == GameTileContentType.Wall) { tile.Content = contentFactory.Get(GameTileContentType.Tower); } } 

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


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

рд▓рдХреНрд╖реНрдп рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП


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

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

 using UnityEngine; public class TargetPoint : MonoBehaviour { public Enemy EnemyтВм { get; private set; } public Vector3 Position => transform.position; } 

рдЖрдЗрдП рдЗрд╕реЗ рдПрдХ Awake рд╡рд┐рдзрд┐ рджреЗрдВ рдЬреЛ рдЕрдкрдиреЗ Enemy рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред transform.root рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ рд░реВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдЬрд╛рдПрдВред рдпрджрд┐ Enemy рдШрдЯрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдордиреЗ рджреБрд╢реНрдорди рдмрдирд╛рддреЗ рд╕рдордп рдПрдХ рдЧрд▓рддреА рдХреА рд╣реИ, рддреЛ рдЖрдЗрдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдпрд╛рди рдЬреЛрдбрд╝реЗрдВред

  void Awake () { EnemyтВм = transform.root.GetComponent<Enemy>(); Debug.Assert(EnemyтВм != null, "Target point without Enemy root!", this); } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрд▓рд╛рдЗрдбрд░ рдХреЛ рдЙрд╕реА рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ TargetPoint рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

  Debug.Assert(EnemyтВм != null, "Target point without Enemy root!", this); Debug.Assert( GetComponent<SphereCollider>() != null, "Target point without sphere collider!", this ); 

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


рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░

рдПрдХ рд▓рдХреНрд╖реНрдп рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдПрдХ рджреБрд╢реНрдорди рдФрд░ рдПрдХ рдШрди рдкрд░ рдПрдХ рдХреЛрд▓рд╛рдЗрдбрд░ред

рд╢рддреНрд░реБ рдкрд░рдд


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


рд▓реЗрдпрд░ 9 рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рджреБрд╢реНрдордиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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


рдкрд░рдд рдХреА рдЯрдХрд░рд╛рд╡ рдХреА рдореИрдЯреНрд░рд┐рдХреНрд╕ред

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


рд╕рд╣реА рдкрд░рдд рдкрд░ рджреБрд╢реНрдордиред

рдЪрд▓рд┐рдП рдЗрд╕ рдХрдерди рдХреЛ TargetPoint рдХрд┐ TargetPoint рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рдкрд░рдд рдкрд░ рд╣реИред

  void Awake () { тАж Debug.Assert(gameObject.layer == 9, "Target point on wrong layer!", this); } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджреБрд╢реНрдорди рдХреЗ рд╕рд╛рдерд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ GameBoard.GetTile рдореЗрдВ GameBoard.GetTile рдореЗрдВ рдПрдХ рд▓реЗрдпрд░ рдорд╛рд╕реНрдХ рддрд░реНрдХ рдЬреЛрдбрд╝рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рд░реВрдк рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмреАрдо рдФрд░ рдкрд░рдд рдореБрдЦреМрдЯрд╛ рдХреА рджреВрд░реА рдХреЛ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХрддрдо рджреВрд░реА рдФрд░ рдкрд░рдд рдХрд╛ рдореБрдЦреМрдЯрд╛ рджреЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рдд 1ред

  public GameTile GetTile (Ray ray) { if (Physics.Raycast(ray, out RaycastHit hit, float.MaxValue, 1)) { тАж } return null; } 

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

рдЕрджреНрдпрддрди рдЯрд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА


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

  public virtual void GameUpdate () {} 

рдЪрд▓реЛ Tower рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд▓рдХреНрд╖реНрдп рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИред

  public override void GameUpdate () { Debug.Log("Searching for target..."); } 

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

  List<GameTileContent> updatingContent = new List<GameTileContent>(); тАж public void GameUpdate () { for (int i = 0; i < updatingContent.Count; i++) { updatingContent[i].GameUpdate(); } } 

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

  public void ToggleTower (GameTile tile) { if (tile.Content.Type == GameTileContentType.Tower) { updatingContent.Remove(tile.Content); tile.Content = contentFactory.Get(GameTileContentType.Empty); FindPaths(); } else if (tile.Content.Type == GameTileContentType.Empty) { tile.Content = contentFactory.Get(GameTileContentType.Tower); //if (!FindPaths()) { if (FindPaths()) { updatingContent.Add(tile.Content); } else { tile.Content = contentFactory.Get(GameTileContentType.Empty); FindPaths(); } } else if (tile.Content.Type == GameTileContentType.Wall) { tile.Content = contentFactory.Get(GameTileContentType.Tower); updatingContent.Add(tile.Content); } } 

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

  void Update () { тАж enemies.GameUpdate(); board.GameUpdate(); } 

рд▓рдХреНрд╖реНрдп рдХреА рд╕реАрдорд╛


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

  [SerializeField, Range(1.5f, 10.5f)] float targetingRange = 1.5f; 


рд╕реАрдорд╛ 2.5 рдХрд╛ рд▓рдХреНрд╖реНрдпред

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

  void OnDrawGizmosSelected () { Gizmos.color = Color.yellow; Vector3 position = transform.localPosition; position.y += 0.01f; Gizmos.DrawWireSphere(position, targetingRange); } 


Gizmo рд▓рдХреНрд╖реНрдп рд╕реАрдорд╛ред

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

 [SelectionBase] public class GameTileContent : MonoBehaviour { тАж } 

рд▓рдХреНрд╖реНрдп рдкрд░ рдХрдмреНрдЬрд╛


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

  TargetPoint target; public override void GameUpdate () { if (AcquireTarget()) { Debug.Log("Acquired target!"); } } 

AcquireTarget рд╣рдо AcquireTarget рдХреЛ рдПрдХ рдЯрд╛рд╡рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реАрдорд╛ рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рднреА рдЙрдкрд▓рдмреНрдз рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ Collider рд╕рд░рдгреА рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА Collider рдЧреЛрд▓рд╛ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд╣реЛрдВрдЧреЗред рдпрджрд┐ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд▓рдХреНрд╖реНрдп рдмрд┐рдВрджреБ рд╣реИ, рдФрд░ рд╣рдо рдмрд╕ рдкрд╣рд▓реЗ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ TargetPoint рдШрдЯрдХ рд▓реЗрдВ, рдЬреЛ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕реЗ рд▓рдХреНрд╖реНрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ рдФрд░ рд╕рдлрд▓рддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВред рдЕрдиреНрдпрдерд╛, рд╣рдо рд▓рдХреНрд╖реНрдп рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

  bool AcquireTarget () { Collider[] targets = Physics.OverlapSphere( transform.localPosition, targetingRange ); if (targets.Length > 0) { target = targets[0].GetComponent<TargetPoint>(); Debug.Assert(target != null, "Targeted non-enemy!", targets[0]); return true; } target = null; return false; } 

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

  const int enemyLayerMask = 1 << 9; тАж bool AcquireTarget () { Collider[] targets = Physics.OverlapSphere( transform.localPosition, targetingRange, enemyLayerMask ); тАж } 

рдпрд╣ рдмрд┐рдЯрдорд╛рд╕реНрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рдЪреВрдБрдХрд┐ рджреБрд╢реНрдорди рдХреА рдкрд░рдд рдореЗрдВ 9 рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд┐рдЯрдореЗрд╕реНрдХ рдХреЗ рджрд╕рд╡реЗрдВ рдмрд┐рдЯ рдХрд╛ рдорд╛рди 1 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ 2 9 рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ 512 рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХрд╛ рдмрд┐рдЯрдХреЙрдЗрди рд░рд┐рдХреЙрд░реНрдб рдЕрдирдЗрдВрд╕реНрдЯрд┐рдЯреНрдпреВрдЯ рд╣реИред рд╣рдо рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╢рд╛рдмреНрджрд┐рдХ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 0b10_0000_0000 , рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдореЗрдВ рд╢реВрдиреНрдп рдЧрд┐рдирдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд╛рдПрдВ рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрдЯрд░ << рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдмрд┐рдЯреНрд╕ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬреЛ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

рдЖрдк рдЯреЙрд╡рд░ рдФрд░ рд▓рдХреНрд╖реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмреАрдЪ рдПрдХ рдЙрдкрдпреЛрдЧреА рд░реЗрдЦрд╛ рдЦреАрдВрдЪрдХрд░ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд▓рдХреНрд╖реНрдп рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  void OnDrawGizmosSelected () { тАж if (target != null) { Gizmos.DrawLine(position, target.Position); } } 


рд▓рдХреНрд╖реНрдпреЛрдВ рдХрд╛ рджреГрд╢реНрдпред

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

рдЯрд╛рд░рдЧреЗрдЯ рд▓реЙрдХ


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

  bool TrackTarget () { if (target == null) { return false; } return true; } 

рд╣рдо GameUpdate рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЬрдм рд╣рдо рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВрдЧреЗ, рд╣рдо AcquireTarget рдХреЙрд▓ AcquireTarget ред рдпрджрд┐ рд╡рд┐рдзрд┐ рд╕рд╣реА рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓рдХреНрд╖реНрдп рд╣реИред рдпрд╣ рдУрдЖрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЪреЗрдХ рдЪреЗрдХ рдореЗрдВ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд░рдЦрдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдкрд╣рд▓рд╛ рдСрдкрд░реЗрдВрдб true , рддреЛ рджреВрд╕рд░рд╛ рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХреЙрд▓ рдорд┐рд╕ рд╣реЛ рдЬрд╛рдПрдЧреАред AND рдСрдкрд░реЗрдЯрд░ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

  public override void GameUpdate () { if (TrackTarget() || AcquireTarget()) { Debug.Log("Locked on target!"); } } 


рдЯреНрд░реИрдХрд┐рдВрдЧ рд▓рдХреНрд╖реНрдпред

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

рд▓рдХреНрд╖реНрдп рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рд╡реЗ рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ TrackTarget рдХреЛ рдЯреЙрд╡рд░ рдФрд░ рд▓рдХреНрд╖реНрдп рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдпрд╣ рд╕реАрдорд╛ рдорд╛рди рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд▓рдХреНрд╖реНрдп рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЧрд▓рдд рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП Vector3.Distance рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  bool TrackTarget () { if (target == null) { return false; } Vector3 a = transform.localPosition; Vector3 b = target.Position; if (Vector3.Distance(a, b) > targetingRange) { target = null; return false; } return true; } 

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

  if (Vector3.Distance(a, b) > targetingRange + 0.125f) { тАж } 

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

  public float Scale { get; private set; } тАж public void Initialize (float scale, float speed, float pathOffset) { Scale = scale; тАж } 

рдЕрдм рд╣рдо Tower.TrackTarget рдореЗрдВ рд╕рд╣реА рд░реЗрдВрдЬ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  if (Vector3.Distance(a, b) > targetingRange + 0.125f * target.EnemyтВм.Scale) { тАж } 

рд╣рдо рднреМрддрд┐рдХреА рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ


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


рдЧрд▓рдд рдирд┐рд╢рд╛рдирд╛ рд▓рдЧрд╛рдирд╛ред

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

рдЬрдм рдЖрдк Physics.autoSyncTransforms рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рд╕реЗрдЯ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдЕрдХреНрд╖рдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдЯрд╛рд╡рд░реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо Game.Update рдореЗрдВ рджреБрд╢реНрдорди рдФрд░ рдХреНрд╖реЗрддреНрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рдмреАрдЪ Game.Update рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  void Update () { тАж enemies.GameUpdate(); Physics.SyncTransforms(); board.GameUpdate(); } 

рдКрдБрдЪрд╛рдИ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдЧреЗрдордкреНрд▓реЗ 2 рдбреА рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, Tower рдмрджрд▓ рджреЗрдВ рддрд╛рдХрд┐ рдЬрдм рд▓рдХреНрд╖реНрдп рдХрд░рдирд╛ рдФрд░ рдЙрд╕ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рдХреЗрд╡рд▓ рдПрдХреНрд╕ рдФрд░ рдЬреЗрдб рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ AcquireTarget рдореЗрдВ AcquireTarget ред рднреМрддрд┐рдХ рдЗрдВрдЬрди 3 рдбреА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╣рдо 2 рдбреА рдореЗрдВ AcquireTarget рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЧреЛрд▓рд╛рдХрд╛рд░ рдХреЛ рдКрдкрд░ рдЦреАрдВрдЪреЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рднреА рдХреЛрд▓рд╛рдЗрдбрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣реЛ рд╕рдХреЗред рдЙрдирдХреА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд┐рддрд┐ рд╕реЗред рдпрд╣ рдПрдХ рдЧреЛрд▓реЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХреИрдкреНрд╕реВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рджреВрд╕рд░рд╛ рдмрд┐рдВрджреБ рдЬрдореАрди рдХреЗ рдКрдкрд░ рдХрдИ рдЗрдХрд╛рдЗрдпрд╛рдВ рд╣реЛрдВрдЧреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреАрди)ред

  bool AcquireTarget () { Vector3 a = transform.localPosition; Vector3 b = a; by += 3f; Collider[] targets = Physics.OverlapCapsule( a, b, targetingRange, enemyLayerMask ); тАж } 

2D-?
, XZ, 2D- XY. , , 2D- . 3D-.

TrackTarget . , 2D- Vector2.Distance , , . .

  bool TrackTarget () { if (target == null) { return false; } Vector3 a = transform.localPosition; Vector3 b = target.Position; float x = ax - bx; float z = az - bz; float r = targetingRange + 0.125f * target.EnemyтВм.Scale; if (x * x + z * z > r * r) { target = null; return false; } return true; } 

?
2D- , . , . , , .


Physics.OverlapCapsule , . , OverlapCapsuleNonAlloc . . . , 1.

OverlapCapsuleNonAlloc , , .

  static Collider[] targetsBuffer = new Collider[1]; тАж bool AcquireTarget () { Vector3 a = transform.localPosition; Vector3 b = a; by += 2f; int hits = Physics.OverlapCapsuleNonAlloc( a, b, targetingRange, targetsBuffer, enemyLayerMask ); if (hits > 0) { target = targetsBuffer[0].GetComponent<TargetPoint>(); Debug.Assert(target != null, "Targeted non-enemy!", targetsBuffer[0]); return true; } target = null; return false; } 


, , . , .


, Tower Transform . .

  [SerializeField] Transform turret = default; 


.

GameUpdate , . . , Transform.LookAt .

  public override void GameUpdate () { if (TrackTarget() || AcquireTarget()) { //Debug.Log("Locked on target!"); Shoot(); } } void Shoot () { Vector3 point = target.Position; turret.LookAt(point); } 


.


Tower .

  [SerializeField] Transform turret = default, laserBeam = default; 


.

, . -, . , .

  void Shoot () { Vector3 point = target.Position; turret.LookAt(point); laserBeam.localRotation = turret.localRotation; } 

- , . Z, , . XY, (Awake) .

  Vector3 laserBeamScale; void Awake () { laserBeamScale = laserBeam.localScale; } тАж void Shoot () { Vector3 point = target.Position; turret.LookAt(point); laserBeam.localRotation = turret.localRotation; float d = Vector3.Distance(turret.position, point); laserBeamScale.z = d; laserBeam.localScale = laserBeamScale; } 

-, .

  laserBeam.localScale = laserBeamScale; laserBeam.localPosition = turret.localPosition + 0.5f * d * laserBeam.forward; 


.

?
, , forward. , . .

, . , . , GameUpdate 0.

  public override void GameUpdate () { if (TrackTarget() || AcquireTarget()) { Shoot(); } else { laserBeam.localScale = Vector3.zero; } } 


.


. , . , Enemy . , 100. , , .

  float Health { get; set; } тАж public void Initialize (float scale, float speed, float pathOffset) { тАж Health = 100f * scale; } 

, ApplyDamage , . , , .

  public void ApplyDamage (float damage) { Debug.Assert(damage >= 0f, "Negative damage applied."); Health -= damage; } 

, . GameUpdate .

  public bool GameUpdate () { if (Health <= 0f) { OriginFactory.Reclaim(this); return false; } тАж } 

, , , , .


, . Tower . , (damage per second). Shoot Enemy .

  [SerializeField, Range(1f, 100f)] float damagePerSecond = 10f; тАж void Shoot () { тАж target.Enemy.ApplyDamage(damagePerSecond * Time.deltaTime); } 

inspector


тАФ 20 .


, , . , , , . , .

, , . , , 100. , , .

  static Collider[] targetsBuffer = new Collider[100]; 

.

  bool AcquireTarget () { тАж if (hits > 0) { target = targetsBuffer[Random.Range(0, hits)].GetComponent<TargetPoint>(); тАж } target = null; return false; } 


.

?
, , . , , . . .

, ┬л ┬╗ - . .

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


All Articles