рдПрдХрддрд╛ рдореЗрдВ рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдмрдирд╛рдирд╛: рдмреИрд▓рд┐рд╕реНрдЯрд┐рдХреНрд╕

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

  • рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрд╛рд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред
  • рдореЛрд░реНрдЯрд╛рд░ рдЯреЙрд╡рд░ рдмрдирд╛рдирд╛ред
  • рдкрд░рд╡рд▓рдпрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреА рдЧрдгрдирд╛ред
  • рд╡рд┐рд╕реНрдлреЛрдЯ рдХреЗ рдЧреЛрд▓реЗ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ред

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

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


рджреБрд╢реНрдордиреЛрдВ рдкрд░ рдмрдо рдмрд░рд╕рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЯрд╛рд╡рд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░


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

рд╕рд╛рд░ рдЯреЙрд╡рд░


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

 using UnityEngine; public abstract class Tower : GameTileContent { const int enemyLayerMask = 1 << 9; static Collider[] targetsBuffer = new Collider[100]; [SerializeField, Range(1.5f, 10.5f)] protected float targetingRange = 1.5f; protected bool AcquireTarget (out TargetPoint target) { тАж } protected bool TrackTarget (ref TargetPoint target) { тАж } void OnDrawGizmosSelected () { Gizmos.color = Color.yellow; Vector3 position = transform.localPosition; position.y += 0.01f; Gizmos.DrawWireSphere(position, targetingRange); } } 

рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдПрдХ LaserTower рдореЗрдВ рдмрджрд▓ рдЬрд╛рдП рдЬреЛ Tower рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

 using UnityEngine; public class LaserTower : Tower { [SerializeField, Range(1f, 100f)] float damagePerSecond = 10f; [SerializeField] Transform turret = default, laserBeam = default; TargetPoint target; Vector3 laserBeamScale; void Awake () { laserBeamScale = laserBeam.localScale; } public override void GameUpdate () { if (TrackTarget(ref target) || AcquireTarget(out target)) { Shoot(); } else { laserBeam.localScale = Vector3.zero; } } void Shoot () { тАж } } 

рдлрд┐рд░ рдирдП рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЬрд░ рдЯреЙрд╡рд░ рдХреЗ рдкреНрд░реАрдлреИрдм рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред


рдПрдХ рд▓реЗрдЬрд░ рдЯреЙрд╡рд░ рдХрд╛ рдШрдЯрдХред

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреЙрд╡рд░ рдмрдирд╛рдирд╛


рдЪрдпрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реЗ рдЯрд╛рд╡рд░реЛрдВ рдХреЛ рдореИрджрд╛рди рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо TowerType рд╕рдорд╛рди рдПрдХ TowerType GameTileContentType ред рд╣рдо рдореМрдЬреВрджрд╛ рд▓реЗрдЬрд░ рдЯреЙрд╡рд░ рдФрд░ рдореЛрд░реНрдЯрд╛рд░ рдЯреЙрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдмрдирд╛рдПрдВрдЧреЗред

 public enum TowerType { Laser, Mortar } 

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

  public abstract TowerType TowerTypeтВм { get; } 

рдЗрд╕реЗ LaserTower рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдПред

  public override TowerType TowerTypeтВм => TowerType.Laser; 

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

  [SerializeField] Tower[] towerPrefabs = default; public GameTileContent Get (GameTileContentType type) { switch (type) { тАж } Debug.Assert(false, "Unsupported non-tower type: " + type); return null; } public GameTileContent Get (TowerType type) { Debug.Assert((int)type < towerPrefabs.Length, "Unsupported tower type!"); Tower prefab = towerPrefabs[(int)type]; Debug.Assert(type == prefab.TowerTypeтВм, "Tower prefab at wrong index!"); return Get(prefab); } 

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

  public Tower Get (TowerType type) { тАж } T Get<T> (T prefab) where T : GameTileContent { T instance = CreateGameObjectInstance(prefab); instance.OriginFactory = this; return instance; } 

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


рдкреНрд░реАрдлрд╝реИрдм рдЯрд╛рд╡рд░реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреАред

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЙрд╡рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛


рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреЙрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо GameBoard.ToggleTower рддрд╛рдХрд┐ рдЗрд╕реЗ рдЯреЙрд╡рд░ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдФрд░ рдЗрд╕реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ TowerType рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

  public void ToggleTower (GameTile tile, TowerType towerType) { if (tile.Content.Type == GameTileContentType.TowerтВм) { тАж } else if (tile.Content.Type == GameTileContentType.Empty) { tile.Content = contentFactory.Get(towerType); тАж } else if (tile.Content.Type == GameTileContentType.Wall) { tile.Content = contentFactory.Get(towerType); updatingContent.Add(tile.Content); } } 

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

  if (tile.Content.Type == GameTileContentType.TowerтВм) { updatingContent.Remove(tile.Content); if (((Tower)tile.Content).TowerTypeтВм == towerType) { tile.Content = contentFactory.Get(GameTileContentType.Empty); FindPaths(); } else { tile.Content = contentFactory.Get(towerType); updatingContent.Add(tile.Content); } } 

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

  TowerType selectedTowerType; тАж void Update () { тАж if (Input.GetKeyDown(KeyCode.G)) { board.ShowGrid = !board.ShowGrid; } if (Input.GetKeyDown(KeyCode.Alpha1)) { selectedTowerType = TowerType.Laser; } else if (Input.GetKeyDown(KeyCode.Alpha2)) { selectedTowerType = TowerType.Mortar; } тАж } тАж void HandleTouch () { GameTile tile = board.GetTile(TouchRay); if (tile != null) { if (Input.GetKey(KeyCode.LeftShift)) { board.ToggleTower(tile, selectedTowerType); } else { board.ToggleWall(tile); } } } 

рдореЛрд░реНрдЯрд╛рд░ рдЯреЙрд╡рд░


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

 using UnityEngine; public class MortarTower : Tower { [SerializeField, Range(0.5f, 2f)] float shotsPerSecond = 1f; [SerializeField] Transform mortar = default; public override TowerType TowerTypeтВм => TowerType.Mortar; } 

рдЕрдм рдореЛрд░реНрдЯрд╛рд░ рдЯреЙрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реАрдлреИрдм рдмрдирд╛рдПрдВред рдпрд╣ рд▓реЗрдЬрд░ рдЯреЙрд╡рд░ рдХреЗ рдкреНрд░реАрдлреИрдм рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдХреЗ рдФрд░ рдЗрд╕рдХреЗ рдЯреЙрд╡рд░ рдШрдЯрдХ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдЯреЙрд╡рд░ рдФрд░ рд▓реЗрдЬрд░ рдмреАрдо рдХреА рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВред turret рдХреЛ mortar рдирд╛рдо рджреЗрдВ, рдЗрд╕реЗ рдиреАрдЪреЗ рд▓реЗ рдЬрд╛рдПрдВ рддрд╛рдХрд┐ рдпрд╣ рдЖрдзрд╛рд░ рдХреЗ рдКрдкрд░ рдЦрдбрд╝рд╛ рд╣реЛ, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рднреВрд░реЗ рд░рдВрдЧ рдХрд╛ рд░рдВрдЧ рджреЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред рд╣рдо рдореЛрд░реНрдЯрд╛рд░ рдХреЛрд▓рд╛рдЗрдбрд░ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреЛ рдХрд┐ рдореЛрд░реНрдЯрд╛рд░ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рдЖрд░реЛрдкрд┐рдд рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЛрд▓рд╛рдЗрдбрд░ рд╣реИред рдореИрдВрдиреЗ 3.5 рдХреА рдореЛрд░реНрдЯрд╛рд░ рд░реЗрдВрдЬ рдФрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1 рд╢реЙрдЯ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╕реМрдВрдкреАред

рд╕реНрдерд▓

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

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

рдореЛрд░реНрдЯрд╛рд░ рдЯреЙрд╡рд░ рдХрд╛ рдкреНрд░реАрдлреИрдмред

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

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

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

рд╕реНрдерд▓

рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЙрд╡рд░, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп

рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдЧрдгрдирд╛


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

рдХреНрд╖реИрддрд┐рдЬ рд▓рдХреНрд╖реНрдп


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

MortarTower рд▓рд┐рдП рдПрдХ MortarTower рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рд╣рдореЗрд╢рд╛ Launch рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдлрд╛рдпрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВрдЧреЗред рдлрд╛рдпрд░рд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдореЛрд░реНрдЯрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ, рдЬреЛ рдЬрдореАрди рдХреЗ рдареАрдХ рдКрдкрд░ рд╕реНрдерд┐рдд рд╣реИред рд╣рдо рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рд▓рдХреНрд╖реНрдп рддреАрди рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдмрд┐рдВрджреБ рдХреЛ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рдИ рдШрдЯрдХ рдХреЛ рд╢реВрдиреНрдп рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╣рдореЗрд╢рд╛ рдЬрдореАрди рдкрд░ рдирд┐рд╢рд╛рдирд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рддрдм рд╣рдо рдЙрдирдХреЗ рдмреАрдЪ Debug.DrawLine рдХреЙрд▓ рдХрд░рдХреЗ Debug.DrawLine рдкреАрд▓реЗ рд░рдВрдЧ рдХреА рд░реЗрдЦрд╛ Debug.DrawLine рдЕрдВрдХ Debug.DrawLine ред рд▓рд╛рдЗрди рдПрдХ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдореЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рд╣рдо рдПрдХ рдирдИ рд░реЗрдЦрд╛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред

  public override void GameUpdate () { Launch(); } public void Launch () { Vector3 launchPoint = mortar.position; Vector3 targetPoint = new Vector3(launchPoint.x + 3f, 0f, launchPoint.z); Debug.DrawLine(launchPoint, targetPoint, Color.yellow); } 


рд╣рдо рдЯреЙрд╡рд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд▓рдХреНрд╖реНрдп рд░рдЦрддреЗ рд╣реИрдВред

рдЗрд╕ рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдПрдХ рд╕рд╣реА рддреНрд░рд┐рдХреЛрдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕рдХрд╛ рдКрдкрд░реА рдмрд┐рдВрджреБ рдореЛрд░реНрдЯрд╛рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИред рдореЛрд░реНрдЯрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рд╣реИ  рд░реЛрдВ рдЯреА рдПрдХ рдЖрд░ рдЯреА рдмреА m рдПрдХ рдЯреА рдЖрд░ рдореИрдВ x 00 e n d b m a t r i x  ред рдЯреЙрд╡рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдиреАрдЪреЗ рдХрд╛ рдмрд┐рдВрджреБ рд╣реИ  рд░реЛрдВ рдЯреА рдПрдХ рдЖрд░ рдЯреА рдмреА m рдПрдХ рдЯреА рдЖрд░ рдореИрдВ x 0y e n d b m a t r i x  , рдФрд░ рд▓рдХреНрд╖реНрдп рдореЗрдВ рдмрд┐рдВрджреБ рд╣реИ  рд░реЛрдВ рдЯреА рдПрдХ рдЖрд░ рдЯреА рдмреА рдПрдо рдПрдХ рдЯреА рдЖрд░ рдореИрдВ рдПрдХреНрд╕ рдПрдХреНрд╕y e n d b m a t r i x  рдЬрд╣рд╛рдБ рдПрдХреНрд╕ 3 рдХреЗ рдмрд░рд╛рдмрд░, рдФрд░ рдп рдореЛрд░реНрдЯрд╛рд░ рдХреА рдирдХрд╛рд░рд╛рддреНрдордХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд┐рддрд┐ рд╣реИред рд╣рдореЗрдВ рдЗрди рджреЛрдиреЛрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  Vector3 launchPoint = mortar.position; Vector3 targetPoint = new Vector3(launchPoint.x + 3f, 0f, launchPoint.z); float x = 3f; float y = -launchPoint.y; 


рд▓рдХреНрд╖реНрдп рд╕рд╛рдзрдирд╛ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓рдХреНрд╖реНрдп рдЯреЙрд╡рд░ рдХреА рд╕реАрдорд╛ рдореЗрдВ рдХрд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Z рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рдХреНрд╖реНрдп рддреНрд░рд┐рдХреЛрдг рдЕрднреА рднреА рджреЛ-рдЖрдпрд╛рдореА рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдпрд╣ рдмрд╕ рд╡рд╛рдИ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Launch рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд┐рд╕реНрдерд╛рдкрди рд╡реЗрдХреНрдЯрд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдПрдХреНрд╕рдЬреЗрдб рдореЗрдВ рдЪрд╛рд░ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рдХрд╣реЗрдВрдЧреЗ:  рд░реЛрдВ рдЯреА рдПрдХ рдЖрд░ рдЯреА рдмреА m рдПрдХ рдЯреА рдЖрд░ рдореИрдВ x 30 e n d b m a t r i x  ред  рд░реЛрдВ рдЯреА рдПрдХ рдЖрд░ рдЯреА рдмреА m рдПрдХ рдЯреА рдЖрд░ рдореИрдВ x 01 endbmatrix ред  startbmatrix11 endbmatrix рдФрд░  startbmatrix31 endbmatrix ред рдЬрдм рд▓рдХреНрд╖реНрдп рдмрд┐рдВрджреБ рд╢реЙрдЯ рдХреЗ рдмрд┐рдВрджреБ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдСрдлрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ Y рд╕рдордиреНрд╡рдп рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

  public override void GameUpdate () { Launch(new Vector3(3f, 0f, 0f)); Launch(new Vector3(0f, 0f, 1f)); Launch(new Vector3(1f, 0f, 1f)); Launch(new Vector3(3f, 0f, 1f)); } public void Launch (Vector3 offset) { Vector3 launchPoint = mortar.position; Vector3 targetPoint = launchPoint + offset; targetPoint.y = 0f; тАж } 

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

  Vector2 dir; dir.x = targetPoint.x - launchPoint.x; dir.y = targetPoint.z - launchPoint.z; float x = dir.magnitude; float y = -launchPoint.y; dir /= x; Debug.DrawLine(launchPoint, targetPoint, Color.yellow); Debug.DrawLine( new Vector3(launchPoint.x, 0.01f, launchPoint.z), new Vector3( launchPoint.x + dir.x * x, 0.01f, launchPoint.z + dir.y * x ), Color.white ); 


рд╕рдВрд░реЗрдЦрд┐рдд рд▓рдХреНрд╖реНрдп рддреНрд░рд┐рдХреЛрдгред

рд╢реЙрдЯ рдХреЛрдг


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

рд╡рд┐рд╕реНрдерд╛рдкрди рдб рдкреНрд░рдХреНрд╖реЗрдкреНрдп рд▓рдХреНрд╖реНрдп рддреНрд░рд┐рдХреЛрдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЛ рдШрдЯрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд╖реИрддрд┐рдЬ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рд░рд▓ рд╣реИ: рдпрд╣ dx=vxt рдЬрд╣рд╛рдБ рдЯреА - рд╢реЙрдЯ рдХреЗ рдмрд╛рдж рдХрд╛ рд╕рдордпред рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ, рдлрд┐рд░ рдпрд╣ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХреЗ рдХрд╛рд░рдг рдирдХрд╛рд░рд╛рддреНрдордХ рддреНрд╡рд░рдг рдХреЗ рдЕрдзреАрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рд░реВрдк рд╣реИ dy=vytтИТ(gt2)/2 ред

рдСрдлрд╕реЗрдЯ рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ?
рдЧрддрд┐ рд╡ реА рджреВрд░реА рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЕрд╡рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЧрддрд┐ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рддреВ реА рд╣рдореЗрдВ рджреВрд░реА рдорд┐рд▓рддреА рд╣реИ d = v t ред рдЬрдм рддреНрд╡рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдП рдХ , рдЧрддрд┐ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реИред рддреНрд╡рд░рдг рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЧрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХреА рджреВрд░реАред рдХрд┐рд╕реА рднреА рд╕рдордп, рдЧрддрд┐ рд╣реИ v = $ рдкреА ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд░рдВрддрд░ рддреЗрдЬреА рд╣реИ a = - рдЬреА , рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдФрд╕рдд рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзреЗ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдСрдлрд╕реЗрдЯ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕реЗ рдЧреБрдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ d = (^ ^ 2) / 2 рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХреЗ рдХрд╛рд░рдгред

рд╣рдордиреЗ рдЙрд╕реА рдЧрддрд┐ рд╕реЗ рдЧреЛрд▓реЗ рджрд╛рдЧреЗ рдПрд╕ рдЬреЛ рд╢реЙрдЯ рдХреЗ рдХреЛрдг рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ $рдереАрдЯрд╛ (рдереАрдЯрд╛)ред рд╡рд╣ рд╣реИ vx=s cos рдереАрдЯрд╛ рдФрд░ vy=s sin рдереАрдЯрд╛ ред


рд╢реЙрдЯ рдЧрддрд┐ рдХреА рдЧрдгрдирд╛ред

рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдкреНрд░рджрд░реНрд╢рди, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ dx=st cos рдереАрдЯрд╛ рдФрд░ dy=st sin thetaтИТ(gt2)/2 ред

рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрд╕рдХреА рдЙрдбрд╝рд╛рди рдХрд╛ рд╕рдордп рд╣реЛ рдЯреА рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдЯреАрдХ рдореВрд▓реНрдп рд╣реИред рдЪреВрдВрдХрд┐ рдХреНрд╖реИрддрд┐рдЬ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдордп рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ t=dx/vx ред рдЕрдВрдд рдмрд┐рдВрджреБ рдкрд░ dx=x рд╡рд╣ рд╣реИ t=x/(s cos рдереАрдЯрд╛) ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ y=x tan рдереАрдЯрд╛тИТ(gx2)/(2s2 cos2 ata) ред

рд╕рдореАрдХрд░рдг y рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?
y=dy=s(x/(s cos theta)) sin thetaтИТ(g(x/(s cos theta))2)/2=x sin theta/ cos рдереАрдЯрд╛тИТ(gx2)/(2s2 cos2 рдереАрдЯрд╛) рдФрд░  tan рдереАрдЯрд╛= sin рдереАрдЯрд╛/ cos рдереАрдЯрд╛ ред

рдЗрд╕ рд╕рдореАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ  tan рдереАрдЯрд╛=(s2+тИТ sqrts4тИТg(gx2+2ys2)))/(gx) ред
рд╕рдореАрдХрд░рдг to рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?
рдкрд╣рд▓реЗ рд╣рдо рддреНрд░рд┐рдХреЛрдгрдорд┐рддреАрдп рдкрд╣рдЪрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ  sec рдереАрдЯрд╛=1/ cos рдереАрдЯрд╛ рдФрд░ 1+ tan2 рдереАрдЯрд╛= sec2 рдереАрдЯрд╛ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП y=x tan thetaтИТ(gx2)/(2s2)(1+ tan2 theta)=тИТ(gx2)/(2s2) tan2 theta+x tan thetaтИТ(gx2)/(2s2) ред

рдпрд╣ рд░реВрдк рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдФ2+рдмреВ+рд╕реА=0 рдЬрд╣рд╛рдБ u= tan рдереАрдЯрд╛ ред a=тИТ(gx2)/(2s2) ред b=x , рдФрд░ рд╕реА=рдПтИТрд╡рд╛рдИ ред

рд╣рдо рдЗрд╕реЗ рджреНрд╡рд┐рдШрд╛рдд рд╕рдореАрдХрд░рдг рдХреА рдЬрдбрд╝реЛрдВ рдХреЗ рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ u=(тИТb+тИТ sqrt(b2тИТ4ac))/(2a) ред

рдЗрд╕рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрд╛рдж, рд╕рдореАрдХрд░рдг рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рд╕рд░рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ m=s2/x рддреЛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП  tan theta=(тИТmb+тИТm sqrtr)/(2ma) рдЬрд╣рд╛рдБ r=b2тИТ4ac ред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ  tan рдереАрдЯрд╛=(s2+тИТ sqrt(m2r))/(gx) ред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк m2r=(s4/x2)r=s4+2gs2c=s4тИТg2x2тИТ2gys2=s4тИТg(gx2+2ys2) ред

рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдХреЛрдг рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрдЪреНрдЪ рдпрд╛ рдирд┐рдореНрди рд▓рдХреНрд╖реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдХрдо рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рддреЗрдЬ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рдХреЗ рдХрд░реАрдм рд╣реИред рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЪреБрдиреЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред  tan рдереАрдЯрд╛=(s2+ sqrts4тИТg(gx2+2ys2)))/(gx) ред рд╣рдо рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рднреА  cos рдереАрдЯрд╛ рд╕рд╛рде  sin рдереАрдЯрд╛ , рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╢реЙрдЯ рдХреЗ рд╡реЗрдЧ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ  tan рдереАрдЯрд╛ Mathf.Atan рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░реЗрдбрд┐рдпрди рдХреЛрдг рдкрд░ред рдкрд╣рд▓реЗ, рдЪрд▓реЛ 5 рдХреА рдПрдХ рдирд┐рд░рдВрддрд░ рд╢реЙрдЯ рдЧрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

  float x = dir.magnitude; float y = -launchPoint.y; dir /= x; float g = 9.81f; float s = 5f; float s2 = s * s; float r = s2 * s2 - g * (g * x * x + 2f * y * s2); float tanTheta = (s2 + Mathf.Sqrt(r)) / (g * x); float cosTheta = Mathf.Cos(Mathf.Atan(tanTheta)); float sinTheta = cosTheta * tanTheta; 

рдЖрдЗрдП рдЙрдбрд╝рд╛рди рдХреЗ рдкрд╣рд▓реЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реБрдП рджрд╕ рдиреАрд▓реЗ рдЦрдВрдбреЛрдВ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред

  float sinTheta = cosTheta * tanTheta; Vector3 prev = launchPoint, next; for (int i = 1; i <= 10; i++) { float t = i / 10f; float dx = s * cosTheta * t; float dy = s * sinTheta * t - 0.5f * g * t * t; next = launchPoint + new Vector3(dir.x * dx, dy, dir.y * dx); Debug.DrawLine(prev, next, Color.blue); prev = next; } 


рдкрд░рдмреЛрд▓рд╛ рдЙрдбрд╝рд╛рди рдХреЗ рд░рд╛рд╕реНрддреЗ рдПрдХ рд╕реЗрдХрдВрдб рддрдХ рдЪрд▓рддреЗ рд╣реИрдВред

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

рд╢реЙрдЯ рдХреА рдЧрддрд┐


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

  float s = 4f; 


рд╢реЙрдЯ рд╕реНрдкреАрдб 4 рд╕реЗ рдХрдо рд╣реЛ рдЧрдИред

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

  float r = s2 * s2 - g * (g * x * x + 2f * y * s2); Debug.Assert(r >= 0f, "Launch velocity insufficient for range!"); 

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

