рдирдХреНрд╢рд╛
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдирдпрд╛
рдЬреЙрдм рд╕рд┐рд╕реНрдЯрдо рдХреНрдпрд╛
рд╣реИ , рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛ рд╕реЗ рднрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкрд░рд┐рдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕рдордп рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдБ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЪреВрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореВрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдкрде-рдЦреЛрдЬ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред
рдПрдХрддрд╛ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдЪреНрдЫрд╛
NavMesh рдкрд╛рдердлрд╛рдЗрдВрдбрд░ рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ 2D рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╣реА
рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдареАрдХ рд╣реИ, рдФрд░ рд╣рдо рди рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдмрдирд╛рдП рдЧрдП рдирдХреНрд╢реЗ рдкрд░ рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╣реБрдд рд╣реА рдирдХреНрд╢реЗ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЙрд╕ рдкрд░ рдХреБрдЫ рдмрджрд▓ рдЬрд╛рдП, рд╕рд┐рд╕реНрдЯрдо рдПрдХ рдирдпрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рдПрдЧрд╛, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдо рдЗрд╕ рд╕рднреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рдирдИ рдкреНрд░рдгрд╛рд▓реА, рддрд╛рдХрд┐ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рд▓реЛрдб рди рд╣реЛред
рд╕рд┐рд╕реНрдЯрдо рдСрдкрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдг рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдЧреНрд░рд┐рдб рдирдХреНрд╢реЗ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдмреЙрдЯ рдФрд░ рдПрдХ рдмрд╛рдзрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдирдХреНрд╢реЗ рдХреЗ рдХрд┐рд╕реА рднреА рдЧреБрдг рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рдЙрд╕рдХрд╛ рдЖрдХрд╛рд░ рдпрд╛ рд╕реНрдерд┐рддрд┐, рдЧреНрд░рд┐рдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд┐рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг
рд╕реНрдкреНрд░рд╛рдЗрдЯрд░реЗрдВрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЗрд╕ рдШрдЯрдХ рдореЗрдВ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ
рд╕реАрдорд╛ рдЧреБрдг рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдирд╣реАрдВ рд░реБрдХреЗ рдФрд░ рддреБрд░рдВрдд рд╡реНрдпрд╛рдкрд╛рд░ рдореЗрдВ рдЙрддрд░ рдЧрдПред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдкрд╣рд▓рд╛ рд╣реИ
рдмрд╛рдзрд╛ рдмрд╛рдзрд╛ рд▓рд┐рдкрд┐ред
рдмрд╛рдзрд╛public class Obstacle : MonoBehaviour { }
рдмрд╛рдзрд╛ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдирдХреНрд╢реЗ рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдпрд╛ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк
рдореИрдк рдореИрдк рдХреНрд▓рд╛рд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдЧреНрд░рд┐рдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕реЗ
рдмрд╛рдзрд╛ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { }
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЧреНрд░рд┐рдб рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдк рдХреНрд▓рд╛рд╕ рдореИрдк рдкрд░ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рднреА рдЯреНрд░реИрдХ рдХрд░реЗрдЧрд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЪрд░ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде
рдмрд╛рдзрд╛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рднрд░реЗрдВред
рдмрд╛рдзрд╛ public class Obstacle : MonoBehaviour { public new SpriteRenderer renderer { get; private set;} private Vector2 tempSize; private Vector2 tempPos; protected virtual void Awake() { this.renderer = GetComponent<SpriteRenderer>(); this.tempSize = this.size; this.tempPos = this.position; } public virtual bool CheckChanges() { Vector2 newSize = this.size; float diff = (newSize - this.tempSize).sqrMagnitude; if (diff > 0.01f) { this.tempSize = newSize; return true; } Vector2 newPos = this.position; diff = (newPos - this.tempPos).sqrMagnitude; if (diff > 0.01f) { this.tempPos = newPos; return true; } return false; } public Vector2 size { get { return this.renderer.bounds.size;} } public Vector2 position { get { return this.transform.position;} } }
рдпрд╣рд╛рдВ,
рд░реЗрдВрдбрд░рд░ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ
SpriteRenderer рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реЛрдЧрд╛, рдФрд░
рдЯреЗрдореНрдкреЗрд╕рд╛рдЗрдЬ рдФрд░
рдЯреЗрдореНрдкрдкреЛрд╕ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрд╡рдХ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд░ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░
рдЪреЗрдХрдЪреЗрдВрдЬ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдЧреА рдФрд░
рдмреВрд▓рд┐рдпрди рдкрд░рд┐рдгрд╛рдо
рд▓реМрдЯрд╛рдПрдЧреА ред
рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо
рдмрд╛рдзрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рдпрдВ
рдорд╛рдирдЪрд┐рддреНрд░ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЗрд╕реЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рднреА рднрд░рддреЗ рд╣реИрдВред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { [Range(0.1f, 1f)] public float nodeSize = 0.5f; public Vector2 offset = new Vector2(0.5f, 0.5f); }
рдиреЛрдбрд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдЪрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛, рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ 0.1 рд╕реЗ 1 рддрдХ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЧреНрд░рд┐рдб рдкрд░ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдмрд╣реБрдд рдЫреЛрдЯреА рди рд╣реЛрдВ, рдмрд▓реНрдХрд┐ рдмрд╣реБрдд рдмрдбрд╝реА рднреА рд╣реЛрдВред
рдСрдлрд╕реЗрдЯ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд░рд┐рдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЗрдВрдбреЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рдЧреНрд░рд┐рдб рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рди рдмрдиреЗред
рдЪреВрдВрдХрд┐ рдЕрдм рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рджреЛ рдирдП рдЪрд░ рд╣реИрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рднреА рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЪрд░ рдЬреЛрдбрд╝реЗрдВ рдФрд░
рдорд╛рдирдЪрд┐рддреНрд░ рд╡рд░реНрдЧ рдореЗрдВ
CheckChanges рд╡рд┐рдзрд┐ рдХреЛ
рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░реЗрдВ ред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { [Range(0.1f, 1f)] public float nodeSize = 0.5f; public Vector2 offset = new Vector2(0.5f, 0.5f); private float tempNodeSize; private Vector2 tempOffset; protected override void Awake() { base.Awake(); this.tempNodeSize = this.nodeSize; this.tempOffset = this.offset; } public override bool CheckChanges() { float diff = Mathf.Abs(this.tempNodeSize - this.nodeSize); if (diff > 0.01f) { this.tempNodeSize = this.nodeSize; return true; } diff = (this.tempOffset - this.offset).sqrMagnitude; if (diff > 0.01f) { this.tempOffset = this.offset; return true; } return base.CheckChanges(); } }
рд╣реЛ рдЧрдпрд╛ред рдЕрдм рдЖрдк рдордВрдЪ рдкрд░ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ
рдореИрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рдПрдХ рдмрд╛рдзрд╛ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗ - рдордВрдЪ рдкрд░ рдПрдХ рд╕рд░рд▓ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕ рдкрд░
рдмрд╛рдзрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлреЗрдВрдХ рджреЗрдВред

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдордВрдЪ рдкрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВред
рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдирдХреНрд╢реЗ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ
рдЕрджреНрдпрддрди рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣рдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { private bool requireRebuild; private void Update() { UpdateChanges(); } private void UpdateChanges() { if (this.requireRebuild) { print(тАЬ , !тАЭ); this.requireRebuild = false; } else { this.requireRebuild = CheckChanges(); } } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░,
рдЕрдкрдбреЗрдЯрдЪреЗрдВрдЬ рд╡рд┐рдзрд┐ рдореЗрдВ
, рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗрд╡рд▓ рдЕрдм рддрдХ рдХреЗ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдЧрд╛ред рддреБрдо рднреА рдЕрдм рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдХреНрд╢реЗ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдпрд╛
рдСрдлрд╕реЗрдЯ рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдЕрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдирдХреНрд╢реЗ рдкрд░ рд╕реНрд╡рдпрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдзрд╛ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдбрд╛рд▓ рджреЗрдВрдЧреЗ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ
рдЕрджреНрдпрддрди рдкрджреНрдзрддрд┐ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ред
рдорд╛рдирдЪрд┐рддреНрд░ рдХрдХреНрд╖рд╛ рдореЗрдВ,
рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдмрд╛рдзрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдмрдирд╛рдПрдВред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { private static Map ObjInstance; private List<Obstacle> obstacles = new List<Obstacle>(); public static bool RegisterObstacle(Obstacle obstacle) { if (obstacle == Instance) return false; else if (Instance.obstacles.Contains(obstacle) == false) { Instance.obstacles.Add(obstacle); Instance.requireRebuild = true; return true; } return false; } public static bool UnregisterObstacle(Obstacle obstacle) { if (Instance.obstacles.Remove(obstacle)) { Instance.requireRebuild = true; return true; } return false; } public static Map Instance { get { if (ObjInstance == null) ObjInstance = FindObjectOfType<Map>(); return ObjInstance; } } }
рд╕реНрдереИрддрд┐рдХ
рд░рдЬрд┐рд╕реНрдЯрд░рдСрдмреНрд╕реНрдЯрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдирдХреНрд╢реЗ рдкрд░ рдПрдХ рдирдпрд╛
рдмрд╛рдзрд╛ рдмрд╛рдзрд╛ рджрд░реНрдЬ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реНрд╡рдпрдВ рднреА
рдмрд╛рдзрд╛ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдХрд╛рд░реНрдб рдХреЛ рд╕реНрд╡рдпрдВ рдПрдХ рдмрд╛рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╕реНрдерд┐рд░
UnregisterObstructionle рд╡рд┐рдзрд┐, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдирдХреНрд╢реЗ рд╕реЗ рдмрд╛рдзрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рджреЗрддреА рд╣реИ рдЬрдм рд╣рдо рдЗрд╕реЗ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рдПрдХ рдмрд╛рдзрд╛ рдЬреЛрдбрд╝рддреЗ рдпрд╛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрд╡рдпрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж,
рд░реАрд░рдмрд┐рд▓реНрдб рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ
рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ
рдореИрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рдЗрдВрд╕реНрдЯреИрдВрд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдмрдирд╛рдИ, рдЬреЛ
рдореИрдк рдХреЗ рдЗрд╕ рдмрд╣реБрдд рд╣реА рдЙрджрд╛рд╣рд░рдг рдкрд░ рдореБрдЭреЗ
рд▓реМрдЯрд╛рдПрдЧреА ред
рдЕрдм, рд╣рдо
рдмрд╛рдзрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдирдХреНрд╢реЗ рдкрд░ рдПрдХ рдмрд╛рдзрд╛ рджрд░реНрдЬ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдХреБрдЫ
рдСрдирдПрдиреЗрдмрд▓ рдФрд░
рдСрдирдбреЗрд╕реЗрдмрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред
рдмрд╛рдзрд╛ public class Obstacle : MonoBehaviour { protected virtual void OnEnable() { Map.RegisterObstacle(this); } protected virtual void OnDisable() { Map.UnregisterObstacle(this); } }
рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдЦреЗрд▓рддреЗ рд╕рдордп рдПрдХ рдирдИ рдмрд╛рдзрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ
рдСрдирдПрдиреЗрдмрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ рдПрдХ рдирдпрд╛ рдЧреНрд░рд┐рдб
рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдирд╖реНрдЯ рдпрд╛ рдЕрдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░
рдСрдирдбрд┐рдЬреЗрдмрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рдирдХреНрд╢реЗ рд╕реЗ рдЦреБрдж рдХреЛ рд╣рдЯрд╛ рджреЗрдВред
рдпрд╣ рдХреЗрд╡рд▓ рдУрд╡рд░рд▓реЛрдбреЗрдб
рдЪреЗрдХрдЪреЗрдВрдЬ рд╡рд┐рдзрд┐ рдореЗрдВ
рдореИрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { public override bool CheckChanges() { float diff = Mathf.Abs(this.tempNodeSize - this.nodeSize); if (diff > 0.01f) { this.tempNodeSize = this.nodeSize; return true; } diff = (this.tempOffset - this.offset).sqrMagnitude; if (diff > 0.01f) { this.tempOffset = this.offset; return true; } foreach(Obstacle obstacle in this.obstacles) { if (obstacle.CheckChanges()) return true; } return base.CheckChanges(); } }
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирдХреНрд╢рд╛ рд╣реИ, рдмрд╛рдзрд╛рдПрдВ - рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЧреНрд░рд┐рдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдЕрдм рдЖрдк рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬ рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЧреНрд░рд┐рдб рдирд┐рд░реНрдорд╛рдг
рдЧреНрд░рд┐рдб, рдЕрдкрдиреЗ рд╕рд░рд▓рддрдо рд░реВрдк рдореЗрдВ, рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рд╣реИред рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рдЙрд╕ рдкрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛, рдХреБрдЫ рдЧрдгрдирд╛рдУрдВ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдЕрдВрдХ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдпрд╣ рд╣рдорд╛рд░рд╛ рдЧреНрд░рд┐рдб рд╣реИред
рдПрдХ рдЧреНрд░рд┐рдб рдкрд░ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдореИрдВ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ, рдЙрдирдХреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЦреЛрдЬ рд╡рд┐рдХрд▓реНрдк
A * рд▓реЗ рд▓реВрдВрдЧрд╛ред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЧреНрд░рд┐рдб рдХреЗ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реНрдерд┐рддрд┐, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдзреИрд░реНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдзреИрд░реНрдп рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЧреНрд░рд┐рдб рдкрд░ рдмрд┐рдВрджреБ рдХреЗ рдЖрджреЗрд╢ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдпреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдмрд┐рдВрджреБ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИрдВред рдиреАрдЪреЗ рджреА рдЧрдИ рдЫрд╡рд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреНрд░рд┐рдб рдХреЛ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдЕрдВрддрд░ рдХреЛ рджрд┐рдЦрд╛рддреА рд╣реИред
рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреНрдпреЛрдВ?рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХрддрд╛ рдореЗрдВ, рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг
рдлреНрд▓реЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╣реА рдЧрд▓рдд рд╣реИ рдФрд░ рдПрдХ рднрд┐рдиреНрдирд╛рддреНрдордХ рдпрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдкрде рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдПрдХ рд╕реНрдкрд╖реНрдЯ
рдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ рдЬреЛ рд╣рдореЗрд╢рд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдВрдЧреЗ рдФрд░ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдкрдбрд╝реЛрд╕реА рдмрд┐рдВрджреБрдУрдВ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдмрд┐рдВрджреБ рд╡рд╕реНрддреБ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╕рд░рд▓
рдиреЛрдб рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдЧреАред
рдиреЛрдб public struct Node { public int id; public Vector2 position; public Vector2Int coords; }
рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ
рд╡реЗрдХреНрдЯрд░ 2 рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреА
рд╕реНрдерд┐рддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ рдЗрд╕ рдЪрд░ рдХреЗ рд╕рд╛рде рд╣рдо рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ
рдЦреАрдВрдЪреЗрдВрдЧреЗ ред
рд╡реЗрдХреНрдЯрд░ 2 рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордиреНрд╡рдпрдХ
рдЪрд░ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИред рдореИрдк рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░
рдЖрдИрдбреА рдЪрд░, рдЗрд╕рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЦрд╛рддрд╛ рд╕рдВрдЦреНрдпрд╛, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЧреНрд░рд┐рдб рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдВрджреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред
рдмрд┐рдВрджреБ рдХреА рдзреИрд░реНрдп рдХреЛ рдЗрд╕рдХреА
рдмреВрд▓рд┐рдпрди рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ
рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛
рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреА
рд╕рдВрдпреЛрдЬрдХрддрд╛ рдХреЛ рдПрдХ
рдЗрдВрдЯ рдирдВрдмрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╕рд░рд▓
рдПрдиреЛрдбреЛрдбрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ: 0 рдПрдХ
рдирд┐рд╖реНрдХреНрд░рд┐рдп рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╣реИ, рдФрд░ 1 рдкрд╛рд╕ рд╣реЛрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
NodeType рдФрд░ Node public enum NodeType { NonWalkable = 0, Walkable = 1 } public struct Node { public int id; public Vector2 position; public Vector2Int coords; private int nodeType; public bool isWalkable { get { return this.nodeType == (int)NodeType.Walkable;} } public Node(int id, Vector2 position, Vector2Int coords, NodeType type) { this.id = id; this.position = position; this.coords = coords; this.nodeType = (int)type; } }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдВрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
рд╕рдорд╛рди рдкрджреНрдзрддрд┐ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХреЛ рдкреВрд░рдХ рдХрд░реВрдВрдЧрд╛ред
рдиреЛрдб public struct Node { public override bool Equals(object obj) { if (obj is Node) { Node other = (Node)obj; return this.id == other.id; } else return base.Equals(obj); } public static implicit operator bool(Node node) { return node.id > 0; } }
рдЪреВрдВрдХрд┐ рдЧреНрд░рд┐рдб рдкрд░ рдмрд┐рдВрджреБ рдХреА
рдЖрдИрдбреА рд╕рдВрдЦреНрдпрд╛ 1 рдпреВрдирд┐рдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдЧреА, рдореИрдВ рдмрд┐рдВрджреБ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдПрдХ рд╢рд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдВрдЪреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХреА
рдЖрдИрдбреА 0 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рдорд╛рдирдЪрд┐рддреНрд░ рд╡рд░реНрдЧ рдкрд░ рдЬрд╛рдПрдВ рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рдирдХреНрд╢рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдХреНрд╢реЗ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд┐рдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдЪрд░ рдФрд░ рдХрдИ рддрд░реАрдХреЗ рдмрдирд╛рдПрдВред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { public bool rebuilding { get; private set; } public void Rebuild() {} private void OnRebuildStart() {} private void OnRebuildFinish() {} }
рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╕рдВрдкрддреНрддрд┐ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧреА рдХрд┐ рдХреНрдпрд╛
рдореЗрд╢рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╛рд░реА рд╣реИред
рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдЧреНрд░рд┐рдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдЧреА, рдлрд┐рд░
OnRebuildStart рд╡рд┐рдзрд┐ рдЧреНрд░рд┐рдб рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░реЗрдЧреА рдФрд░
OnRebuildFinish рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░реЗрдЧреАред
рдЕрдм рдЪрд▓рд┐рдП
UpdateChanges рдореЗрдердб рдХреЛ
рдереЛрдбрд╝рд╛ рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЧреНрд░рд┐рдб рдХрдВрдбреАрд╢рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { public bool rebuilding { get; private set; } private void UpdateChanges() { if (this.rebuilding) { print(тАЬ ...тАЭ); } else { if (this.requireRebuild) { print(тАЬ , !тАЭ); Rebuild(); } else { this.requireRebuild = CheckChanges(); } } } public void Rebuild() { if (this.rebuilding) return; print(тАЬ !тАЭ); OnRebuildStart(); } private void OnRebuildStart() { this.rebuilding = true; } private void OnRebuildFinish() { this.rebuilding = false; } }
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдм рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
рдЕрдкрдбреЗрдЯрдЪреЗрдВрдЬ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рд╢рд░реНрдд рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ рдЬрд╛рд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░
рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдкрджреНрдзрддрд┐ рдореЗрдВ рднреА, рдкрд╣рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдпрд╣
рдЬрд╛рдВрдЪрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛
рдореЗрд╖рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдирд╛
рдЕрдм рдереЛрдбрд╝рд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рдЪреВрдВрдХрд┐ рд╣рдо рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдирдХреНрд╢реЗ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЧреНрд░рд┐рдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдореИрдВрдиреЗ
IJobParallelFor рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХрд┐рд╕реА рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ
рдЬреЙрдмрд╣реИрдВрдбрд▓ рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдмрд╣реБрдзрд╛, рдЧреНрд░рд┐рдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рджреЛ рдЪрдХреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдлрд┐рд░ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдЧреНрд░рд┐рдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдореЗрдВ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░
рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдо рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рдЪрдХреНрд░ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдХрд╛рд░реНрдп рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХреНрд╖реИрддрд┐рдЬ рд╡рд╛рд▓реЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдмреЗрд╣рддрд░ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдПрдиреАрдореЗрд╢рди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рдЧреНрд░рд┐рдб рдирд┐рд░реНрдорд╛рдг рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧреА, рдмрджрд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛, рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдВрдХ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕реАрд▓рд┐рдП рдореБрдЭреЗ рдЧреНрд░рд┐рдб рдкрд░ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдЧреНрд░рд┐рдб рдкрд░ рдмрд┐рдВрджреБ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
IJobParallelFor рдЬреИрд╕реЗ рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд┐рдВрджреБ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЕрдм рдЖрдк
рдЕрдпреНрдпреВрдм рдХрд╛рд░реНрдп рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ
IJobParallelFor рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред
рдХрд╛рдо public struct Job : IJobParallelFor { public void Execute(int index) {} }
рд╣рдо
рдорд╛рдирдЪрд┐рддреНрд░ рд╡рд░реНрдЧ
рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЧреНрд░рд┐рдб рдорд╛рдк рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { public void Rebuild() { if (this.rebuilding) return; print(тАЬ !тАЭ); Vector2 mapSize = this.size - this.offset * 2f; int horizontals = Mathf.RoundToInt(mapSize.x / this.nodeSize); int verticals = Mathf.RoundToInt(mapSize.y / this.nodeSize); if (horizontals <= 0) { OnRebuildFinish(); return; } Vector2 center = this.position; Vector2 origin = center - (mapSize / 2f); OnRebuildStart(); } }
рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рд╕рдЯреАрдХ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░
рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдореЗрдВ рд╣рдо
рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░
рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдЕрдВрдХреЛрдВ
рдХреА рд╕рдВрдЦреНрдпрд╛
рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 0 рд╣реИ, рддреЛ рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
OnRebuildFinish рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред
рдореВрд▓ рдЪрд░ рдЙрд╕ рд╕реНрдерд╛рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдо рдЧреНрд░рд┐рдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ - рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рдмрд┐рдВрджреБ рд╣реИред
рдЕрдм рдЖрдк рд╕реНрд╡рдпрдВ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛ рд╕реЗ рднрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЧреНрд░рд┐рдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди, рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ
NativeArray рд╕рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ рд╣рдо рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд░рдЦреЗрдВрдЧреЗ, рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВ, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдп рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдФрд░
NativeArray рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдлрд┐рд░ рд╣рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдо рдЕрдВрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рднреАред
рдХрд╛рдо public struct Job : IJobParallelFor { [WriteOnly] public NativeArray<Node> array; [ReadOnly] public NativeArray<Rect> bounds; public float nodeSize; public Vector2 startPos; public Vector2Int startCoords; public void Execute(int index) {} }
рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖рддрд╛
WriteOnly рдХреЗ рд╕рд╛рде рдЕрдВрдХреЛрдВ рдХреА рд╕рд░рдгреА рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реИ
, рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдп рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рд╕рд░рдгреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдмрд┐рдВрджреБрдУрдВ рдХреЛ "
рд▓рд┐рдЦрдирд╛ " рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдмрд╛рдзрд╛рдУрдВ рдХреА рд╕рд░рдгреА рдХреЛ
ReadOnly рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдп рд╕реЗ рд╣рдо рдЗрд╕ рд╕рд░рдгреА рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдХреЗрд╡рд▓ "
рд░реАрдб " рдХрд░реЗрдВрдЧреЗред
рдареАрдХ рд╣реИ, рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдмрд╛рдж рдореЗрдВ рдЦреБрдж рдЕрдВрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред
рдЕрдм
рдореИрдк рдХреНрд▓рд╛рд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рдЪрд░ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ
рд╕рдВрднрд╛рд▓ ,
рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдЧреНрд░рд┐рдб рдФрд░
рд╢рдмреНрджрдХреЛрд╢ рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдмрд┐рдВрджреБ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЙрдирдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛред
рдирдХреНрд╢рд╛ public sealed class Map : Obstacle { private JobHandle handle; private NativeArray<Rect> bounds; private HashSet<NativeArray<Node>> jobs = new HashSet<NativeArray<Node>>(); private Dictionary<Vector2Int, Node> nodes = new Dictionary<Vector2Int, Node>(); }
рдЕрдм рдлрд┐рд░ рд╕реЗ, рд╣рдо
рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЧреНрд░рд┐рдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛рдУрдВ рдХреА
рд╕реАрдорд╛ рд╕рд░рдгреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВред
рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ public void Rebuild() { Vector2 center = this.position; Vector2 origin = center - (mapSize / 2f); int count = this.obstacles.Count; if (count > 0) { this.bounds = new NativeArray<Rect>(count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); } OnRebuildStart(); }
рдпрд╣рд╛рдВ рд╣рдо рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
NativeArray рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкрд╣рд▓реЗ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА, рд▓реЗрдХрд┐рди рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рдмрдЪрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рд░рдгреА рдореЗрдВ рдбреЗрдЯрд╛ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдл рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░
NativeArray рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рдореЗрдВ
рд░реАрдб рдореЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдлрд┐рд░ рд╣рдо рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде
рд╕реАрдорд╛ рд╕рд░рдгреА рднрд░рддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ public void Rebuild() { Vector2 center = this.position; Vector2 origin = center - (mapSize / 2f); int count = this.obstacles.Count; if (count > 0) { this.bounds = new NativeArray<Rect>(count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); for(int i = 0; i < count; i++) { Obstacle obs = this.obstacles[i]; Vector2 position = obs.position; Rect rect = new Rect(Vector2.zero, obs.size); rect.center = position; this.bounds[i] = rect; } } OnRebuildStart(); }
рдЕрдм рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЧреНрд░рд┐рдб рдХреА рд╕рднреА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЪрдХреНрд░ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗред
рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ public void Rebuild() { Vector2 center = this.position; Vector2 origin = center - (mapSize / 2f); int count = this.obstacles.Count; if (count > 0) { this.bounds = new NativeArray<Rect>(count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); for(int i = 0; i < count; i++) { Obstacle obs = this.obstacles[i]; Vector2 position = obs.position; Rect rect = new Rect(Vector2.zero, obs.size); rect.center = position; this.bounds[i] = rect; } } for (int i = 0; i < verticals; i++) { float xPos = origin.x; float yPos = origin.y + (i * this.nodeSize) + this.nodeSize / 2f; } OnRebuildStart(); }
XPos рдФрд░
yPos рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдерд┐рддрд┐ рдорд┐рд▓рддреА рд╣реИред
рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ public void Rebuild() { Vector2 center = this.position; Vector2 origin = center - (mapSize / 2f); int count = this.obstacles.Count; if (count > 0) { this.bounds = new NativeArray<Rect>(count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); for(int i = 0; i < count; i++) { Obstacle obs = this.obstacles[i]; Vector2 position = obs.position; Rect rect = new Rect(Vector2.zero, obs.size); rect.center = position; this.bounds[i] = rect; } } for (int i = 0; i < verticals; i++) { float xPos = origin.x; float yPos = origin.y + (i * this.nodeSize) + this.nodeSize / 2f; NativeArray<Node> array = new NativeArray<Node>(horizontals, Allocator.Persistent); Job job = new Job(); job.startCoords = new Vector2Int(i * horizontals, i); job.startPos = new Vector2(xPos, yPos); job.nodeSize = this.nodeSize; job.bounds = this.bounds; job.array = array; } OnRebuildStart(); }
рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг
NativeArray рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдХрд╛рд░реНрдп рдореЗрдВ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣рд╛рдБ
рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдХрд┐рддрдиреЗ рдмрд┐рдВрджреБ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЖрд╡рдВрдЯрди рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдп рдПрдХ рдлреНрд░реЗрдо рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗ рд╕рдХрддрд╛ рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж,
рдЬреЙрдм рдЯрд╛рд╕реНрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЦреБрдж
рдмрдирд╛рдПрдВ ,
рд╕реНрдЯрд╛рд░реНрдЯрдХреЙрд░реНрдбреНрд╕ рд╕реАрд░реАрдЬрд╝ рдХреЗ рд╢реБрд░реБрдЖрддреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ,
рд╕реНрдЯрд╛рд░реНрдЯрдкреЛрд╕ рд╕реАрд░реАрдЬрд╝ рдХреА рд╢реБрд░реБрдЖрддреА рд╕реНрдерд┐рддрд┐,
рдиреЛрдбрд╕рд╛рдЗрдЬрд╝ рдкреЙрдЗрдВрдЯреНрд╕ рдХрд╛ рдЖрдХрд╛рд░, рдмрд╛рдзрд╛рдУрдВ рдХреА
рд╕реАрдорд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЦреБрдж рдкреЙрдЗрдВрдЯреНрд╕ рдХреА рд╕рд░рдгреА рдбрд╛рд▓реЗрдВред
рдпрд╣ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рдХреЛ
рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдХрд╛рд░реНрдп рд╕реВрдЪреА рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред
рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ public void Rebuild() { Vector2 center = this.position; Vector2 origin = center - (mapSize / 2f); int count = this.obstacles.Count; if (count > 0) { this.bounds = new NativeArray<Rect>(count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); for(int i = 0; i < count; i++) { Obstacle obs = this.obstacles[i]; Vector2 position = obs.position; Rect rect = new Rect(Vector2.zero, obs.size); rect.center = position; this.bounds[i] = rect; } } for (int i = 0; i < verticals; i++) { float xPos = origin.x; float yPos = origin.y + (i * this.nodeSize) + this.nodeSize / 2f; NativeArray<Node> array = new NativeArray<Node>(horizontals, Allocator.Persistent); Job job = new Job(); job.startCoords = new Vector2Int(i * horizontals, i); job.startPos = new Vector2(xPos, yPos); job.nodeSize = this.nodeSize; job.bounds = this.bounds; job.array = array; this.handle = job.Schedule(horizontals, 3, this.handle); this.jobs.Add(array); } OnRebuildStart(); }
рд╣реЛ рдЧрдпрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рдорд╛рдиреНрдп
рд╣реИрдВрдбрд▓ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЕрдм рд╣рдо
OnRebuildStart рдкрджреНрдзрддрд┐ рдореЗрдВ рдЗрд╕рдХреА
рдкреВрд░реНрдг рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓
рдХрд░рдХреЗ рдЗрд╕
рд╣реИрдВрдбрд▓ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
OnRebuildStart private void OnRebuildStart() { this.rebuilding = true; this.handle.Complete(); }
рдЪреВрдБрдХрд┐
рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдЪрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐
рдЬрд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓ рд░рд╣реА рд╣реИ,
UpdateChanges рд╡рд┐рдзрд┐ рдХреЛ рднреА рдЗрд╕ рд╢рд░реНрдд рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛
рд╣реИрдВрдбрд▓ рдФрд░ рдЗрд╕рдХреА
IsCompleted рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреАред
UpdateChanges private void UpdateChanges() { if (this.rebuilding) { print(тАЬ ...тАЭ); if (this.handle.IsCompleted) OnRebuildFinish(); } else { if (this.requireRebuild) { print(тАЬ , !тАЭ); Rebuild(); } else { this.requireRebuild = CheckChanges(); } } }
рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж,
OnRebuildFinish рдкрджреНрдзрддрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рдЕрдВрдХреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп
рд╢рдмреНрджрдХреЛрд╢ рд╕реВрдЪреА рдореЗрдВ рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдХрдмреНрдЬреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
OnRebuildFinish private void OnRebuildFinish() { this.nodes.Clear(); foreach (NativeArray<Node> array in this.jobs) { foreach (Node node in array) this.nodes.Add(node.coords, node); array.Dispose(); } this.jobs.Clear(); if (this.bounds.IsCreated) this.bounds.Dispose(); this.requireRebuild = this.rebuilding = false; }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд┐рдЫрд▓реЗ рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдиреЛрдб рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ , рдлрд┐рд░ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░рдЪ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдиреЛрдб рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ , рдЬрд╣рд╛рдВ рдХреБрдВрдЬреА рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ ( рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ !) рд╣реИ, рдФрд░ рдореВрд▓реНрдп рд╣реА рдмрд┐рдВрджреБ рд╣реИред рдЗрд╕ рд╢рдмреНрджрдХреЛрд╖ рдХреА рдорджрдж рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдкрдбрд╝реЛрд╕реА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╢реБрджреНрдз рд╕рд░рдгреА рднрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рд░рдгреА рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдкрдЯрд╛рди рдФрд░ рдЕрдВрдд рдореЗрдВ рдЦреБрдж рдХреЛ рд╢реБрджреНрдз рдХрд╛рд░реНрдп рд╕реВрдЪреА рдиреМрдХрд░рд┐рдпреЛрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ редрдпрджрд┐ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЖрдкрдХреЛ рдмрд╛рдзрд╛рдУрдВ рдХреА рд╕реАрдорд╛ рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА редрдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдЕрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдордВрдЪ рдкрд░ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВредрдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдк рдХреНрд▓рд╛рд╕ рдореЗрдВ, рдСрдирдбреНрд░рд╛рдЧреНрд░рд┐рдЬрдореЛрд╕ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ рдЬрд╣рд╛рдВ рд╣рдо рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗредрдирдХреНрд╢рд╛ public sealed class Map : Obstacle { #if UNITY_EDITOR private void OnDrawGizmos() {} #endif }
рдЕрдм рд▓реВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВредрдирдХреНрд╢рд╛ public sealed class Map : Obstacle { #if UNITY_EDITOR private void OnDrawGizmos() { foreach (Node node in this.nodes.Values) { Gizmos.DrawWireSphere(node.position, this.nodeSize / 10f); } } #endif }
рдЗрди рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░рд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдмрд╛рдК рд▓рдЧрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧреНрд░рд┐рдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдВрджреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИредрдкрдбрд╝реЛрд╕реА рдмрд┐рдВрджреБрдУрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ 8 рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдВрдЫрд┐рдд рдмрд┐рдВрджреБ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдк рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╣рдо рджрд┐рд╢рд╛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕рд░рд▓ рд╕реНрдереИрддрд┐рдХ рд╕рд░рдгреА рдФрд░ рдЗрд╕рдХреЗ рдЧреЗрдЯрдиреЙрдб рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реЗрд▓ рдЦреЛрдЬ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВрдЧреЗ редрдирдХреНрд╢рд╛ public sealed class Map : Obstacle { public static readonly Vector2Int[] Directions = { Vector2Int.up, new Vector2Int(1, 1), Vector2Int.right, new Vector2Int(1, -1), Vector2Int.down, new Vector2Int(-1, -1), Vector2Int.left, new Vector2Int(-1, 1), }; public Node GetNode(Vector2Int coords) { Node result = default(Node); try { result = this.nodes[coords]; } catch {} return result; } #if UNITY_EDITOR private void OnDrawGizmos() {} #endif }
GetNode рдкрджреНрдзрддрд┐ рдиреЛрдбреНрд╕ рд╕реВрдЪреА рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдмрд┐рдВрджреБ рд▓реМрдЯрд╛рдПрдЧреА , рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рд╡реЗрдХреНрдЯрд░2Int рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЧрд▓рдд рд╣реИрдВ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рд╣рдо try catch рдЕрдкрд╡рд╛рдж рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ " рд╣реИрдВрдЧ " рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ редрдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЪрдХреНрд░ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗ рдФрд░ OnDrawGizmos рдкрджреНрдзрддрд┐ рдореЗрдВ рдкрдбрд╝реЛрд╕реА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ , рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдмрд┐рдВрджреБ рдХреА рдзреИрд░реНрдпрддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВредOnDrawGizmos #if UNITY_EDITOR private void OnDrawGizmos() { Color c = Gizmos.color; foreach (Node node in this.nodes.Values) { Color newColor = Color.white; if (node.isWalkable) newColor = new Color32(153, 255, 51, 255); else newColor = Color.red; Gizmos.color = newColor; Gizmos.DrawWireSphere(node.position, this.nodeSize / 10f); newColor = Color.green; Gizmos.color = newColor; if (node.isWalkable) { for (int i = 0; i < Directions.Length; i++) { Vector2Int coords = node.coords + Directions[i]; Node connection = GetNode(coords); if (connection) { if (connection.isWalkable) Gizmos.DrawLine(node.position, connection.position); } } } } Gizmos.color = c; } #endif
рдЕрдм рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖредрдЧрддрд┐рд╢реАрд▓ рдирдХреНрд╢рд╛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЗрд╡рд▓ рдЧреНрд░рд╛рдл рд╣реА рдмрдирд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдП * рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдЦрд░рд╛рдм рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реБрдЖ , рдЬреЛ рдХрд┐ рдорд╛рд░реНрдЧ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдиреМрдХрд░реА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ , рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрд░реЛрдд редрдирдХреНрд╢рд╛ рдФрд░ рдкрде рдЦреЛрдЬ рддреЛ рдЖрдк рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирдИ рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреЗ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, ECS рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк ECS рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдореЗрдВ рдХреЗрд╡рд▓ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧреБрдб рд▓рдХ !рдкрд╛рде рдлрд╛рдЗрдВрдбрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЛрд░реНрд╕