рдореИрджрд╛рди
- рдПрдХ рдЯрд╛рдЗрд▓ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдирд╛ред
- рдЪреМрдбрд╝рд╛рдИ-рдкреНрд░рдердо рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЛрдЬ рдкрдеред
- рдЦрд╛рд▓реА рдФрд░ рдЕрдВрдд рдЯрд╛рдЗрд▓, рд╕рд╛рде рд╣реА рджреАрд╡рд╛рд░ рдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
- рдЦреЗрд▓ рдореЛрдб рдореЗрдВ рд╕рдВрдкрд╛рджрди рд╕рд╛рдордЧреНрд░реАред
- рдЧреНрд░рд┐рдб рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рджрд░реНрд╢рдиред
рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг
рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдЦреЗрд▓ рдмрдирд╛рдиреЗ рдкрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдПрдХ рдЦреЗрд▓ рдореИрджрд╛рди рдмрдирд╛рдиреЗ, рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдФрд░ рдЕрдВрддрд┐рдо рдЯрд╛рдЗрд▓ рдФрд░ рджреАрд╡рд╛рд░реЗрдВ рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдПрдХрддрд╛ 2018.3.0f2 рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдПрдХ рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рд╢реИрд▓реА рдЯрд╛рдЗрд▓ рдЦреЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдПрдХ рдХреНрд╖реЗрддреНрд░редрдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдЦреЗрд▓
рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдПрдХ рд╢реИрд▓реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рд▓рдХреНрд╖реНрдп рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рджреБрд╢реНрдордиреЛрдВ рдХреА рднреАрдбрд╝ рдХреЛ рдирд╖реНрдЯ рдХрд░рдирд╛ рд╣реИред рдЦрд┐рд▓рд╛рдбрд╝реА рджреБрд╢реНрдордиреЛрдВ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯрд╛рд╡рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдХреЗ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рдмрд╣реБрдд рднрд┐рдиреНрдирддрд╛рдПрдВ рд╣реИрдВред рд╣рдо рдПрдХ рдЯрд╛рдЗрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреЗрдо рдмрдирд╛рдПрдВрдЧреЗред рджреБрд╢реНрдорди рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХреА рдУрд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдЙрдирдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛рдПрдВ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдкрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рдЪреБрдХреЗ
рд╣реИрдВ ред
рдореИрджрд╛рди
рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдЦреЗрд▓ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдШрдЯрдХ
GameBoard
рд╕рд╛рде рдПрдХ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдЖрдХрд╛рд░ рдХреЛ рджреЛ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо
Vector2Int
рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╝реАрд▓реНрдб рдХреЛ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рдо рдЖрдХрд╛рд░ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдЪреБрдиреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп
Initialize
рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВрдЧреЗред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдПрдХ рдЪрддреБрд░реНрднреБрдЬ рдХреЗ рд╕рд╛рде рдХреНрд╖реЗрддреНрд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреГрдереНрд╡реА рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░реЗрдЧрд╛ред рд╣рдо рдлрд╝реАрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рдПрдХ рдЪрддреБрд░реНрднреБрдЬ рдирд╣реАрдВ рдмрдирд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдЪрд╛рдЗрд▓реНрдб рдХреНрд╡рд╛рдб рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдЖрд░рдВрдн рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдкреГрдереНрд╡реА рдХреЗ XY рдкреИрдорд╛рдиреЗ рдХреЛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рдХрд░ рджреЗрдВрдЧреЗред рдпрд╣реА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрд▓ рдореЗрдВ рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдорд╛рдк рдХреА рдПрдХ рд╡рд░реНрдЧ рдЗрдХрд╛рдИ рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛрдЧрд╛ред
using UnityEngine; public class GameBoard : MonoBehaviour { [SerializeField] Transform ground = default; Vector2Int size; public void Initialize (Vector2Int size) { this.size = size; ground.localScale = new Vector3(size.x, size.y, 1f); } }
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрдореАрди рдХреНрдпреЛрдВ рд╕реЗрдЯ рдХрд░реЗрдВ?рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХрддрд╛ рд╕рдВрдкрд╛рджрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╕рдм рдХреБрдЫ рдЕрдиреБрдХреНрд░рдорд┐рдд рдЫрд┐рдкреЗ рд╣реБрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдирд┐рд░реАрдХреНрд╖рдХ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХрддрд╛ рд╕рдВрдкрд╛рджрдХ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рд╕рдВрдХрд▓рдХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдорд╛рди рдХрднреА рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рджрдмрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк null
рднреА рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЬрдореАрди рдХрд╛ рд╕рд╣реА рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо default
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдирдП рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЪреНрдЪрд╛ рдХреНрд╡рд╛рдб рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдкреГрдереНрд╡реА рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рд╕рд░рд▓ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреЗрдо рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдПрдХ рд╕рдорд╛рди рд╣рд░реЗ рд░рдВрдЧ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧреАред X рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдХреНрд╡рд╛рдб 90 ┬░ рдШреБрдорд╛рдПрдБ рддрд╛рдХрд┐ рдпрд╣ XZ рд╡рд┐рдорд╛рди рдкрд░ рд╕реНрдерд┐рдд рд╣реЛред
рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рдиредрдХреНрдпреЛрдВ XY рд╡рд┐рдорд╛рди рдкрд░ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ?рдпрджреНрдпрдкрд┐ рдпрд╣ рдЧреЗрдо 2 рдбреА рд╕реНрдкреЗрд╕ рдореЗрдВ рд╣реЛрдЧрд╛, рд╣рдо рдЗрд╕реЗ 3 рдбреА рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ 3 рдбреА рджреБрд╢реНрдорди рдФрд░ рдПрдХ рдХреИрдорд░рд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред XZ рд╡рд┐рдорд╛рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдкрд░рд┐рд╡реЗрд╢ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдирдХ рд╕реНрдХрд╛рдИрдмреЙрдХреНрд╕ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдЦреЗрд▓
рдЕрдЧрд▓рд╛, рдПрдХ
Game
рдШрдЯрдХ рдмрдирд╛рдПрдВ рдЬреЛ рдкреВрд░реЗ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рдо рдмрд╕ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдХрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдШрдЯрдХ рдХреЛ рдЬрд╝рдмреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╡рд╣ рдЙрдарддрд╛ рд╣реИред рдЖрдЗрдП 11 ├Ч 11 рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
using UnityEngine; public class Game : MonoBehaviour { [SerializeField] Vector2Int boardSize = new Vector2Int(11, 11); [SerializeField] GameBoard board = default; void Awake () { board.Initialize(boardSize); } }
рдлрд╝реАрд▓реНрдб рдЖрдХрд╛рд░ рдХреЗрд╡рд▓ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдПрдХ рдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рддреЛ рдЪрд▓реЛ рдиреНрдпреВрдирддрдо 2 ├Ч 2 рддрдХ рд╕реАрдорд┐рдд рдХрд░реЗрдВред рдпрд╣
OnValidate
рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдХрд░, рдиреНрдпреВрдирддрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬрдмрд░рди рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
void OnValidate () { if (boardSize.x < 2) { boardSize.x = 2; } if (boardSize.y < 2) { boardSize.y = 2; } }
Onvalidate рдХрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдПрдХрддрд╛ рд╕рдВрдкрд╛рджрдХ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛, рджреГрд╢реНрдп рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд░рджреНрдж / рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ рдШрдЯрдХ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред
OnValidate
рдХреЛрдб рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдШрдЯрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реАрд▓реНрдб рдореЗрдВ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЦреЗрд▓ рд╡рд╕реНрддреБредрдЕрдм, рдЬрдм рдЖрдк рдЧреЗрдо рдореЛрдб рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рд╣реА рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реАрд▓реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЦреЗрд▓ рдХреЗ рджреМрд░рд╛рди, рдХреИрдорд░рд╛ рдХреЛ рд╕реНрдерд┐рддрд┐ рджреЗрдВ рддрд╛рдХрд┐ рдкреВрд░рд╛ рдмреЛрд░реНрдб рджрд┐рдЦрд╛рдИ рджреЗ, рдЙрд╕рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдХ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ, рдкреНрд▓реЗ рдореЛрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ рдФрд░ рдШрдЯрдХ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЪрд┐рдкрдХрд╛рдПрдБред рдореВрд▓ рдореЗрдВ 11 ├Ч 11 рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдКрдкрд░ рд╕реЗ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреГрд╢реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреИрдорд░реЗ рдХреЛ рд╕реНрдерд┐рддрд┐ (0.10.0) рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде 90 ┬░ рдШреБрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреИрдорд░рд╛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдмрджрд▓реЛред

рдореИрджрд╛рди рдкрд░ рдХреИрдорд░рд╛редрдШрдЯрдХ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХреИрд╕реЗ рдХрд░реЗрдВ?рдбреНрд░реЙрдк-рдбрд╛рдЙрди рдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛ рдШрдЯрдХ рдХреЗ рдКрдкрд░реА рджрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдЧрд┐рдпрд░ рдХреЗ рд╕рд╛рде рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
рдкреНрд░реАрдлрд╝реИрдм рдЯрд╛рдЗрд▓
рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЪреМрдХреЛрд░ рдЯрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВред рджреБрд╢реНрдорди рдЯрд╛рдЗрд▓ рд╕реЗ рдЯрд╛рдЗрд▓ рддрдХ, рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рддрд┐рд░рдЫреЗ рдирд╣реАрдВред рдЖрдВрджреЛрд▓рди рд╣рдореЗрд╢рд╛ рдирд┐рдХрдЯрддрдо рдЕрдВрдд рдмрд┐рдВрджреБ рдХреА рдУрд░ рдШрдЯрд┐рдд рд╣реЛрдЧрд╛ред рдЪрд▓реЛ рдПрдХ рддреАрд░ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдХрд╛ рд░реЗрдЦрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВред рдЖрдк
рдпрд╣рд╛рдБ рддреАрд░ рдмрдирд╛рд╡рдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ
рд╣реИрдВ ред
рдПрдХ рдХрд╛рд▓реА рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рддреАрд░редрдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрд░реЛ рдЯреЗрдХреНрд╕рдЪрд░ рд░рдЦреЗрдВ рдФрд░
рдЕрд▓реНрдлрд╛ рдЕрд╕ рдЯреНрд░рд╛рдВрд╕рдкреЗрд░реЗрдВрд╕реА рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред рдлрд┐рд░ рддреАрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рдПрдВ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд╛рдордЧреНрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрдЯрдЖрдЙрдЯ рдореЛрдб рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореБрдЦреНрдп рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рддреАрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред
рддреАрд░ рд╕рд╛рдордЧреНрд░реАредрдХрдЯрдЖрдЙрдЯ рд░реЗрдВрдбрд░ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?рдпрд╣ рдЖрдкрдХреЛ рдорд╛рдирдХ рдПрдХрддрд╛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреАрд░ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЦреЗрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрд▓ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдкрд╛рд╕ рддреАрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХреНрд╡рд╛рдб рд╣реЛрдЧрд╛, рдЬрд┐рд╕ рддрд░рд╣ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреГрдереНрд╡реА рдХрд╛ рдПрдХ рдХреНрд╡рд╛рдб рд╣реИред рд╣рдо рдЙрдирдХреЗ рддреАрд░ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде GameTile рдШрдЯрдХ рдореЗрдВ рдЯрд╛рдЗрд▓ рднреА рдЬреЛрдбрд╝реЗрдВрдЧреЗред
using UnityEngine; public class GameTile : MonoBehaviour { [SerializeField] Transform arrow = default; }
рдПрдХ рдЯрд╛рдЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░реАрдлрд╝реИрдм рдореЗрдВ рдмрджрд▓ рджреЗрдВред рдЯрд╛рдЗрд▓ рдЬрдореАрди рдХреЗ рд╕рд╛рде рдмрд╣ рдЬрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рддреАрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдКрдкрд░ рдЙрдард╛рдПрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдереЛрдбрд╝рд╛ рдмрд╛рд╣рд░ рдЬрд╝реВрдо рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдЖрд╕рдиреНрди рддреАрд░реЛрдВ рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рдХрдо рдЬрдЧрд╣ рд╣реЛред 0.001 рдХрд╛ Y рдСрдлрд╕реЗрдЯ рдФрд░ 0.8 рдХрд╛ рдПрдХ рдкреИрдорд╛рдирд╛ рдЬреЛ рд╕рднреА рдПрдХреНрд╕рд┐рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред
рдкреНрд░реАрдлрд╝реИрдм рдЯрд╛рдЗрд▓редрдкреНрд░реАрдлрд╝реИрдм рдЯрд╛рдЗрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╣рд╛рдБ рд╣реИ?рдЖрдк рдкреНрд░реАрдлрд╝реИрдм рд╕рдВрдкрд╛рджрди рдореЛрдб рдХреЛ рдкреНрд░реАрдлрд╝реИрдм рдПрд╕реЗрдЯ рдкрд░ рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдпрд╛ рдкреНрд░реАрдлрд╝реИрдм рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рдФрд░ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ рдУрдкрди рдкреНрд░реАрдлрд╝реИрдм рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ ред рдЖрдк рдЕрдкрдиреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдБ рдХреЛрдиреЗ рдореЗрдВ рдПрдХ рддреАрд░ рд╕реЗ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдкреНрд░реАрдлрд╝реИрдм рд╕рдВрдкрд╛рджрди рдореЛрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЯрд╛рдЗрд▓реНрд╕ рдХреЛ рдЦреБрдж рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдо рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ
рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдмрдВрдзрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЦреЗрд▓ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд░рд▓ рдЦреЗрд▓ рдпрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ, рд╣рдо рдХрд╛рдлреА рдЦреБрд╢ рд╣реИрдВред рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрд▓реНрд╕ рд╣реИрдВ
рдЯрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП,
GameBoard
рдЯрд╛рдЗрд▓
GameBoard
рд▓рд┐рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
[SerializeField] GameTile tilePrefab = default;
рдкреНрд░реАрдлрд╝реИрдм рдЯрд╛рдЗрд▓ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВредрдлрд┐рд░ рд╡рд╣ рджреЛ рдЧреНрд░рд┐рдб рдЖрдпрд╛рдореЛрдВ рдкрд░ рджреЛрд╣рд░реЗ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдХрд╛рд░ X рдФрд░ Y рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо XZ рд╡рд┐рдорд╛рди рдкрд░ рдЯрд╛рдЗрд▓реЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреНрд╖реЗрддреНрд░ рднреАред рдЪреВрдВрдХрд┐ рдХреНрд╖реЗрддреНрд░ рдореВрд▓ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЯрд╛рдЗрд▓ рд╕реНрдерд┐рддрд┐ рдХреЗ рдШрдЯрдХреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рд╕реЗ рдПрдХ рдХреЛ рджреЛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рд╡рд┐рднрд╛рдЬрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
public void Initialize (Vector2Int size) { this.size = size; ground.localScale = new Vector3(size.x, size.y, 1f); Vector2 offset = new Vector2( (size.x - 1) * 0.5f, (size.y - 1) * 0.5f ); for (int y = 0; y < size.y; y++) { for (int x = 0; x < size.x; x++) { GameTile tile = Instantiate(tilePrefab); tile.transform.SetParent(transform, false); tile.transform.localPosition = new Vector3( x - offset.x, 0f, y - offset.y ); } } }
рдЯрд╛рдЗрд▓реНрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдП рдЧрдПредрдмрд╛рдж рдореЗрдВ рд╣рдореЗрдВ рдЗрди рдЯрд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред
GameTile[] tiles; public void Initialize (Vector2Int size) { тАж tiles = new GameTile[size.x * size.y]; for (int i = 0, y = 0; y < size.y; y++) { for (int x = 0; x < size.x; x++, i++) { GameTile tile = tiles[i] = Instantiate(tilePrefab); тАж } } }
рдпрд╣ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?рдпрд╣ рдПрдХ рд▓рд┐рдВрдХреНрдб рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рд╕рд░рдгреА рддрддреНрд╡ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпреЗ рдСрдкрд░реЗрд╢рди рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВред
GameTile t = Instantiate(tilePrefab); tiles[i] = t; GameTile tile = t;
рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬреЛ
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрд▓ рдореЗрдВ рдПрдХ рддреАрд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдЬреЗрдб рдЕрдХреНрд╖ рдХреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдВрдЧреЗред рдЕрдЧрд▓рд╛ рдХрджрдо рдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рджрд┐рд╢рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рд╣рдо рдРрд╕рд╛ рдЙрд╕ рдорд╛рд░реНрдЧ рдХреЛ рдЦреЛрдЬрдХрд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдкрд░ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЯрд╛рдЗрд▓ рдкрдбрд╝реЛрд╕реА
рд░рд╛рд╕реНрддреЗ рдЯрд╛рдЗрд▓ рд╕реЗ рдЯрд╛рдЗрд▓ рдореЗрдВ рдЙрддреНрддрд░, рдкреВрд░реНрд╡, рджрдХреНрд╖рд┐рдг рдпрд╛ рдкрд╢реНрдЪрд┐рдо рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВред рдЦреЛрдЬ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдЪрд╛рд░ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП
GameTile
рдЯреНрд░реИрдХ рд▓рд┐рдВрдХ
GameTile
ред
GameTile north, east, south, west;
рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╕рдордорд┐рдд рд╣реИрдВред рдпрджрд┐ рдЯрд╛рдЗрд▓ рджреВрд╕рд░реА рдЯрд╛рдЗрд▓ рдХрд╛ рдкреВрд░реНрд╡реА рдкрдбрд╝реЛрд╕реА рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рдкрд╣рд▓реЗ рдХрд╛ рдкрд╢реНрдЪрд┐рдореА рдкрдбрд╝реЛрд╕реА рд╣реИред рджреЛ рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рдмреАрдЪ рдЗрд╕ рд╕рдВрдмрдВрдз рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
GameTile
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред
public static void MakeEastWestNeighbors (GameTile east, GameTile west) { west.east = east; east.west = west; }
рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?рд╣рдо рдЗрд╕реЗ рдПрдХ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЗрд╕реЗ eastTile.MakeEastWestNeighbors(westTile)
рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ eastTile.MakeEastWestNeighbors(westTile)
ред рд▓реЗрдХрд┐рди рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдЯрд╛рдЗрд▓ рдХреЛ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг Vector3
рд╡рд░реНрдЧ рдХреА Distance
рдФрд░ Dot
рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред
рдПрдХ рдмрд╛рд░ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдХрднреА рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдордиреЗ рдХреЛрдб рдореЗрдВ рдЧрд▓рддреА рдХреАред рдЖрдк рдорд╛рдиреЛрдВ рдХреЛ
null
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рд▓рд┐рдВрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ, рдФрд░ рдпрджрд┐ рдпрд╣ рдЧрд▓рдд рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдХреЗ рдЖрдк рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП
Debug.Assert
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
public static void MakeEastWestNeighbors (GameTile east, GameTile west) { Debug.Assert( west.east == null && east.west == null, "Redefined neighbors!" ); west.east = east; east.west = west; }
Debug.Assert рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?рдпрджрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ false
, рддреЛ рдпрд╣ рдПрдХ рд╢рд░реНрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ рддреЛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдРрд╕реА рдХреЙрд▓ рдХреЗрд╡рд▓ рдЯреЗрд╕реНрдЯ рдмрд┐рд▓реНрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд░рд┐рд▓реАрдЬрд╝ рдмрд┐рд▓реНрдб рдореЗрдВ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдЪреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рд░рд┐рд▓реАрдЬ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЙрддреНрддрд░реА рдФрд░ рджрдХреНрд╖рд┐рдгреА рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред
public static void MakeNorthSouthNeighbors (GameTile north, GameTile south) { Debug.Assert( south.north == null && north.south == null, "Redefined neighbors!" ); south.north = north; north.south = south; }
рд╣рдо
GameBoard.Initialize
рдореЗрдВ рдЯрд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕ рд╕рдВрдмрдВрдз рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ X рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдФрд░ рдкрд┐рдЫрд▓реА рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рдмреАрдЪ рдкреВрд░реНрд╡-рдкрд╢реНрдЪрд┐рдо рд╕рдВрдмрдВрдз рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд╛рдИ рд╕рдордиреНрд╡рдп рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрд▓ рдФрд░ рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рд╕реЗ рдЯрд╛рдЗрд▓ рдХреЗ рдмреАрдЪ рдЙрддреНрддрд░-рджрдХреНрд╖рд┐рдг рд╕рдВрдмрдВрдз рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
for (int i = 0, y = 0; y < size.y; y++) { for (int x = 0; x < size.x; x++, i++) { тАж if (x > 0) { GameTile.MakeEastWestNeighbors(tile, tiles[i - 1]); } if (y > 0) { GameTile.MakeNorthSouthNeighbors(tile, tiles[i - size.x]); } } }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрджрд╛рди рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╕реНрдерд┐рдд рдЯрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЪрд╛рд░ рдкрдбрд╝реЛрд╕реА рдирд╣реАрдВ рд╣реИрдВред рдПрдХ рдпрд╛ рджреЛ рдкрдбрд╝реЛрд╕реА рд╕рдВрджрд░реНрдн
null
рд░рд╣реЗрдВрдЧреЗред
рджреВрд░реА рдФрд░ рджрд┐рд╢рд╛
рд╣рдо рд╕рднреА рджреБрд╢реНрдордиреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдкреНрд░рддрд┐ рдЯрд╛рдЗрд▓ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рддрдм рджреБрд╢реНрдорди рдЙрд╕ рдЯрд╛рдЗрд▓ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рд╕реНрдерд┐рдд рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИред рд╣рдо рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрдЧрд▓реЗ рдкрде рдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдХрд░
GameTile
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреА рджреВрд░реА рдХреЛ рднреА рдмрдЪрд╛рдПрдВрдЧреЗ, рджреБрд╢реНрдорди рдХреЛ рдПрдВрдбрдкреЙрдЗрдВрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдЯрд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рджреБрд╢реНрдордиреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдмреЗрдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рд░рд╛рд╕реНрддреЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
GameTile north, east, south, west, nextOnPath; int distance;
рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рд░рд╛рд╕реНрддреЗ рддрд▓рд╛рд╢рдиреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкрде рдбреЗрдЯрд╛ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬрдм рддрдХ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдХреЛрдИ рдЕрдЧрд▓реА рдЯрд╛рдЗрд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рджреВрд░реА рдХреЛ рдЕрдирдВрдд рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ
int.MaxValue
рдХреЗ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
GameTile
рдХреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп
ClearPath
рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред
public void ClearPath () { distance = int.MaxValue; nextOnPath = null; }
рдкрде рдХреЗрд╡рд▓ рддрднреА рдЦреЛрдЬреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реЛред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЯрд╛рдЗрд▓ рдХреЛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕реА рдЯрд╛рдЗрд▓ рдореЗрдВ рд╢реВрдиреНрдп рдХреА рджреВрд░реА рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдВрддрд┐рдо рдЯрд╛рдЗрд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрд░ рд░рд╛рд╕реНрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдПрдХ рдЯрд╛рдЗрд▓ рдХреЛ рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдореЗрдВ рдмрджрд▓ рджреЗрддреА рд╣реИред
public void BecomeDestination () { distance = 0; nextOnPath = null; }
рдЕрдВрддрддрдГ, рд╕рднреА рдЯрд╛рдЗрд▓реЗрдВ рдПрдХ рдкрде рдореЗрдВ рдмрджрд▓ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреА рджреВрд░реА рдЕрдм рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрдЧреАред
int.MaxValue
ред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдорд╛рд░реНрдЧ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЧреЗрдЯрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдЬреЛрдбрд╝реЗрдВред
public bool HasPath => distance != int.MaxValue;
рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ?рдпрд╣ рдПрдХ рдЧреЗрдЯрд╡реЗ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред рдпрд╣ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИред
public bool HasPath { get { return distance != int.MaxValue; } }
рдПрд░реЛ рдСрдкрд░реЗрдЯрд░
=>
рдЙрдкрдпреЛрдЧ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд░реАрдХреЛрдВ, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рд▓рд┐рдПред
рд╣рдо рдПрдХ рд░рд╛рд╕реНрддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ
рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкрде рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд╛рдЗрд▓ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдУрд░ рдмрдврд╝рдиреЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдкрде рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рдЯрд╛рдЗрд▓ рдЕрдВрдд рдмрд┐рдВрджреБ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╢реВрдиреНрдп рджреВрд░реА рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рд╕рднреА рддрддреНрдХрд╛рд▓ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ 1 рдХреА рджреВрд░реА рд╣реЛрдЧреА, рдФрд░ рдЗрди рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рднреА рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ 2 рдХреА рджреВрд░реА рд╣реЛрдЧреА, рдФрд░ рдЗрд╕реА рддрд░рд╣ред
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдкрде рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
GameTile
рдЫрд┐рдкреА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдкрдбрд╝реЛрд╕реА рдХреА рджреВрд░реА рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрд▓ рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рдкрдбрд╝реЛрд╕реА рдХрд╛ рдорд╛рд░реНрдЧ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдЙрди рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдП рдЗрд╕реЗ рдЬреЛрд░ рд╕реЗ рдЬрд╛рдВрдЪреЗрдВред
void GrowPathTo (GameTile neighbor) { Debug.Assert(HasPath, "No path!"); neighbor.distance = distance + 1; neighbor.nextOnPath = this; }
рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЯрд╛рдЗрд▓ рдХреЗ рдЪрд╛рд░ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдХрд╣рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд▓рд┐рдВрдХ
null
, рд╣рдо рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд░реЛрдХ рджреЗрдВрдЧреЗ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдкрдбрд╝реЛрд╕реА рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдХрд░рдирд╛ рднреА рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
void GrowPathTo (GameTile neighbor) { Debug.Assert(HasPath, "No path!"); if (neighbor == null || neighbor.HasPath) { return; } neighbor.distance = distance + 1; neighbor.nextOnPath = this; }
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ
GameTile
рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдмрд╛рдХреА рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдЗрд╕рд▓рд┐рдП,
GrowPathTo
рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИред рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдЬреЛ рдЯрд╛рдЗрд▓ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рджрд┐рд╢рд╛ рдореЗрдВ рдЕрдкрдиреЗ рдкрде рдХреЛ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ
GrowPathTo
ред рд▓реЗрдХрд┐рди рдХреЛрдб рдЬреЛ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд┐рд╕ рдЯрд╛рдЗрд▓ рдХрд╛ рджреМрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдПрдХ рдкрдбрд╝реЛрд╕реА рдпрд╛
null
рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред
GameTile GrowPathTo (GameTile neighbor) { if (!HasPath || neighbor == null || neighbor.HasPath) { return null; } neighbor.distance = distance + 1; neighbor.nextOnPath = this; return neighbor; }
рдЕрдм рд╡рд┐рд╢рд┐рд╖реНрдЯ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдмрдврд╝рддреЗ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВред
public GameTile GrowPathNorth () => GrowPathTo(north); public GameTile GrowPathEast () => GrowPathTo(east); public GameTile GrowPathSouth () => GrowPathTo(south); public GameTile GrowPathWest () => GrowPathTo(west);
рд╡реНрдпрд╛рдкрдХ рдЦреЛрдЬ
GameBoard
рдХреЛ
GameBoard
рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рд╣реА рдкрде рдбреЗрдЯрд╛ рд╣реЛред рд╣рдо рдПрдХ рдЪреМрдбрд╝рд╛рдИ-рдкреНрд░рдердо рдЦреЛрдЬ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рдЗрди рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд╕рд╛рде, рджреВрд░реА рдПрдХ рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдкрде рд╡рд╛рд▓реЗ рдЯрд╛рдЗрд▓реЛрдВ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рд░рд╛рд╕реНрддреЗ рдХрднреА рдирд╣реАрдВ рдмрдврд╝рддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рднреА рдЯрд╛рдЗрд▓реЗрдВ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рд░рд╛рд╕реНрддреЗ рдХреЗ рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреАред
A * рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?рдП
* рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЪреМрдбрд╝рд╛рдИ-рдкреНрд░рдердо рдЦреЛрдЬ рдХрд╛ рд╡рд┐рдХрд╛рд╕рд╡рд╛рджреА рд╡рд┐рдХрд╛рд╕ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рд╣рдо рдПрдХрдорд╛рддреНрд░ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдорд╛рд░реНрдЧ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕рднреА рдЫреЛрдЯреЗ рд░рд╛рд╕реНрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП A
* рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреА рдПрдХ рдЧреНрд░рд┐рдб рдкрд░ рдЪреМрдбрд╝рд╛рдИ-рдкрд╣рд▓реА рдЦреЛрдЬ рдФрд░ рдП
* рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП,
рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рджреЗрдЦреЗрдВред
рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрди рдЯрд╛рдЗрд▓реЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдкрде рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрд┐рдирд╕реЗ рд╣рдордиреЗ рдЕрднреА рддрдХ рдкрде рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИред рдЯрд╛рдЗрд▓реНрд╕ рдХреЗ рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдХреНрд╕рд░ рдЦреЛрдЬ рд╕реАрдорд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЯрд╛рдЗрд▓реНрд╕ рдХреЛ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕реАрдорд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдП
Queue
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдмрд╛рдж рдореЗрдВ рд╣рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЦреЛрдЬ рдХрд░рдиреА рд╣реЛрдЧреА, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ
GameBoard
рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
using UnityEngine; using System.Collections.Generic; public class GameBoard : MonoBehaviour { тАж Queue<GameTile> searchFrontier = new Queue<GameTile>(); тАж }
рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреА рд╕реНрдерд┐рддрд┐ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
Initialize
рдХреЗ рдЕрдВрдд рдореЗрдВ рдорд╛рд░реНрдЧ рдЦреЛрдЬрдиреЗ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ
FindPaths
рд╡рд┐рдзрд┐ рдореЗрдВ
FindPaths
ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдЯрд╛рдЗрд▓ рдХреЛ рдЕрдВрдд рдмрд┐рдВрджреБ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рд╕реАрдорд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЪрд▓реЛ рдкрд╣рд▓реЗ рдкрд╣рд▓реА рдЯрд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЪреВрдВрдХрд┐
tiles
рдПрдХ рд╕рд░рдгреА рд╣реИ, рд╣рдо рдореЗрдореЛрд░реА рдкреНрд░рджреВрд╖рдг рдХреЗ рдбрд░ рдХреЗ рдмрд┐рдирд╛
foreach
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдо рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рдПрд░реЗ рд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд▓реВрдк рдХреЗ рд╕рд╛рде
foreach
рд▓реВрдк рдХреЛ рднреА рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
public void Initialize (Vector2Int size) { тАж FindPaths(); } void FindPaths () { foreach (GameTile tile in tiles) { tile.ClearPath(); } tiles[0].BecomeDestination(); searchFrontier.Enqueue(tiles[0]); }
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рд╕реАрдорд╛ рд╕реЗ рдПрдХ рдЯрд╛рдЗрд▓ рд▓реЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдЕрдкрдиреЗ рд╕рднреА рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрде рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЙрди рд╕рднреА рдХреЛ рд╕реАрдорд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдкрд╣рд▓реЗ рд╣рдо рдЙрддреНрддрд░, рдлрд┐рд░ рдкреВрд░реНрд╡, рджрдХреНрд╖рд┐рдг рдФрд░ рдЕрдВрдд рдореЗрдВ рдкрд╢реНрдЪрд┐рдо рдХреА рдУрд░ рдмрдврд╝реЗрдВрдЧреЗред
public void FindPaths () { foreach (GameTile tile in tiles) { tile.ClearPath(); } tiles[0].BecomeDestination(); searchFrontier.Enqueue(tiles[0]); GameTile tile = searchFrontier.Dequeue(); searchFrontier.Enqueue(tile.GrowPathNorth()); searchFrontier.Enqueue(tile.GrowPathEast()); searchFrontier.Enqueue(tile.GrowPathSouth()); searchFrontier.Enqueue(tile.GrowPathWest()); }
рд╣рдо рдЗрд╕ рдЪрд░рдг рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╕реАрдорд╛ рдореЗрдВ рдЯрд╛рдЗрд▓реЗрдВ рд╣реИрдВред
while (searchFrontier.Count > 0) { GameTile tile = searchFrontier.Dequeue(); searchFrontier.Enqueue(tile.GrowPathNorth()); searchFrontier.Enqueue(tile.GrowPathEast()); searchFrontier.Enqueue(tile.GrowPathSouth()); searchFrontier.Enqueue(tile.GrowPathWest()); }
рдПрдХ рдкрде рдмрдврд╝рддреЗ рд╣реБрдП рд╣рдореЗрд╢рд╛ рд╣рдореЗрдВ рдПрдХ рдирдИ рдЯрд╛рдЗрд▓ рддрдХ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ
null
рд▓рд┐рдП рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХрддрд╛рд░ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдмрд╛рдж рддрдХ
null
рд▓рд┐рдП рдЪреЗрдХ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
GameTile tile = searchFrontier.Dequeue(); if (tile != null) { searchFrontier.Enqueue(tile.GrowPathNorth()); searchFrontier.Enqueue(tile.GrowPathEast()); searchFrontier.Enqueue(tile.GrowPathSouth()); searchFrontier.Enqueue(tile.GrowPathWest()); }
рдкрде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд╣рдореЗрдВ рдпрд╣ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЖрдкрдХреЛ рддреАрд░реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдЕрдкрдиреА рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрде рдХреЗ рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдореЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпреЗ рдореЛрдбрд╝ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рджрд┐рд╢рд╛рдУрдВ рдХреЗ рд▓рд┐рдП
GameTile
рдПрдХ рд╕реНрдерд┐рд░
Quaternion
рдлрд╝реАрд▓реНрдб рдореЗрдВ
GameTile
ред
static Quaternion northRotation = Quaternion.Euler(90f, 0f, 0f), eastRotation = Quaternion.Euler(90f, 90f, 0f), southRotation = Quaternion.Euler(90f, 180f, 0f), westRotation = Quaternion.Euler(90f, 270f, 0f);
рд╕рд╛рдорд╛рдиреНрдп
ShowPath
рд╡рд┐рдзрд┐ рднреА рдЬреЛрдбрд╝реЗрдВред рдпрджрд┐ рджреВрд░реА рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдЯрд╛рдЗрд▓ рдЕрдВрдд рдмрд┐рдВрджреБ рд╣реИ рдФрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рддреАрд░ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВред рдЕрдиреНрдпрдерд╛, рддреАрд░ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВред рдЕрдЧрд▓реЗ рджрд┐рд╢рд╛ рдХреЛ рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рджрд┐рд╢рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
public void ShowPath () { if (distance == 0) { arrow.gameObject.SetActive(false); return; } arrow.gameObject.SetActive(true); arrow.localRotation = nextOnPath == north ? northRotation : nextOnPath == east ? eastRotation : nextOnPath == south ? southRotation : westRotation; }
рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдВрдд рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВ GameBoard.FindPaths
ред public void FindPaths () { тАж foreach (GameTile tile in tiles) { tile.ShowPath(); } }
рд░рд╛рд╕реНрддреЗ рдорд┐рд▓ рдЧрдПредрдХреНрдпреЛрдВ рди рд╣рдо рддреАрд░ рдХреЛ рд╕реАрдзреЗ GrowPathTo рдореЗрдВ рдмрджрд▓ рджреЗрдВ?. . , FindPaths
.
рдЦреЛрдЬ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдмрджрд▓реЗрдВ
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрдм рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рджрдХреНрд╖рд┐рдг-рдкрд╢реНрдЪрд┐рдо рдХреЛрдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рднреА рд░рд╛рд╕реНрддреЗ рдареАрдХ рдкрд╢реНрдЪрд┐рдо рддрдХ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдореИрджрд╛рди рдХреЗ рдХрд┐рдирд╛рд░реЗ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡реЗ рджрдХреНрд╖рд┐рдг рдХреА рдУрд░ рдореБрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рдЪ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрдд рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдЫреЛрдЯреЗ рд░рд╛рд╕реНрддреЗ рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдХрд░реНрдг рдЖрдВрджреЛрд▓рдиреЛрдВ рдЕрд╕рдВрднрд╡ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ рдЕрдиреНрдп рдЫреЛрдЯреЗ рд░рд╛рд╕реНрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВредрдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдРрд╕реЗ рд░рд╛рд╕реНрддреЗ рдХреНрдпреЛрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдВрдд рдмрд┐рдВрджреБ рдХреЛ рдирдХреНрд╢реЗ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВред рдПрдХ рд╡рд┐рд╖рдо рдХреНрд╖реЗрддреНрд░ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рд░рдгреА рдХреЗ рдмреАрдЪ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЯрд╛рдЗрд▓ рд╣реИред tiles[tiles.Length / 2].BecomeDestination(); searchFrontier.Enqueue(tiles[tiles.Length / 2]);
рдХреЗрдВрджреНрд░ рдореЗрдВ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБредрдкрд░рд┐рдгрд╛рдо рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ рдХрд┐ рдЦреЛрдЬ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рдЙрддреНрддрд░-рдкреВрд░реНрд╡-рджрдХреНрд╖рд┐рдг-рдкрд╢реНрдЪрд┐рдо рдХреНрд░рдо рдореЗрдВ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрддреНрддрд░ рдХреА рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рдЦреЛрдЬ рдХреЛ рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЬреЛ рдЕрдВрддрд┐рдо рдпрд╛рддреНрд░рд╛ рдХреА рд╣реИ рд╡рд╣ рджрдХреНрд╖рд┐рдг рд╣реИред рдЗрд╕реАрд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рддреАрд░ рджрдХреНрд╖рд┐рдг рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрдИ рдкреВрд░реНрд╡ рдХреА рдУрд░редрдЖрдк рджрд┐рд╢рд╛рдУрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдкреВрд░реНрд╡ рдФрд░ рджрдХреНрд╖рд┐рдг рдореЗрдВ рд╕реНрд╡реИрдк рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрддреНрддрд░-рджрдХреНрд╖рд┐рдг рдФрд░ рдкреВрд░реНрд╡-рдкрд╢реНрдЪрд┐рдо рд╕рдорд░реВрдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рд╣реЛрдЧреАред searchFrontier.Enqueue(tile.GrowPathNorth()); searchFrontier.Enqueue(tile.GrowPathSouth()); searchFrontier.Enqueue(tile.GrowPathEast()); searchFrontier.Enqueue(tile.GrowPathWest())
рдЦреЛрдЬ рдХреНрд░рдо рдЙрддреНрддрд░-рджрдХреНрд╖рд┐рдг-рдкреВрд░реНрд╡-рдкрд╢реНрдЪрд┐рдо рд╣реИредрдпрд╣ рд╕реБрдВрджрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджрд┐рд╢рд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ, рд╡рд┐рдХрд░реНрдг рдЖрдВрджреЛрд▓рди рдХреЗ рдХрд░реАрдм рдкрд╣реБрдВрдЪрдирд╛ рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧреЗрдЧрд╛ред рд╣рдо рдПрдХ рдЪреЗрдХрд░рдмреЛрд░реНрдб рдкреИрдЯрд░реНрди рдореЗрдВ рдкрдбрд╝реЛрд╕реА рдЯрд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЛ рдЙрд▓рдЯ рдХрд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐ рд╣рдо рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрд╛рдЗрд▓ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо GameTile
рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрд▓ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдпрд╛ рдирд╣реАрдВред public bool IsAlternative { get; set; }
рд╣рдо рдЗрд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЗрд╕рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ GameBoard.Initialize
ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЯрд╛рдЗрд▓реНрд╕ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ рдпрджрд┐ рдЙрдирдХрд╛ рдПрдХреНрд╕ рд╕рдордиреНрд╡рдп рднреА рд╣реИред for (int i = 0, y = 0; y < size.y; y++) { for (int x = 0; x < size.x; x++, i++) { тАж tile.IsAlternative = (x & 1) == 0; } }
рдСрдкрд░реЗрд╢рди (x & 1) == 0 рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?тАФ (AND). . 1, 1. 10101010 00001111 00001010.
. 0 1. 1, 2, 3, 4 1, 10, 11, 100. , .
AND , , . , .
рджреВрд╕рд░реЗ, рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╕рдВрдХреЗрдд рдмрджрд▓рддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрдирдХрд╛ Y рд╕рдордиреНрд╡рдп рднреА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╢рддрд░рдВрдЬ рдкреИрдЯрд░реНрди рдмрдирд╛рдПрдВрдЧреЗред tile.IsAlternative = (x & 1) == 0; if ((y & 1) == 0) { tile.IsAlternative = !tile.IsAlternative; }
рдЬреИрд╕рд╛ рдХрд┐ FindPaths
рд╣рдо рд╡рд┐рдХрд▓реНрдк рдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдХреНрд░рдо рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рдкрд╕ рдЕрдиреНрдп рд╕рднреА рдЯрд╛рдЗрд▓реНрд╕ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдкрде рдХреЛ рд╡рд┐рдХрд░реНрдг рдЖрдВрджреЛрд▓рди рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рджреЗрдЧрд╛ рдФрд░ zigzags рдмрдирд╛рдПрдЧрд╛ред if (tile != null) { if (tile.IsAlternative) { searchFrontier.Enqueue(tile.GrowPathNorth()); searchFrontier.Enqueue(tile.GrowPathSouth()); searchFrontier.Enqueue(tile.GrowPathEast()); searchFrontier.Enqueue(tile.GrowPathWest()); } else { searchFrontier.Enqueue(tile.GrowPathWest()); searchFrontier.Enqueue(tile.GrowPathEast()); searchFrontier.Enqueue(tile.GrowPathSouth()); searchFrontier.Enqueue(tile.GrowPathNorth()); } }
рдЪрд░ рдЦреЛрдЬ рдХреНрд░рдоредрдЯрд╛рдЗрд▓реНрд╕ рдмрджрд▓рдирд╛
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╕рднреА рдЯрд╛рдЗрд▓реЗрдВ рдЦрд╛рд▓реА рд╣реИрдВред рдПрдХ рдЯрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рджреГрд╢реНрдп рддреАрд░ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рднреА рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИред рд╣рдо рдЙрди рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд░рдЦрдХрд░ рдЯрд╛рдЗрд▓ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗредрдЯрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА
рдЯрд╛рдЗрд▓ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╕реНрд╡рдпрдВ рдЯрд╛рдЗрд▓ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рд╣рдо рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реАрдзреЗ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЕрд▓рдЧ рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдлрд╝реАрд▓реНрдб рдкрд░ рд░рдЦреЗрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЦрд╛рд▓реА рдЯрд╛рдЗрд▓ рдФрд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЯрд╛рдЗрд▓ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЧрдгрдирд╛ рдмрдирд╛рдПрдВ GameTileContentType
ред public enum GameTileContentType { Empty, Destination }
рдЕрдЧрд▓рд╛, рдПрдХ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдВ рдЬреЛ GameTileContent
рдЖрдкрдХреЛ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрдЧреАред using UnityEngine; public class GameTileContent : MonoBehaviour { [SerializeField] GameTileContentType type = default; public GameTileContentType Type => type; }
рдлрд┐рд░ рд╣рдо рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдлрд╝реИрдмреНрд╕ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ GameTileContent
рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдХ рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЯрд╛рдЗрд▓реНрд╕ рдХреЛ рдирд╛рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреАрд▓реЗ рдЪрдкрдЯреЗ рдХреНрдпреВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рд╕рдкрд╛рдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕реЗ рдПрдХ рдХреЛрд▓рд╛рдЗрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЦрд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░реАрдлрд╝реИрдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЦрд╛рд▓реА рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредрд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдФрд░ рдЦрд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХреЗ Prefabsредрд╣рдо рдЦрд╛рд▓реА рдЯрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд╛рдордЧреНрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рддрдм рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕рд╛рдордЧреНрд░реА рд╣реЛрдЧреА, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдВрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА null
редрд╕рд╛рдордЧреНрд░реА рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛
рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рднреА рдмрдирд╛рдПрдВрдЧреЗ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ GameTileContent
рдЕрдкрдиреЗ рдореВрд▓ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╡рд┐рдзрд┐ рдореЗрдВ рдЦреБрдж рдХреЛ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рд╡рд╛рдкрд╕ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП Recycle
ред GameTileContentFactory originFactory; тАж public GameTileContentFactory OriginFactory { get => originFactory; set { Debug.Assert(originFactory == null, "Redefined origin factory!"); originFactory = value; } } public void Recycle () { originFactory.Reclaim(this); }
рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ GameTileContentFactory
, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпреЛрдЧреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдВрдЧреЗ Recycle
ред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдо рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдЬреЛ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрдВрдЧреЗред рдмрд╛рдж рдореЗрдВ рдмрд╛рдХреА рдХреЛрдб рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред using UnityEngine; using UnityEngine.SceneManagement; [CreateAssetMenu] public class GameTileContentFactory : ScriptableObject { public void Reclaim (GameTileContent content) { Debug.Assert(content.OriginFactory == this, "Wrong factory reclaimed!"); Destroy(content.gameObject); } }
Get
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реАрдлрд╝реИрдм рдХреЗ рд╕рд╛рде рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдПрдХ рдЫрд┐рдкреА рд╣реБрдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ ред рдпрд╣рд╛рдБ рд╣рдо рдлрд┐рд░ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВред рд╡рд╣ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдореВрд▓ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рджреГрд╢реНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред GameTileContent Get (GameTileContent prefab) { GameTileContent instance = Instantiate(prefab); instance.OriginFactory = this; MoveToFactoryScene(instance.gameObject); return instance; }
рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд╝реИрдХреНрдЯрд░реА рд╕рд╛рдордЧреНрд░реА рджреГрд╢реНрдп рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╣реИрдВ, рддреЛ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рдЕрдЧрд░ рд╣рдо рдПрдХ рдЧрд░реНрдо рдкреБрдирд░рд╛рд░рдВрдн рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВред Scene contentScene; тАж void MoveToFactoryScene (GameObject o) { if (!contentScene.isLoaded) { if (Application.isEditor) { contentScene = SceneManager.GetSceneByName(name); if (!contentScene.isLoaded) { contentScene = SceneManager.CreateScene(name); } } else { contentScene = SceneManager.CreateScene(name); } } SceneManager.MoveGameObjectToScene(o, contentScene); }
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдкреНрд░реАрдлрд╝реИрдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВред [SerializeField] GameTileContent destinationPrefab = default; [SerializeField] GameTileContent emptyPrefab = default;
рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдВрддрд┐рдо рдЪреАрдЬ Get
рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИ GameTileContentType
рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░реАрдлреИрдм рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред public GameTileContent Get (GameTileContentType type) { switch (type) { case GameTileContentType.Destination: return Get(destinationPrefab); case GameTileContentType.Empty: return Get(emptyPrefab); } Debug.Assert(false, "Unsupported type: " + type); return null; }
рдХреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрд▓ рдореЗрдВ рдЦрд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ?, . . , - , , , , . , . , , .
рдЪрд▓реЛ рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреА рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдкреНрд░реАрдлреИрдм рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВредрд╕рд╛рдордЧреНрд░реА рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛рдФрд░ рдлрд┐рд░ Game
рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рд▓рд┐рдВрдХ рдкрд╛рд╕ рдХрд░реЗрдВ ред [SerializeField] GameTileContentFactory tileContentFactory = default;
рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдЦреЗрд▓редрдПрдХ рдЯрд╛рдЗрд▓ рджреЛрд╣рди
рдлрд╝реАрд▓реНрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЯрд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЗрд╕реЗ рдЧреЗрдо рдореЛрдб рдореЗрдВ рд╕рдВрднрд╡ рдмрдирд╛рдПрдВрдЧреЗред рд╣рдо рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдмреАрдо рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдЦреЗрд▓ рд╡рд┐рдВрдбреЛ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдмреАрдо рдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдШреВрдорддрд╛ рд╣реИ, рддреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдиреЗ рдЗрд╕реЗ рдЫреБрдЖ, рдЕрд░реНрдерд╛рдд, рдЗрд╕реЗ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред Game
рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд┐рд╕ рдЯрд╛рдЗрд▓ рдХреЛ рдЫреВрддрд╛ рд╣реИ GameBoard
редрд╕рднреА рдХрд┐рд░рдгреЗрдВ рдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдХреБрдЫ рднреА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЙрд╕ GameBoard
рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ GetTile
, рдЬреЛ рд╣рдореЗрд╢рд╛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реМрдЯрддреА рд╣реИ null
(рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЯрд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА рдереА)ред public GameTile GetTile (Ray ray) { return null; }
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдХрд┐рд░рдг рдиреЗ рдЯрд╛рдЗрд▓ рдкрд╛рд░ рдХрд░ рд▓реА рд╣реИ, рд╣рдореЗрдВ Physics.Raycast
рдХрд┐рд░рдг рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЪреМрд░рд╛рд╣рд╛ рдерд╛ред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЯрд╛рдЗрд▓ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреМрди рд╕рд╛ рдЕрднреА рддрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗ null
ред public GameTile TryGetTile (Ray ray) { if (Physics.Raycast(ray) { return null; } return null; }
рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЪреМрд░рд╛рд╣рд╛ рдерд╛, рд╣рдореЗрдВ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Physics.Raycast
рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ RaycastHit
ред рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЬреЛ out
рдЗрд╕рдХреЗ рд╕рд╛рдордиреЗ рд╢рдмреНрдж рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдЙрд╕ рдЪрд░ рдХреЛ рдПрдХ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред RaycastHit hit; if (Physics.Raycast(ray, out hit) { return null; }
рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред if (Physics.Raycast(ray, out RaycastHit hit) { return null; }
рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рдХрд┐ рдХрд┐рд╕ рдЪреМрд░рд╛рд╣реЗ рдкрд░ рдХреЛрд▓рд╛рдЗрдбрд░ рд╣реБрдЖ рд╣реИ, рд╣рдо рдЯрд╛рдЗрд▓ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл XZ рдЪреМрд░рд╛рд╣реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдзреЗ рдЖрдХрд╛рд░ рдХреЛ рдЪреМрд░рд╛рд╣реЗ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдЯрд╛рдЗрд▓ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдВрддрд┐рдо рдЯрд╛рдЗрд▓ рд╕реВрдЪрдХрд╛рдВрдХ рдЗрд╕рдХрд╛ рдПрдХреНрд╕ рд╕рдордиреНрд╡рдп рд╣реЛрдЧрд╛ рдФрд░ рд╡рд╛рдИ рдЪреМрдбрд╝рд╛рдИ рдХреНрд╖реЗрддреНрд░ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдЧрд╛ред if (Physics.Raycast(ray, out RaycastHit hit)) { int x = (int)(hit.point.x + size.x * 0.5f); int y = (int)(hit.point.z + size.y * 0.5f); return tiles[x + y * size.x]; }
рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рд╕рдВрднрд╡ рд╣реИ рдЬрдм рдЯрд╛рдЗрд▓ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рднреАрддрд░ рд╣реЛрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЯрд╛рдЗрд▓ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред int x = (int)(hit.point.x + size.x * 0.5f); int y = (int)(hit.point.z + size.y * 0.5f); if (x >= 0 && x < size.x && y >= 0 && y < size.y) { return tiles[x + y * size.x]; }
рд╕рд╛рдордЧреНрд░реА рдкрд░рд┐рд╡рд░реНрддрди
рддрд╛рдХрд┐ рдЖрдк рдЯрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рд╕рдХреЗрдВ, GameTile
рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХреЗрдВ Content
ред рдЗрд╕рдХрд╛ рдЧреЗрдЯрдЯрд░ рдХреЗрд╡рд▓ рд╕рд╛рдордЧреНрд░реА рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕реЗрдЯрд░ рдкрд┐рдЫрд▓реА рд╕рд╛рдордЧреНрд░реА, рдпрджрд┐ рдХреЛрдИ рд╣реЛ, рдФрд░ рдирдИ рд╕рд╛рдордЧреНрд░реА рд░рдЦрддрд╛ рд╣реИред GameTileContent content; public GameTileContent Content { get => content; set { if (content != null) { content.Recycle(); } content = value; content.transform.localPosition = transform.localPosition; } }
рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдРрд╕реА рдЬрдЧрд╣ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ null
, рдХреНрдпреЛрдВрдХрд┐ рд╢реБрд░реВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реИред рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджрд╛рд╡реЗ рдкрд░ рдЕрдорд▓ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕реЗрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рди рдЬрд╛рдП null
ред set { Debug.Assert(value != null, "Null assigned to content!"); тАж }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдЗрдирдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХреЛ рдПрдХ рдХрд┐рд░рдг рдореЗрдВ рдмрджрд▓рдирд╛ рддрд░реНрдХ рдХреЗ ScreenPointToRay
рд╕рд╛рде рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ Input.mousePosition
ред рдХреЙрд▓ рдореБрдЦреНрдп рдХреИрдорд░рд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ Camera.main
ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреБрдг рдЧ рдЬреЛрдбрд╝реЗрдВ Game
ред Ray TouchRay => Camera.main.ScreenPointToRay(Input.mousePosition);
рдлрд┐рд░ рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ Update
рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрдирдпрди рдХреЗ рджреМрд░рд╛рди рдореБрдЦреНрдп рдорд╛рдЙрд╕ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Input.GetMouseButtonDown
рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВ ред рдпрджрд┐ рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрдкрд░реНрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд╣рдо рдЯрд╛рдЗрд▓ рдХреЛ рдлрд╝реАрд▓реНрдб рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВред void Update () { if (Input.GetMouseButtonDown(0)) { HandleTouch(); } } void HandleTouch () { GameTile tile = GetTile(TouchRay); if (tile != null) { tile.Content = tileContentFactory.Get(GameTileContentType.Destination); } }
рдЕрдм рд╣рдо рдХрд░реНрд╕рд░ рдХреЛ рджрдмрд╛рдХрд░ рдХрд┐рд╕реА рднреА рдЯрд╛рдЗрд▓ рдХреЛ рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВредрдХрдИ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБредрдЦреЗрдд рдХреЛ рд╕рд╣реА рдмрдирд╛рдирд╛
рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╣рдо рдЯрд╛рдЗрд▓реНрд╕ рдХреЛ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рддрдХ рдХреЗ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рдЕрднреА рддрдХ рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХреА рд╣реИред рдХреНрд╖реЗрддреНрд░ рдХреА рд╢реБрджреНрдзрддрд╛ рдФрд░ рдЕрдЦрдВрдбрддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ GameBoard
, рдЗрд╕рд▓рд┐рдП рдЪрд▓реЛ рдЙрд╕реЗ рдЯрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рджреЗрдВред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗрдВрдЧреЗ Intialize
, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдХреЛ рдЦрд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред GameTileContentFactory contentFactory; public void Initialize ( Vector2Int size, GameTileContentFactory contentFactory ) { this.size = size; this.contentFactory = contentFactory; ground.localScale = new Vector3(size.x, size.y, 1f); tiles = new GameTile[size.x * size.y]; for (int i = 0, y = 0; y < size.y; y++) { for (int x = 0; x < size.x; x++, i++) { тАж tile.Content = contentFactory.Get(GameTileContentType.Empty); } } FindPaths(); }
рдЕрдм рдореБрдЭреЗ Game
рдЕрдкрдиреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред void Awake () { board.Initialize(boardSize, tileContentFactory); }
GameBoard рдореЗрдВ рдлрд╝реИрдХреНрдЯрд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реАрд▓реНрдб рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реА рдЧрдИ?, , . , .
рдЪреВрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИрдВ, GameBoard.FindPaths
рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ BecomeDestination
рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗ рдФрд░ рдЙрди рд╕рднреА рдХреЛ рд╕реАрдорд╛ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕рдм рдХрдИ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдЯрд╛рдЗрд▓реЗрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╕рд╛рдл рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣рд╛рд░реНрдб-рд╕реЗрдЯ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред void FindPaths () { foreach (GameTile tile in tiles) { if (tile.Content.Type == GameTileContentType.Destination) { tile.BecomeDestination(); searchFrontier.Enqueue(tile); } else { tile.ClearPath(); } }
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЯрд╛рдЗрд▓реНрд╕ рдХреЛ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд░рд┐рд╡рд░реНрд╕ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдЦрд╛рд▓реА рдЯрд╛рдЗрд▓реНрд╕ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рддрдм рд╣рдореЗрдВ рдХреЛрдИ рднреА рдЕрдВрдХ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, FindPaths
рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрде рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╕реАрдорд╛ рдЦрд╛рд▓реА рд╣реЛрддреА рд╣реИред рд╣рдо рдЗрд╕реЗ рдХреНрд╖реЗрддреНрд░ рдХреА рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ false
рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ; рдЕрдиреНрдпрдерд╛ рдЕрдВрдд рдореЗрдВ рд▓реМрдЯреЗрдВ true
ред bool FindPaths () { foreach (GameTile tile in tiles) { тАж } if (searchFrontier.Count == 0) { return false; } тАж return true; }
рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛, рдЗрд╕реЗ рдПрдХ рд╕реНрд╡рд┐рдЪ рдСрдкрд░реЗрд╢рди рдмрдирд╛рдирд╛ред рдЦрд╛рд▓реА рдЯрд╛рдЗрд▓реЛрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ, рдФрд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИ GameBoard
, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рджреЗрдВрдЧреЗ ToggleDestination
, рдЬрд┐рд╕рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЯрд╛рдЗрд▓ рд╣реИред рдпрджрд┐ рдЯрд╛рдЗрд▓ рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЦрд╛рд▓реА рдХрд░реЗрдВ рдФрд░ рдХреЙрд▓ рдХрд░реЗрдВ FindPaths
ред рдЕрдиреНрдпрдерд╛, рд╣рдо рдЗрд╕реЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рднреА рдХрд░рддреЗ рд╣реИрдВ FindPaths
ред public void ToggleDestination (GameTile tile) { if (tile.Content.Type == GameTileContentType.Destination) { tile.Content = contentFactory.Get(GameTileContentType.Empty); FindPaths(); } else { tile.Content = contentFactory.Get(GameTileContentType.Destination); FindPaths(); } }
рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЬреЛрдбрд╝рдирд╛ рдХрднреА рднреА рдПрдХ рдЕрдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ FindPaths
рд╣рдордиреЗ рдЯрд╛рдЗрд▓ рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд░рджреНрдж рдХрд░реЗрдВ, рдЯрд╛рдЗрд▓ рдХреЛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдПрдВ, рдФрд░ FindPaths
рдкрд┐рдЫрд▓реА рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ ред if (tile.Content.Type == GameTileContentType.Destination) { tile.Content = contentFactory.Get(GameTileContentType.Empty); if (!FindPaths()) { tile.Content = contentFactory.Get(GameTileContentType.Destination); FindPaths(); } }
рдХреНрдпрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?, . , . , . FindPaths
, .
рдЕрдм рдЕрдВрдд рдореЗрдВ Initialize
рд╣рдо ToggleDestination
рдХреЗрдВрджреНрд░реАрдп рдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ FindPaths
ред рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рдордп рд╣реИ рдЬрдм рд╣рдо рдПрдХ рдЕрдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред public void Initialize ( Vector2Int size, GameTileContentFactory contentFactory ) { тАж
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЯрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрд╡рдпрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп Game
рдХреЙрд▓ ToggleDestination
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддреЗ рд╣реИрдВред void HandleTouch () { GameTile tile = board.GetTile(TouchRay); if (tile != null) {
рд╕рд╣реА рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБредрдХреНрдпрд╛ рд╣рдореЗрдВ рдЧреЗрдо рдХреЛ рдЯрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реАрдзреЗ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?. . , Game
. , .
рджреАрд╡рд╛рд░реЗрдВ
рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдХрд╛ рд▓рдХреНрд╖реНрдп рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рд╣реИред рдпрд╣ рд▓рдХреНрд╖реНрдп рджреЛ рддрд░рд╣ рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдорд╛рд░рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдзреАрдорд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдорд╛рд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рд╕рдордп рд╣реЛред рдЯрд╛рдЗрд▓ рдХреНрд╖реЗрддреНрд░ рдкрд░, рд╕рдордп рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд░рдЦрдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдпреЗ рдЯреЙрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рднреА рдорд╛рд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдо рдЦреБрдж рдХреЛ рдХреЗрд╡рд▓ рджреАрд╡рд╛рд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд▓реЗрдВрдЧреЗредрдЕрдВрддрд░реНрд╡рд╕реНрддреБ
рджреАрд╡рд╛рд░реЗрдВ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП GameTileContentType
рдЙрдирдореЗрдВ рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред public enum GameTileContentType { Empty, Destination, Wall }
рдлрд┐рд░ рджреАрд╡рд╛рд░ рдХреЛ рдкреНрд░реАрдлреИрдм рдмрдирд╛рдПрдВред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдЯрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдмрдЪреНрдЪрд╛ рдХреНрдпреВрдм рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬреЛ рдореИрджрд╛рди рдХреЗ рдКрдкрд░ рд╣реЛрдЧрд╛ рдФрд░ рдкреВрд░реА рдЯрд╛рдЗрд▓ рдХреЛ рднрд░ рджреЗрдЧрд╛ред рдЗрд╕реЗ рдЖрдзрд╛ рдпреВрдирд┐рдЯ рдКрдВрдЪрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдХреЛрд▓рд╛рдЗрдбрд░ рдХреЛ рдмрдЪрд╛рдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рджреАрд╡рд╛рд░реЗрдВ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреА рдЯрд╛рдЗрд▓реЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рджреЗрдЦ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдХреЛрдИ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд┐рд╕реА рджреАрд╡рд╛рд░ рдХреЛ рдЫреВрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рдЯрд╛рдЗрд▓ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛редPrefab рджреАрд╡рд╛рд░редрдХреЛрдб рдФрд░ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рджреЛрдиреЛрдВ рдореЗрдВ рджреАрд╡рд╛рд░ рдкреНрд░реАрдлрд╝реИрдм рдХреЛ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред [SerializeField] GameTileContent wallPrefab = default; тАж public GameTileContent Get (GameTileContentType type) { switch (type) { case GameTileContentType.Destination: return Get(destinationPrefab); case GameTileContentType.Empty: return Get(emptyPrefab); case GameTileContentType.Wall: return Get(wallPrefab); } Debug.Assert(false, "Unsupported type: " + type); return null; }
рдкреНрд░реАрдлреИрдм рджреАрд╡рд╛рд░ рдХреЗ рд╕рд╛рде рдлреИрдХреНрдЯрд░реАредрджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдЪрд╛рд▓реВ рдФрд░ рдмрдВрдж рдХрд░реЗрдВ
GameBoard
рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рдЪрд╛рд▓реВ / рдмрдВрдж рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ , рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдЕрдВрдд рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдо рдлрд╝реАрд▓реНрдб рдХреА рдЧрд▓рдд рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред public void ToggleWall (GameTile tile) { if (tile.Content.Type == GameTileContentType.Wall) { tile.Content = contentFactory.Get(GameTileContentType.Empty); FindPaths(); } else { tile.Content = contentFactory.Get(GameTileContentType.Wall); FindPaths(); } }
рд╣рдо рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рдЯрд╛рдЗрд▓ рдФрд░ рджреАрд╡рд╛рд░ рдЯрд╛рдЗрд▓ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ, рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рджреАрд╡рд╛рд░ рдмрдирд╛рдПрдВрдЧреЗ рдЬрдм рдЯрд╛рдЗрд▓ рдЦрд╛рд▓реА рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рд░рд╛рд╕реНрддреЗ рдХреА рдЦреЛрдЬ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрд▓ рдореЗрдВ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рджреБрд╢реНрдорди рдлрдВрд╕ рдЬрд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ FindPaths
, рдФрд░ рдпрджрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдЧрд▓рдд рдлрд╝реАрд▓реНрдб рд╕реНрдЯреЗрдЯ рдмрдирд╛рдпрд╛ рд╣реИ рддреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред else if (tile.Content.Type == GameTileContentType.Empty) { tile.Content = contentFactory.Get(GameTileContentType.Wall); if (!FindPaths()) { tile.Content = contentFactory.Get(GameTileContentType.Empty); FindPaths(); } }
рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдЪрд╛рд▓реВ рдФрд░ рдмрдВрдж рдХрд░рдирд╛, рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо Game
рдореБрдЦреНрдп рд╕реНрдкрд░реНрд╢ рдореЗрдВ рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ ред рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдкрд░реНрд╢ (рдЖрдорддреМрд░ рдкрд░ рд╕рд╣реА рдорд╛рдЙрд╕ рдмрдЯрди) рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ Input.GetMouseButtonDown
1 рдХреЗ рдорд╛рди рд╕реЗ рдкрд╛рд╕ рдХрд░рдХреЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред void Update () { if (Input.GetMouseButtonDown(0)) { HandleTouch(); } else if (Input.GetMouseButtonDown(1)) { HandleAlternativeTouch(); } } void HandleAlternativeTouch () { GameTile tile = board.GetTile(TouchRay); if (tile != null) { board.ToggleDestination(tile); } } void HandleTouch () { GameTile tile = board.GetTile(TouchRay); if (tile != null) { board.ToggleWall(tile); } }
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреАрд╡рд╛рд░реЗрдВ рд╣реИрдВредрдореБрдЭреЗ рддрд┐рд░рдЫреЗ рдЖрд╕рдиреНрди рджреАрд╡рд╛рд░реЛрдВ рдХреА рдЫрд╛рдпрд╛ рдХреЗ рдмреАрдЪ рдмрдбрд╝реЗ рдЕрдВрддрд░рд╛рд▓ рдХреНрдпреЛрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ?, , , . , , far clipping plane . , far plane 20 . , MSAA, .
рдЪрд▓реЛ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╕реАрдзреЗ рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред public void ToggleDestination (GameTile tile) { if (tile.Content.Type == GameTileContentType.Destination) { тАж } else if (tile.Content.Type == GameTileContentType.Empty) { tile.Content = contentFactory.Get(GameTileContentType.Destination); FindPaths(); } }
рдкрд╛рде рд╕рд░реНрдЪ рд▓реЙрдХ
рд░рд╛рд╕реНрддреЗ рдХреА рдЦреЛрдЬ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рд╣рдо рдЦреЛрдЬ рд╕реАрдорд╛ рдкрд░ рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрд▓ рди рдЬреЛрдбрд╝реЗрдВред рдпрд╣ GameTile.GrowPathTo
рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрд▓реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд▓реЗрдХрд┐рди рдкрде рдЕрднреА рднреА рджреАрд╡рд╛рд░ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдореИрджрд╛рди рдкрд░ рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рдорд╛рд░реНрдЧ рд╣реЛред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рджреБрд╢реНрдордиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд╛рдЗрд▓ рдЕрдЪрд╛рдирдХ рдПрдХ рджреАрд╡рд╛рд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧреАред GameTile GrowPathTo (GameTile neighbor) { if (!HasPath || neighbor == null || neighbor.HasPath) { return null; } neighbor.distance = distance + 1; neighbor.nextOnPath = this; return neighbor.Content.Type != GameTileContentType.Wall ? neighbor : null; }
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рдкрд╛рд╕ рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ, GameBoard.FindPaths
рдЦреЛрдЬ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝реАрд▓реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдЕрдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ false
ред рдЕрдорд╛рдиреНрдп рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝реАрд▓реНрдб рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред bool FindPaths () { тАж foreach (GameTile tile in tiles) { if (!tile.HasPath) { return false; } } foreach (GameTile tile in tiles) { tile.ShowPath(); } return true; }
рджреАрд╡рд╛рд░реЗрдВ рд░рд╛рд╕реНрддреЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИрдВредрдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рджреАрд╡рд╛рд░реЛрдВ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдкрд╛рд░рднрд╛рд╕реА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдкрд╛рд░рджрд░реНрд╢реА рджреАрд╡рд╛рд░реЗрдВредрдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рднреА рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╣реА рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдШреЗрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╣реИред рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдЧрд░ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реЛред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рджреАрд╡рд╛рд░ рдХреЛ рдПрдХ рдЦрд╛рд▓реА рдЯрд╛рдЗрд▓ рдпрд╛ рдЕрдВрдд рдмрд┐рдВрджреБ рд╕реЗ рд╕рдЯреЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдПрдХ рдкрде рдирд╣реАрдВ рд╣реЛ рдкрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 3 ├Ч 3 рджреАрд╡рд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдареЛрд╕ рдмреНрд▓реЙрдХ рдмрдирд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИредрд░рд╛рд╕реНрддрд╛ рдЫрд┐рдкрд╛рдУ
рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкрде рдЦреЛрдЬ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдЗрдП рддреАрд░ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдпрд╣ GameTile
рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ HidePath
, рдЬреЛ рдмрд╕ рдЗрд╕рдХреЗ рддреАрд░ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред public void HidePath () { arrow.gameObject.SetActive(false); }
рдкрде рдореИрдкрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдлрд╝реАрд▓реНрдб рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЛ рдЯреНрд░реИрдХ GameBoard
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рдПрдХ рдмреВрд▓рд┐рдпрди рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ false
, рд╕рд╛рде рд╣реА рдПрдХ рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ред рд╕реЗрдЯрд░ рдХреЛ рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдкрд░ рдкрде рджрд┐рдЦрд╛рдирд╛ рдпрд╛ рдЫрд┐рдкрд╛рдирд╛ рд╣реЛрдЧрд╛ред bool showPaths; public bool ShowPaths { get => showPaths; set { showPaths = value; if (showPaths) { foreach (GameTile tile in tiles) { tile.ShowPath(); } } else { foreach (GameTile tile in tiles) { tile.HidePath(); } } } }
рдЕрдм рдкрджреНрдзрддрд┐ FindPaths
рдХреЛ рдЕрджреНрдпрддрди рдкрде рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдХреНрд╖рдо рд╣реЛред bool FindPaths () { тАж if (showPaths) { foreach (GameTile tile in tiles) { tile.ShowPath(); } } return true; }
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкрде рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЕрдХреНрд╖рдо рд╣реИред рдЯрд╛рдЗрд▓ рдкреНрд░реАрдлрд╝реИрдм рдореЗрдВ рддреАрд░ рдХреЛ рдмрдВрдж рдХрд░реЗрдВредрдкреНрд░реАрдлрд╝реИрдм рддреАрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИредрд╣рдо рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ Game
рдПрдХ рдХреБрдВрдЬреА рджрдмрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░реЗред рдкреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХрддрд╛ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЧреЗрдо рдореЛрдб рдХреЛ рд╕рдХреНрд╖рдо / рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╣реЙрдЯрдХреА рднреА рд╣реИред рдирддреАрдЬрддрди, рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рддрдм рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдЧрд╛ рдЬрдм рдЧреЗрдо рдореЛрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЙрдЯрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рддреЛ рдЖрдЗрдП V рдХреБрдВрдЬреА (рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредрдХреЛрдИ рддреАрд░ рдирд╣реАрдВредрдЧреНрд░рд┐рдб рдкреНрд░рджрд░реНрд╢рди
рдЬрдм рддреАрд░ рдЫрд┐рдкреЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрд▓ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЧреНрд░рд┐рдб рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╕реЗ рдПрдХ рдЪреМрдХреЛрд░ рдмреЙрд░реНрдбрд░ рдореЗрд╢ рдЯреЗрдХреНрд╕рдЪрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЯрд╛рдЗрд▓ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдореЗрд╖ рдмрдирд╛рд╡рдЯредрд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрд▓ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рдмрдирд╛рд╡рдЯ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬрдореАрди рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдЧреНрд░рд┐рдб рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдПрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рджреГрд╢реНрдп рднреА рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо GameBoard
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ Texture2D
рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрд╖ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗред [SerializeField] Texture2D gridTexture = default;
рдореЗрд╖ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдХреНрд╖реЗрддреНрд░редрдЧреНрд░рд┐рдб рджреГрд╢реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмреБрд▓рд┐рдпрди рдлрд╝реАрд▓реНрдб рдФрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реЗрдЯрд░ рдХреЛ рдкреГрдереНрд╡реА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдкреГрдереНрд╡реА рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ GetComponent<MeshRenderer>
рдФрд░ material
рдкрд░рд┐рдгрд╛рдо рдХреА рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдпрджрд┐ рдЧреНрд░рд┐рдб рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо mainTexture
рднреМрддрд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреНрд░рд┐рдб рдмрдирд╛рд╡рдЯ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВрдЧреЗ ред рдЕрдиреНрдпрдерд╛, рдЙрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ null
ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдЖрдк рд╕рд╛рдордЧреНрд░реА рдХреА рдмрдирд╛рд╡рдЯ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рдордЧреНрд░реА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рднреМрддрд┐рдХ рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред bool showGrid, showPaths; public bool ShowGrid { get => showGrid; set { showGrid = value; Material m = ground.GetComponent<MeshRenderer>().material; if (showGrid) { m.mainTexture = gridTexture; } else { m.mainTexture = null; } } }
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ Game
рд▓рд┐рдП рдЧреНрд░рд┐рдб рджреГрд╢реНрдп рджрдмрд╛рдиреЗ рдЬреА рджреНрд╡рд╛рд░рд╛ рдмрдВрдж void Update () { тАж if (Input.GetKeyDown(KeyCode.G)) { board.ShowGrid = !board.ShowGrid; } }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЗрд╖ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ Awake
ред void Awake () { board.Initialize(boardSize, tileContentFactory); board.ShowGrid = true; }
рдЕрдирд╕реНрдХрд┐рд▓реНрдб рдЧреНрд░рд┐рдбредрдЕрдм рддрдХ рд╣рдореЗрдВ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рд╕реАрдорд╛ рдорд┐рд▓ рдЧрдИ рд╣реИред рдпрд╣ рдмрдирд╛рд╡рдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреА рдореБрдЦреНрдп рдмрдирд╛рд╡рдЯ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЧреНрд░рд┐рдб рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПред рдЖрдк рдЗрд╕реЗ рдЯреЗрдХреНрд╕рдЯрд╛рдЗрд▓SetTextureScale
рдкреНрд░реЙрдкрд░реНрдЯреА ( _MainTex ) рдФрд░ рдЯреВ-рдбрд╛рдпрдореЗрдВрд╢рдирд▓ рд╕рд╛рдЗрдЬ рдХреЗ рдирд╛рдо рд╕реЗ рдордЯреАрд░рд┐рдпрд▓ рдореЗрдердб рдХрд╣рдХрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рд╣рдо рд╕реАрдзреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ Vector2
ред if (showGrid) { m.mainTexture = gridTexture; m.SetTextureScale("_MainTex", size); }
рдкрде рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рд╕реНрдХреЗрд▓ рдЧреНрд░рд┐рдб рдмрдВрдж рдФрд░ рдЪрд╛рд▓реВредрдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдореЗрдВ рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рд╢реИрд▓реА рдХреЗ рдПрдХ рдЯрд╛рдЗрд▓ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдХреНрд╖реЗрддреНрд░ рдорд┐рд▓рд╛ред рдЕрдЧрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдо рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдкреАрдбреАрдПрдлрд░рд┐рдкреЛрдЬрд┐рдЯрд░реА