рдЕрдзрд┐рдХрддрдо рд╕реАрдорд╛ рдкрд░ r=0 , рдпрд╛рдиреА рдХреЗ рд▓рд┐рдП  tan рдереАрдЯрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЙрдкрд╛рдп рд╣реИ рдЬреЛ рдирд┐рдореНрди рдкрде рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рд╢реЙрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХ рдЧрддрд┐ рдЬрд╛рдирддреЗ рд╣реИрдВред s = \ sqrt {(g (y + \ sqrt {(x ^ 2 + y ^ 2)})) 2 ред

рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреЛ s рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?
рддрдп рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ s4тИТg(gx2+2ys2)=s4тИТ2gys2тИТg2x2=0 рдХреЗ рд▓рд┐рдП рдПрд╕ ред

рдпрд╣ рд░реВрдк рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдФ2+рдмреВ+рд╕реА=0 рдЬрд╣рд╛рдБ u=s2 ред a=1 ред b=тИТ2gy рдФрд░ c=тИТg2x2 ред

рдЖрдк рджреНрд╡рд┐рдШрд╛рдд рд╕рдореАрдХрд░рдг рдХреА рдЬрдбрд╝реЛрдВ рдХреЗ рд╕рд░рд▓реАрдХреГрдд рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ u=(тИТb+тИТ sqrt(b2тИТ4c))/2 ред

рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрд╛рдж рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ s2=(2gy+тИТ sqrt(4g2y2+4g2x2))/2=gy+тИТg sqrt(x2+y2) ред

рд╣рдореЗрдВ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрддреЗ рд╣реИрдВ s2=g(y+ sqrt(x2+y2)) ред

рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЧрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рдореЛрд░реНрдЯрд░реНрд╕ рдЬрд╛рдЧреЗрдВ (рдЬрд╛рдЧреЗрдВ) рдпрд╛ рдЬрдм рд╣рдо рдкреНрд▓реЗ рдореЛрдб рдореЗрдВ рдЗрд╕рдХреА рд░реЗрдВрдЬ рдмрджрд▓реЗрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрдХ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ Awake рдФрд░ OnValidate рдореЗрдВ рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред

  float launchSpeed; void Awake () { OnValidate(); } void OnValidate () { float x = targetingRange; float y = -mortar.position.y; launchSpeed = Mathf.Sqrt(9.81f * (y + Mathf.Sqrt(x * x + y * y))); } 

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

  float x = targetingRange + 0.25001f; 

рдЕрдЧрд▓рд╛, Launch рдореЗрдВ рдПрдХ рд╢реЙрдЯ рдХреА рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдореАрдХрд░рдг рд▓рд╛рдЧреВ рдХрд░реЗрдВред

  float s = launchSpeed; 


рдЧрдгрдирд╛ рдХреА рдЧрдИ рдЧрддрд┐ рдХреЛ рд▓рдХреНрд╖реНрдп рд╕реАрдорд╛ 3.5 рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рд╢реВрдЯрд┐рдВрдЧ


рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреА рд╕рд╣реА рдЧрдгрдирд╛ рд╣реЛрдиреЗ рд╕реЗ, рдЖрдк рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░реАрдХреНрд╖рдг рд▓рдХреНрд╖реНрдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдЖрдкрдХреЛ Launch рдмрд┐рдВрджреБ рдХреЛ рд▓рдХреНрд╖реНрдп рдХреЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  public void Launch (TargetPoint target) { Vector3 launchPoint = mortar.position; Vector3 targetPoint = target.Position; targetPoint.y = 0f; тАж } 

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

  float launchProgress; тАж public override void GameUpdate () { launchProgress += shotsPerSecond * Time.deltaTime; while (launchProgress >= 1f) { if (AcquireTarget(out TargetPoint target)) { Launch(target); launchProgress -= 1f; } else { launchProgress = 0.999f; } } } 

рд╣рдо рд╢реЙрдЯреНрд╕ рдХреЗ рдмреАрдЪ рд▓рдХреНрд╖реНрдп рдХреЛ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╢реЙрдЯреНрд╕ рдХреЗ рджреМрд░рд╛рди рдореЛрд░реНрдЯрд╛рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдШреБрдорд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЖрдк Quaternion.LookRotation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдореЛрд░реНрдЯрд╛рд░ рдХреЛ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЙрдЯ рдХреА рдХреНрд╖реИрддрд┐рдЬ рджрд┐рд╢рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рднреА рд╕рд╛рде рдЪрд╛рд╣рд┐рдП  tan рдереАрдЯрд╛ рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдШрдЯрдХ Y рдХреЗ рд▓рд┐рдП рд╢реЙрдЯ рдХреЛрдг рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреНрд╖реИрддрд┐рдЬ рджрд┐рд╢рд╛ рдореЗрдВ 1 рдХреА рд▓рдВрдмрд╛рдИ рд╣реИ, рдЕрд░реНрдерд╛рддред  tan рдереАрдЯрд╛= sin рдереАрдЯрд╛ ред


рд▓реБрдХ рдХреЗ рдЯрд░реНрди рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЕрдкрдШрдЯрдиред

  float tanTheta = (s2 + Mathf.Sqrt(r)) / (g * x); float cosTheta = Mathf.Cos(Mathf.Atan(tanTheta)); float sinTheta = cosTheta * tanTheta; mortar.localRotation = Quaternion.LookRotation(new Vector3(dir.x, tanTheta, dir.y)); 

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

  Vector3 prev = launchPoint, next; for (int i = 1; i <= 10; i++) { тАж Debug.DrawLine(prev, next, Color.blue, 1f); prev = next; } Debug.DrawLine(launchPoint, targetPoint, Color.yellow, 1f); Debug.DrawLine( тАж Color.white, 1f ); 


рдЙрджреНрджреЗрд╢реНрдпред

рдЧреЛрд▓рд╛рдмрд╛рд░реВрдж


рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛрд▓реЗ рдХреИрд╕реЗ рджрд╛рдЧреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЖрдЧреЗ рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╢реВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпреБрджреНрдз рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛


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

 using UnityEngine; public abstract class WarEntity : MonoBehaviour { WarFactory originFactory; public WarFactory OriginFactory { get => originFactory; set { Debug.Assert(originFactory == null, "Redefined origin factory!"); originFactory = value; } } public void Recycle () { originFactory.Reclaim(this); } } 

рдлрд┐рд░ ShellрдЧреЛрд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдХрд╛рдИ рдмрдирд╛рдПрдВ ред

 using UnityEngine; public class Shell : WarEntity { } 

рдлрд┐рд░ WarFactoryрд╡рд╣ рдмрдирд╛рдПрдВ рдЬреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЧрдЯрд░ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдмрдирд╛рдПрдЧрд╛ред

 using UnityEngine; [CreateAssetMenu] public class WarFactory : GameObjectFactory { [SerializeField] Shell shellPrefab = default; public Shell ShellтВм => Get(shellPrefab); T Get<T> (T prefab) where T : WarEntity { T instance = CreateGameObjectInstance(prefab); instance.OriginFactory = this; return instance; } public void Reclaim (WarEntity entity) { Debug.Assert(entity.OriginFactory == this, "Wrong factory reclaimed!"); Destroy(entity.gameObject); } } 

рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдлрд╝реИрдм рдмрдирд╛рдПрдВред рдореИрдВрдиреЗ 0.25 рдФрд░ рдЕрдВрдзреЗрд░реЗ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ Shellред рдлрд┐рд░ рдлреИрдХреНрдЯрд░реА рдПрд╕реЗрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓ рдХреЗ рдкреНрд░реАрдлреИрдм рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред


рдпреБрджреНрдз рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ред

рдЦреЗрд▓ рд╡реНрдпрд╡рд╣рд╛рд░


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

 using UnityEngine; public abstract class GameBehavior : MonoBehaviour { public virtual bool GameUpdate () => true; } 

рдЕрдм рдкреБрдирд░реНрд░рдЪрдирд╛ рдкреНрд░рджрд░реНрд╢рди EnemyCollection, рдореЗрдВ рдпрд╣ рдореЛрдбрд╝ GameBehaviorCollectionред

 public class GameBehaviorCollection { List<GameBehavior> behaviors = new List<GameBehavior>(); public void Add (GameBehavior behavior) { behaviors.Add(behavior); } public void GameUpdate () { for (int i = 0; i < behaviors.Count; i++) { if (!behaviors[i].GameUpdate()) { int lastIndex = behaviors.Count - 1; behaviors[i] = behaviors[lastIndex]; behaviors.RemoveAt(lastIndex); i -= 1; } } } } 

рдЪрд▓реЛ рдЗрд╕рдХрд╛ WarEntityрд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ GameBehavior, рдирд╣реАрдВ MonoBehaviorред

 public abstract class WarEntity : GameBehavior { тАж } 

рд╣рдо EnemyрдЗрд╕ рдмрд╛рд░ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд░реЗрдВрдЧреЗ GameUpdateред

 public class Enemy : GameBehavior { тАж public override bool GameUpdate () { тАж } тАж } 

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

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

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

  [SerializeField] WarFactory warFactory = default; тАж static Game instance; public static Shell SpawnShell () { Shell shell = instance.warFactory.ShellтВм; instance.nonEnemies.Add(shell); return shell; } void OnEnable () { instance = this; } 


рдпреБрджреНрдз рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ред

рдХреНрдпрд╛ рд╕реНрдЯреИрдЯрд┐рдХ рдлреЗрд╢рд┐рдпрд▓ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрд╛рдп рд╣реИ?
, , .

рд╣рдо рдПрдХ рдЧреЛрд▓реА рдорд╛рд░рддреЗ рд╣реИрдВ


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

  Vector3 launchPoint, targetPoint, launchVelocity; public void Initialize ( Vector3 launchPoint, Vector3 targetPoint, Vector3 launchVelocity ) { this.launchPoint = launchPoint; this.targetPoint = targetPoint; this.launchVelocity = launchVelocity; } 

рдЕрдм рд╣рдо рдПрдХ рд╢реЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ MortarTower.LaunchрдФрд░ рдЗрд╕реЗ рд╕рдбрд╝рдХ рдкрд░ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ ред

  mortar.localRotation = Quaternion.LookRotation(new Vector3(dir.x, tanTheta, dir.y)); Game.SpawnShell().Initialize( launchPoint, targetPoint, new Vector3(s * cosTheta * dir.x, s * sinTheta, s * cosTheta * dir.y) ); 

рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдЧрддрд┐


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

  float age; тАж public override bool GameUpdate () { age += Time.deltaTime; Vector3 p = launchPoint + launchVelocity * age; py -= 0.5f * 9.81f * age * age; transform.localPosition = p; return true; } 


рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓ рд╢реВрдЯрд┐рдВрдЧред

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

  public override bool GameUpdate () { тАж Vector3 d = launchVelocity; dy -= 9.81f * age; transform.localRotation = Quaternion.LookRotation(d); return true; } 


рдЧреЛрд▓реЗ рдореБрдбрд╝ рд░рд╣реЗ рд╣реИрдВред

рд╣рдо рдЦреЗрд▓ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ


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

  public void Launch (TargetPoint target) { тАж Game.SpawnShell().Initialize( launchPoint, targetPoint, new Vector3(s * cosTheta * dir.x, s * sinTheta, s * cosTheta * dir.y) ); } 

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

  public override bool GameUpdate () { age += Time.deltaTime; Vector3 p = launchPoint + launchVelocity * age; py -= 0.5f * 9.81f * age * age; if (py <= 0f) { OriginFactory.Reclaim(this); return false; } transform.localPosition = p; тАж } 

рд╡рд┐рд╕реНрдлреЛрдЯ


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

  [SerializeField, Range(0.5f, 3f)] float shellBlastRadius = 1f; [SerializeField, Range(1f, 100f)] float shellDamage = 10f; 


рд╡рд┐рд╕реНрдлреЛрдЯ рддреНрд░рд┐рдЬреНрдпрд╛ рдФрд░ 15 рдЧреЛрд▓реЗ рдХреЗ 1.5 рдХреНрд╖рддрд┐ред

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

  float age, blastRadius, damage; public void Initialize ( Vector3 launchPoint, Vector3 targetPoint, Vector3 launchVelocity, float blastRadius, float damage ) { тАж this.blastRadius = blastRadius; this.damage = damage; } 

MortarTower рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдкреНрд░рдХреНрд╖реЗрдкреНрдп рдХреЛ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

  Game.SpawnShell().Initialize( launchPoint, targetPoint, new Vector3(s * cosTheta * dir.x, s * sinTheta, s * cosTheta * dir.y), shellBlastRadius, shellDamage ); 

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

  const int enemyLayerMask = 1 << 9; static Collider[] buffer = new Collider[100]; public static int BufferedCount { get; private set; } public static bool FillBuffer (Vector3 position, float range) { Vector3 top = position; top.y += 3f; BufferedCount = Physics.OverlapCapsuleNonAlloc( position, top, range, buffer, enemyLayerMask ); return BufferedCount > 0; } public static TargetPoint GetBuffered (int index) { var target = buffer[index].GetComponent<TargetPoint>(); Debug.Assert(target != null, "Targeted non-enemy!", buffer[0]); return target; } 

рдЕрдм рд╣рдо рдЕрдзрд┐рдХрддрдо рдмрдлрд░ рдЖрдХрд╛рд░ рддрдХ рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╕рднреА рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╕реНрдлреЛрдЯ рдкрд░ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ Shellред

  if (py <= 0f) { TargetPoint.FillBuffer(targetPoint, blastRadius); for (int i = 0; i < TargetPoint.BufferedCount; i++) { TargetPoint.GetBuffered(i).EnemyтВм.ApplyDamage(damage); } OriginFactory.Reclaim(this); return false; } 


рдЧреЛрд▓реЗ рдХрд╛ рд╡рд┐рд╕реНрдлреЛрдЯред

рдЖрдк TargetPointрдмрдлрд░ рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ ред

  public static TargetPoint RandomBuffered => GetBuffered(Random.Range(0, BufferedCount)); 

рдпрд╣ рд╣рдореЗрдВ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ Tower, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдк рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд▓рдХреНрд╖реНрдп рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ TargetPointред

 protected bool AcquireTarget (out TargetPoint target) { if (TargetPoint.FillBuffer(transform.localPosition, targetingRange)) { target = TargetPoint.RandomBuffered; return true; } target = null; return false; } 

рд╡рд┐рд╕реНрдлреЛрдЯ


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

 using UnityEngine; public class Explosion : WarEntity { [SerializeField, Range(0f, 1f)] float duration = 0.5f; float age; public void Initialize (Vector3 position, float blastRadius, float damage) { TargetPoint.FillBuffer(position, blastRadius); for (int i = 0; i < TargetPoint.BufferedCount; i++) { TargetPoint.GetBuffered(i).Enemy.ApplyDamage(damage); } transform.localPosition = position; transform.localScale = Vector3.one * (2f * blastRadius); } public override bool GameUpdate () { age += Time.deltaTime; if (age >= duration) { OriginFactory.Reclaim(this); return false; } return true; } } 

рдХреЛ рдПрдХ рд╡рд┐рд╕реНрдлреЛрдЯ рдЬреЛрдбрд╝реЗрдВ WarFactoryред

  [SerializeField] Explosion explosionPrefab = default; [SerializeField] Shell shellPrefab = default; public Explosion ExplosionтВм => Get(explosionPrefab); public Shell Shell => Get(shellPrefab); 


рдПрдХ рд╡рд┐рд╕реНрдлреЛрдЯ рдХреЗ рд╕рд╛рде рдпреБрджреНрдз рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ред рдореБрдЦреМрдЯрд╛ рд╡рд┐рдзрд┐ рдореЗрдВ

рднреА рдЬреЛрдбрд╝реЗрдВ Gameред

  public static Explosion SpawnExplosion () { Explosion explosion = instance.warFactory.ExplosionтВм; instance.nonEnemies.Add(explosion); return explosion; } 

рдЕрдм рдпрд╣ Shellрд▓рдХреНрд╖реНрдп рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рд╡рд┐рд╕реНрдлреЛрдЯ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╕реНрдлреЛрдЯ рд╕реЗ рд╣реА рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛ред

  if (py <= 0f) { Game.SpawnExplosion().Initialize(targetPoint, blastRadius, damage); OriginFactory.Reclaim(this); return false; } 


рдЧреЛрд▓реЗ рдХрд╛ рдзрдорд╛рдХрд╛ред

рдЪрд┐рдХрдиреА рд╡рд┐рд╕реНрдлреЛрдЯ


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

  [SerializeField] AnimationCurve opacityCurve = default; [SerializeField] AnimationCurve scaleCurve = default; 

рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА, рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ 0.3 рдХреЗ рдФрд╕рдд рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧреАред рдкреИрдорд╛рдиреЗ 0.7 рдкрд░ рд╢реБрд░реВ рд╣реЛрдЧрд╛, рддреЗрдЬреА рд╕реЗ рдмрдврд╝реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рдзреАрд░реЗ-рдзреАрд░реЗ 1 рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ред


рдзрдорд╛рдХрд╛ рдШрдЯрддрд╛ рд╣реИред

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

  static int colorPropertyID = Shader.PropertyToID("_Color"); static MaterialPropertyBlock propertyBlock; тАж float scale; MeshRenderer meshRenderer; void Awake () { meshRenderer = GetComponent<MeshRenderer>(); Debug.Assert(meshRenderer != null, "Explosion without renderer!"); } public void Initialize (Vector3 position, float blastRadius, float damage) { тАж transform.localPosition = position; scale = 2f * blastRadius; } public override bool GameUpdate () { тАж if (propertyBlock == null) { propertyBlock = new MaterialPropertyBlock(); } float t = age / duration; Color c = Color.clear; ca = opacityCurve.Evaluate(t); propertyBlock.SetColor(colorPropertyID, c); meshRenderer.SetPropertyBlock(propertyBlock); transform.localScale = Vector3.one * (scale * scaleCurve.Evaluate(t)); return true; } 


рдПрдирд┐рдореЗрдЯреЗрдб рд╡рд┐рд╕реНрдлреЛрдЯред

рдЯреНрд░реЗрд╕рд░ рдХреЗ рдЧреЛрд▓реЗ


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

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

  public void Initialize ( Vector3 position, float blastRadius, float damage = 0f ) { if (damage > 0f) { TargetPoint.FillBuffer(position, blastRadius); for (int i = 0; i < TargetPoint.BufferedCount; i++) { TargetPoint.GetBuffered(i).Enemy.ApplyDamage(damage); } } transform.localPosition = position; radius = 2f * blastRadius; } 

рд╣рдо Shell.GameUpdateрдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЕрдВрдд рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрдлреЛрдЯ рдХрд░реЗрдВрдЧреЗ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 0.1, рдЙрдиреНрд╣реЗрдВ рдЯреНрд░реЗрд╕рд░ рдХреЗ рдЧреЛрд▓реЗ рдореЗрдВ рдмрджрд▓рдирд╛ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╡рд┐рд╕реНрдлреЛрдЯ рдлреНрд░реЗрдо рджреНрд╡рд╛рд░рд╛ рдлреНрд░реЗрдо рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рдд, рд╡реЗ рдлреНрд░реЗрдо рджрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред

  public override bool GameUpdate () { тАж Game.SpawnExplosion().Initialize(p, 0.1f); return true; } 

рдЫрд╡рд┐

рдкреНрд░рдХреНрд╖реЗрдкреНрдп рд▓рдХреНрд╖рдгред

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА
рдкреАрдбреАрдПрдл рдЖрд▓реЗрдЦ

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


All Articles