рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдпреВрдирд┐рдЯреА рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдкрд╛рддрд╛ рд╣реИред рдФрд░ рд╡рд╣ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╡рд░реАрдпрддрд╛ рджреА рдЬрд╛рдПред
рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдореИрдВ рдЕрдХреНрд╕рд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдПрдХ рдмрд╛рд░, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд┐рдпрд╛ рдФрд░ рдЙрдирдореЗрдВ рдХрдИ рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ред
рдмреБрд░рд╛ рд╕рдкрдирд╛
рдЗрдВрдЬрди рдХреЗрд╡рд▓ рдХреБрдЫ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдХрдИ рдЕрдзрд┐рднрд╛рд░:
рд▓реЙрдиреНрдЪ ( рдбреЙрдХреНрд╕ )
StartCoroutine(string name, object value = null)
StartCoroutine(IEnumerator routine)
рдмрдВрдж рдХрд░реЛ ( рдбреЙрдХреНрд╕ )
StopCoroutine(string methodName)
StopCoroutine(IEnumerator routine)
StopCoroutine(Coroutine routine)
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реЛрдб (рдЙрдирдХреА рднреНрд░рд╛рдордХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж) рддреБрд░рдВрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреВрдбрд╝реЗрджрд╛рди рдореЗрдВ рднреЗрдЬреЗрдВ рдХрдо рд╕реЗ рдХрдо рддреАрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рднреВрд▓ рдЬрд╛рдУред
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдбреАрдмрдЧрд┐рдВрдЧ рдФрд░ рдЕрдзрд┐рдХ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ред
- рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдУрд╡рд░рд▓реЛрдб рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
- рдореЗрд░реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЕрдХреНрд╕рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрдм
StopCoroutine
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдзрд┐рднрд╛рд░ рдХреЛ StopCoroutine
рдЧрдпрд╛ рдерд╛ рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред рдХреЛрд░рдЯреАрди рдХреЛ рдЕрдВрдЬрд╛рдо рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд░рд╣рд╛ред
рдПрдХ рдУрд░, рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ рдмреБрдирд┐рдпрд╛рджреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдордп рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ - рдпрд╣ рдердХрд╛рдК рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдмрд┐рдВрджреБ рдХреЗ рдХрд░реАрдм
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рд░реИрдкрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЙрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЕрдм рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдЙрдирдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдиреГрддреНрдп рдХрд░рдирд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреВрд░реА рдЯреАрдо рдЙрди рдШрдЯрдХреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛ рдЧрдИ рд╣реИ рдЬрд╣рд╛рдВ рдХреЙрд░рдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╣реИрдВ - рдПрдХ рдШрдЯрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рдХреНрд╖рдг рдореЗрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХрд┐рд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрдЧрд╛ - рдпреЗ рдкреНрд░рдХреНрд╖реЗрдк рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЙрд╕рдХреЗ рдорд╛рдереЗ рдкрд░ "рдорд╛рдереЗ рдкрд░" рдмрджрд▓рдХрд░ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдирд┐рд░реНрдорд╛рдг transform.position = newPosition
рдпрджрд┐ RigidBody
рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ Update
рд╡рд┐рдзрд┐ рдореЗрдВ) ( рдбреЙрдХреНрд╕ )ред
рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдореИрдВ рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ:
using IEnumerator = System.Collections.IEnumerator; using UnityEngine; public sealed class MoveToPoint : MonoBehaviour { public Vector3 target; [Space] public float speed; public float threshold; public void Move() { if (moveRoutine == null) StartCoroutine(MoveRoutine()); } private IEnumerator MoveRoutine() { while (Vector3.Distance(transform.position, target) > threshold) { transform.position = Vector3.Lerp(transform.position, target, speed * Time.deltaTime); yield return null; } } }
рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛Move
рд╡рд┐рдзрд┐ рдореЗрдВ, рдХреЙрд░рдЯреАрди рдХреЛ рдХреЗрд╡рд▓ рддрдм рдЪрд▓рд╛рдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрдм рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реЛред рдЕрдиреНрдпрдерд╛, рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛ред
threshold
- рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдмрд┐рдВрджреБ рдХреА рджреВрд░реА, рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдкрд╣реБрдВрдЪрдХрд░ рд╣рдо рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рд╣рдо рд▓рдХреНрд╖реНрдп рддрдХ рдкрд╣реБрдБрдЪ рдЪреБрдХреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ?
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ Vector3
рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рднреА рдШрдЯрдХ ( x
, y
, z
) рдЯрд╛рдЗрдк float
, рд▓реВрдк рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдХреНрд╖реНрдп рдФрд░ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдХреЗ рд▓рд┐рдП рджреВрд░реА рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ ред
рд╣рдо рдЕрдзрд┐рдХ / рдХрдо рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдХреА рджреВрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рднреА, рдЖрдк рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рдирд┐рдд рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП Mathf.Approximately
( рдбреЙрдХреНрд╕ ) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде, рдЧрддрд┐ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИ рддрд╛рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдлреНрд░реЗрдо рдореЗрдВ рд▓рдХреНрд╖реНрдп "рдХреВрдж" рдЬрд╛рдПред рдлрд┐рд░ рдЪрдХреНрд░ рдХрднреА рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк Vector3.MoveTowards
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред Vector3.MoveTowards
рд╡рд┐рдзрд┐ред
рдЬрд╣рд╛рдБ Vector3
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, Vector3
рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХрддрд╛ рдЗрдВрдЬрди рдореЗрдВ, Vector3
рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ Mathf.Approximately
рдХреЛ рдШрдЯрдХ-рд╡рд╛рд░ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рдм рдЕрдм рдХреЗ рд▓рд┐рдП рд╣реИ, рд╣рдорд╛рд░рд╛ рдШрдЯрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдФрд░ рдлрд┐рд▓рд╣рд╛рд▓ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди, рдпрд╣ рдШрдЯрдХ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рдЕрдиреНрдпрд╛рдп рдХреЛ рдареАрдХ рдХрд░реЗрдВред
рдЪреВрдБрдХрд┐ рдЖрдкрдиреЗ рдФрд░ рдореИрдВрдиреЗ рджреБрд╖реНрдЯ рдкрдХреНрд╖ рдкрд░ рдирд╣реАрдВ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЕрддрд┐рднрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рдЕрдм рд╣рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рджреМрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдХреЛрд░рдЯрд╛рдЗрди рдХреА рдПрдХ рдХрдбрд╝реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдирд╣реАрдВ рддреЛ рдлрд┐рд░ рдЙрд╕реЗ рдХреИрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛рдП?
рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ:
private Coroutine moveRoutine;
Move
рдареАрдХ рдХрд░реЗрдВ:
public void Move() { if (moveRoutine == null) moveRoutine = StartCoroutine(MoveRoutine()); }
рд╕реНрдЯреЙрдк рдореЛрд╢рди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
public void Stop() { if (moveRoutine != null) StopCoroutine(moveRoutine); }
рдкреВрд░рд╛ рдХреЛрдб using IEnumerator = System.Collections.IEnumerator; using UnityEngine; public sealed class MoveToPoint : MonoBehaviour { public Vector3 target; [Space] public float speed; public float threshold; private Coroutine moveRoutine; public void Move() { if (moveRoutine == null) moveRoutine = StartCoroutine(MoveRoutine()); } public void Stop() { if (moveRoutine != null) StopCoroutine(moveRoutine); } private IEnumerator MoveRoutine() { while (Vector3.Distance(transform.position, target) > threshold) { transform.position = Vector3.Lerp(transform.position, target, speed * Time.deltaTime); yield return null; } } }
рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛! рдХрдо рд╕реЗ рдХрдо рдШрд╛рд╡ рдкрд░ рд▓рдЧрд╛рдПрдВред
So. рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯрд╛ рдШрдЯрдХ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рдЖрдХреНрд░реЛрд╢ рдХреНрдпрд╛ рд╣реИ?
рд╕рдорд╕реНрдпрд╛рдПрдВ рдФрд░ рдЙрдирдХрд╛ рд╕рдорд╛рдзрд╛рди
рд╕рдордп рдХреЗ рд╕рд╛рде, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдврд╝рддреА рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЬрд┐рдирдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдФрд░ рд╣рд░ рдмрд╛рд░, рдпреЗ рдЪреАрдЬреЗрдВ рдореБрдЭреЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рди рдХрд░ рд░рд╣реА рд╣реИрдВ:
- рдЪрд▓ рд░рд╣рд╛ рд╣реИ рд╕реИрдВрдбрд╡рд┐рдЪ рдХреЙрд▓
StartCoroutine(MoveRoutine());
StopCoroutine(moveRoutine);
рдмрд╕ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдиреЗ рд╕реЗ рдореЗрд░реА рдЖрдВрдЦ рдорд░реЛрдбрд╝рддреА рд╣реИ, рдФрд░ рдРрд╕рд╛ рдХреЛрдб рдкрдврд╝рдирд╛ рдПрдХ рд╕рдВрджрд┐рдЧреНрдз рдЦреБрд╢реА рд╣реИ (рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдпрд╣ рдмрджрддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:
moveRoutine.Start();
moveRoutine.Stop();
- рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк
StartCoroutine
рдХреЙрд▓ StartCoroutine
рддреЛ рдЖрдкрдХреЛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
moveRoutine = StartCoroutine(MoveRoutine());
рдЕрдиреНрдпрдерд╛, рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрдореА рдХреЗ рдХрд╛рд░рдг, рдЖрдк рдЗрд╕реЗ рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддреЗред
- рд▓рдЧрд╛рддрд╛рд░ рдЬрд╛рдВрдЪ:
if (moveRoutine == null)
if (moveRoutine != null)
- рдФрд░ рдПрдХ рдФрд░ рдмреБрд░реА рдмрд╛рдд рдЬреЛ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдпрд╛рдж рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдП (рдФрд░ рдЬреЛ рдореИрдВ
рдлрд┐рд░ рднреВрд▓ рдЧрдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛)ред рдХреЙрд░рдЯреАрди рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдФрд░ рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, yield break
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рдлрд╝реАрд▓реНрдб рдорд╛рди рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
moveRoutine = null;
рдпрджрд┐ рдЖрдк рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдХрд╛ рдзрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред moveRoutine
рдореЗрдВ рдкрд╣рд▓реЗ рд░рди рдХреЗ рдмрд╛рдж, moveRoutine
рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд░рд╣реЗрдЧрд╛, рдФрд░ рдирдпрд╛ рд░рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЙрд╕реА рддрд░рд╣, рдЖрдкрдХреЛ рдордЬрдмреВрд░ рд╕реНрдЯреЙрдк рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public void Stop() { if (moveRoutine != null) { StopCoroutine(moveRoutine); moveRoutine = null; } }
рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб public sealed class MoveToPoint : MonoBehaviour { public Vector3 target; [Space] public float speed; public float threshold; private Coroutine moveRoutine; public void Move() { moveRoutine = StartCoroutine(MoveRoutine()); } public void Stop() { if (moveRoutine != null) { StopCoroutine(moveRoutine); moveRoutine = null; } } private IEnumerator MoveRoutine() { while (Vector3.Distance(transform.position, target) > threshold) { transform.localPosition = Vector3.Lerp(transform.position, target, speed * Time.deltaTime); yield return null; } moveRoutine = null; } }
рдПрдХ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЗрд╕ рдкреВрд░реЗ рдмрд╣рд╛рдиреЗ рдХреЛ рдХрд╣реАрдВ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ: Start
, Stop
рдФрд░ рдХреБрдЫ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдФрд░ рдЧреБрдгреЛрдВ рдХреЛред
рдЪрд▓реЛ рдЕрдВрдд рдореЗрдВ рдпрд╣ рдХрд░реЛ!
using System.Collections; using System; using UnityEngine; public sealed class CoroutineObject { public MonoBehaviour Owner { get; private set; } public Coroutine Coroutine { get; private set; } public Func<IEnumerator> Routine { get; private set; } public bool IsProcessing => Coroutine != null; public CoroutineObject(MonoBehaviour owner, Func<IEnumerator> routine) { Owner = owner; Routine = routine; } private IEnumerator Process() { yield return Routine.Invoke(); Coroutine = null; } public void Start() { Stop(); Coroutine = Owner.StartCoroutine(Process()); } public void Stop() { if (IsProcessing) { Owner.StopCoroutine(Coroutine); Coroutine = null; } } }
рдбреАрдмреНрд░реАрдлрд┐рдВрдЧOwner
- MonoBehaviour
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ, рдЬрд┐рд╕рдореЗрдВ MonoBehaviour
рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ StartCoroutine
рдФрд░ StopCoroutine
рддрд░реАрдХреЗ StopCoroutine
ред рддрджрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рдЙрд╕ рдШрдЯрдХ рдХреЗ рд▓рд┐рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реЛрдЧрд╛ред
Coroutine
- MoveToPoint
рдШрдЯрдХ рдореЗрдВ moveRoutine
рдлрд╝реАрд▓реНрдб рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ, рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди coroutine рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИред
Routine
- рдкреНрд░рддрд┐рдирд┐рдзрд┐, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдВрдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
Process()
рдореБрдЦреНрдп Routine
рд╡рд┐рдзрд┐ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рд╣реИред рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЙрд╕ рд╕рдордп (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) рджреВрд╕рд░реЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
IsProcessing
- рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ IsProcessing
рдЪрд▓ рд░рд╣рд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рд┐рд░рджрд░реНрдж рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░рд╛ рдШрдЯрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИ:
using IEnumerator = System.Collections; using UnityEngine; public sealed class MoveToPoint : MonoBehaviour { public Vector3 target; [Space] public float speed; public float threshold; private CoroutineObject moveRoutine; private void Awake() { moveRoutine = new CoroutineObject(this, MoveRoutine); } public void Move() => moveRoutine.Start(); public void Stop() => moveRoutine.Stop(); private IEnumerator MoveRoutine() { while (Vector3.Distance(transform.position, target) > threshold) { transform.position = Vector3.Lerp(transform.position, target, speed * Time.deltaTime); yield return null; } } }
рдЬреЛ рдХреБрдЫ рднреА рд╢реЗрд╖ рд╣реИ, рд╡рд╣ рд╕реНрд╡рдпрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд╣реИрдВред рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рдЖрдпрд╛ рд╣реИ - рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИред
рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ coroutine рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
private IEnumerator MoveRoutine(System.Action callback) { while (Vector3.Distance(transform.position, target) > threshold) { transform.position = Vector3.Lerp(transform.position, target, speed * Time.deltaTime); yield return null; } moveRoutine = null callback?.Invoke(); }
рдФрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреЙрд▓ рдХрд░реЗрдВ:
moveRoutine = StartCoroutine(moveRoutine(CallbackHandler)); private void CallbackHandler() {
рдФрд░ рдЕрдЧрд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдореЗрдордиреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдФрд░ рднреА рдмреБрд░рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдЖрд╡рд░рдг рдХреЗ рд╕рд╛рде, рдпрд╣ рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
public Action Finish;
private IEnumerator Process() { yield return Routine.Invoke(); Coroutine = null; Finish?.Invoke(); }
рдФрд░ рдлрд┐рд░, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВред
moveRoutine.Finished += OnFinish; private void OnFinish() {
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рд░реИрдкрд░ рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдмрд┐рдирд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдХреЗрд╡рд▓ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЖрд╡рд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдХреА рд╕рдм рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди, рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдХреЛрдб рдбрд╛рд▓рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рд╕рднреА рд░реИрдкрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рди рд▓рд┐рдЦреЗрдВред рд╣рдо рдЗрд╕рд╕реЗ рд▓рдбрд╝ рд░рд╣реЗ рд╣реИрдВред
рд╣рдо рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ:
- рдЧреБрдг
Owner
, Coroutine
, IsProcessing
- рдШрдЯрдирд╛
Finished
using Action = System.Action; using UnityEngine; public abstract class CoroutineObjectBase { public MonoBehaviour Owner { get; protected set; } public Coroutine Coroutine { get; protected set; } public bool IsProcessing => Coroutine != null; public abstract event Action Finished; }
рдкрд░рд╛рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдкрд░рд┐рдзреАрдп рдЖрд╡рд░рдг using System; using System.Collections; using UnityEngine; public sealed class CoroutineObject : CoroutineObjectBase { public Func<IEnumerator> Routine { get; private set; } public override event Action Finished; public CoroutineObject(MonoBehaviour owner, Func<IEnumerator> routine) { Owner = owner; Routine = routine; } private IEnumerator Process() { yield return Routine.Invoke(); Coroutine = null; Finished?.Invoke(); } public void Start() { Stop(); Coroutine = Owner.StartCoroutine(Process()); } public void Stop() { if(IsProcessing) { Owner.StopCoroutine(Coroutine); Coroutine = null; } } }
рдФрд░ рдЕрдм, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг:
using System; using System.Collections; using UnityEngine; public sealed class CoroutineObject<T> : CoroutineObjectBase { public Func<T, IEnumerator> Routine { get; private set; } public override event Action Finished; public CoroutineObject(MonoBehaviour owner, Func<T, IEnumerator> routine) { Owner = owner; Routine = routine; } private IEnumerator Process(T arg) { yield return Routine.Invoke(arg); Coroutine = null; Finished?.Invoke(); } public void Start(T arg) { Stop(); Coroutine = Owner.StartCoroutine(Process(arg)); } public void Stop() { if(IsProcessing) { Owner.StopCoroutine(Coroutine); Coroutine = null; } } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИред рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЯреБрдХрдбрд╝реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ MoveToPoint рдШрдЯрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рддрд╛рдХрд┐ рдмрд┐рдВрджреБ рдХреЛ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ Inspector
рд╡рд┐рдВрдбреЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рд▓реЗрдХрд┐рди рдЬрдм рдХреЛрдб рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рддреЛ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ред
using IEnumerator = System.Collections.IEnumerator; using UnityEngine; public sealed class MoveToPoint : MonoBehaviour { public float speed; public float threshold; private CoroutineObject<Vector3> moveRoutine; public bool IsMoving => moveRoutine.IsProcessing; private void Awake() { moveRoutine = new CoroutineObject<Vector3>(this, MoveRoutine); } public void Move(Vector3 target) => moveRoutine.Start(target); public void Stop() => moveRoutine.Stop(); private IEnumerator MoveRoutine(Vector3 target) { while (Vector3.Distance(transform.position, target) > threshold) { transform.localPosition = Vector3.Lerp(transform.position, target, speed); yield return null; } } }
рдЗрд╕ рд░реИрдкрд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: рдПрдХ рд╡рд┐рд▓рдВрдмрд┐рдд рд▓реЙрдиреНрдЪ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдИрд╡реЗрдВрдЯ, рдХреЛрд░рдЯрд╛рдЗрди рдкреНрд░рдЧрддрд┐ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЯреНрд░реИрдХрд┐рдВрдЧ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдЬреЛрдбрд╝реЗрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд░реБрдХрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЙрди рджрдмрд╛рд╡ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдФрд░ рдЙрдирдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рдпрд╛, рди рдХрд┐ рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ рд╢реБрд░реБрдЖрддреА рдФрд░ рдЕрдиреБрднрд╡реА рджреЛрдиреЛрдВ рдХрд╛рдорд░реЗрдб рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗред рд╢рд╛рдпрдж рд╡реЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рд╕рд╛рдЭрд╛ рдХрд░реЗрдВрдЧреЗ рдпрд╛ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред