рдЧрд╛рдореЗрджреЗрд╡ рдореЗрдВ рдорда рд╕рд░рд▓ рд╣реИред рдХреНрд╖реЗрддреНрд░ рдФрд░ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдЖрдЬ рдореИрдВ рдЧрдгрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЧрдгрд┐рдд рдПрдХ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рд╡рд┐рдЬреНрдЮрд╛рди рд╣реИ рдФрд░ рдпрд╣ рдЧреЗрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдордп рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордпред рдХрдИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢реБрд░реБрдЖрддреА) рдмрд╕ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕реА рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рдЧрд╣рд░реА рд╕рдордЭ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ: рдЕрднрд┐рдиреНрди, рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛, рд╕рдореВрд╣, рдЕрдВрдЧреВрдард┐рдпрд╛рдВ, рдЖрджрд┐, рд▓реЗрдХрд┐рди рдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЖрдк рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╡реИрдХреНрдЯрд░ рдФрд░ рдЕрднрд┐рдиреНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдПрдХрддрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЪрд┐рддреНрд░рдг рд╕рдВрд▓рдЧреНрди рд╣реИред



рд╡реЗрдХреНрдЯрд░ рдЧрдгрд┐рддред

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

рд╡реЗрдХреНрдЯрд░ рдЕрдВрдХрдЧрдгрд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп

рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╕реВрддреНрд░ рдФрд░ рдЕрдиреНрдп рд╡рд┐рд╡рд░рдг Google рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдкрд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╕рдВрдЪрд╛рд▓рди рдЦреБрдж рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЬреАрдЖрдИрдПрдл рдПрдирд┐рдореЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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



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

рддреАрд░ рд╡рд░реНрдЧ
using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; public class VectorArrow : MonoBehaviour { [SerializeField] private Vector3 _VectorStart; [SerializeField] private Vector3 _VectorEnd; [SerializeField] private float TextOffsetY; [SerializeField] private TMP_Text _Label; [SerializeField] private Color _Color; [SerializeField] private LineRenderer _Line; [SerializeField] private float _CupLength; [SerializeField] private LineRenderer _Cup; private void OnValidate() { UpdateVector(); } private void UpdateVector() { if(_Line == null || _Cup == null) return; SetColor(_Color); _Line.positionCount = _Cup.positionCount = 2; _Line.SetPosition(0, _VectorStart); _Line.SetPosition(1, _VectorEnd - (_VectorEnd - _VectorStart).normalized * _CupLength); _Cup.SetPosition(0, _VectorEnd - (_VectorEnd - _VectorStart).normalized * _CupLength); _Cup.SetPosition(1, _VectorEnd ); if (_Label != null) { var dv = _VectorEnd - _VectorStart; var normal = new Vector3(-dv.y, dv.x).normalized; normal = normal.y > 0 ? normal : -normal; _Label.transform.localPosition = (_VectorEnd + _VectorStart) / 2 + normal * TextOffsetY; _Label.transform.up = normal; } } public void SetPositions(Vector3 start, Vector3 end) { _VectorStart = start; _VectorEnd = end; UpdateVector(); } public void SetLabel(string label) { _Label.text = label; } public void SetColor(Color color) { _Color = color; _Line.startColor = _Line.endColor = _Cup.startColor = _Cup.endColor = _Color; } } 


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

 _VectorEnd - (_VectorEnd - _VectorStart).normalized * _CupLength 

рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ (_VectorEnd - _VectorStart) .normalized рд╡реЗрдХреНрдЯрд░ рдХреА рджрд┐рд╢рд╛ рд╣реИред рдЗрд╕реЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рдПрдиреАрдореЗрд╢рди рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ _VectorEnd рдФрд░ _VectorStart рдПрдХ рд╢реБрд░реБрдЖрдд (0,0,0) рдХреЗ рд╕рд╛рде рд╡реИрдХреНрдЯрд░ рд╣реИрдВред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рджреЛ рд╢реЗрд╖ рдореВрд▓ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ:


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

 var dv = _VectorEnd - _VectorStart; var normal = new Vector3(-dv.y, dv.x).normalized; normal = normal.y > 0 ? normal : -normal; _Label.transform.localPosition = (_VectorEnd + _VectorStart) / 2 + normal * TextOffsetY; _Label.transform.up = normal; 

рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдХреЛ рд▓рдВрдмрд╡рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪрд╛рд╣рд┐рдПред 2 рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред

 var dv = _VectorEnd - _VectorStart; var normal = new Vector3(-dv.y, dv.x).normalized; 

рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдЧрдПред

normal = normal.y> 0? рд╕рд╛рдорд╛рдиреНрдп: - рдЕрд╕рд╛рдорд╛рдиреНрдп; - рдпрд╣ рдСрдкрд░реЗрд╢рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдХрд┐ рдкрд╛рда рд╣рдореЗрд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдлрд┐рд░ рдЗрд╕реЗ рд╕рджрд┐рд╢ рдХреЗ рдмреАрдЪ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдХреБрдЫ рджреВрд░реА рддрдХ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдЬреЛ рд╕реБрдВрджрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

 _Label.transform.localPosition = (_VectorEnd + _VectorStart) / 2 + normal * TextOffsetY; 

рдХреЛрдб рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдореА рддреАрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВред

рд▓реЗрдХрд┐рди рдпрд╣ 2 рдбреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛, рд▓реЗрдХрд┐рди 3 рдбреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

3 рдбреА рдореЗрдВ, рдкреНрд▓рд╕ рдпрд╛ рдорд╛рдЗрдирд╕ рд╕рдорд╛рди рд╣реИред рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрддреНрд░ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦрдВрдб рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдорд╛рди рддрдХред

рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ
 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class SphereCameraController : MonoBehaviour { [SerializeField] private Camera _Camera; [SerializeField] private float _DistanceFromPlanet = 10; [SerializeField] private float _Offset = 5; private bool _IsMoving; public event Action<Vector3, Vector3, Vector3, float, float> OnMove; private void Update() { if (Input.GetMouseButtonDown(0) && !_IsMoving) { RaycastHit hit; Debug.Log("Click"); var ray = _Camera.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out hit)) { Debug.Log("hit"); var startPosition = _Camera.transform.position; var right = Vector3.Cross(hit.normal, Vector3.up).normalized; var endPosition = hit.point + hit.normal * _DistanceFromPlanet + right * _Offset; StartCoroutine(MoveCoroutine(startPosition, endPosition, hit.point + right * _Offset)); OnMove?.Invoke(startPosition, hit.point, hit.normal, _DistanceFromPlanet, _Offset); } } } private IEnumerator MoveCoroutine(Vector3 start, Vector3 end, Vector3 lookAt) { _IsMoving = true; var startForward = transform.forward; float timer = 0; while (timer < Scenario.AnimTime) { transform.position = Vector3.Slerp(start, end, timer / Scenario.AnimTime); transform.forward = Vector3.Slerp(startForward, (lookAt - transform.position).normalized, timer / Scenario.AnimTime); yield return null; timer += Time.deltaTime; } transform.position = end; transform.forward = (lookAt - transform.position).normalized; _IsMoving = false; } } 



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

 var right = Vector3.Cross(hit.normal, Vector3.up).normalized; 

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

рдЕрднрд┐рдиреНрди

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

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

рдЕрднрд┐рдиреНрди рдХреНрдпрд╛ рд╣реИ?

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



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

рдХрдХреНрд╖рд╛ MoveObj
 using System.Collections; using UnityEngine; [RequireComponent(typeof(Rigidbody))] public class MoveObject : MonoBehaviour { [SerializeField] private Transform _Target; [SerializeField] private GraphData _Data; private Rigidbody _Rigidbody; private void Start() { _Rigidbody = GetComponent<Rigidbody>(); Move(2f, _Data.AnimationCurve); } public void Move(float time, AnimationCurve speedLaw) { StartCoroutine(MovingCoroutine(time, speedLaw)); } private IEnumerator MovingCoroutine(float time, AnimationCurve speedLaw) { float timer = 0; var dv = (_Target.position - transform.position); var distance = dv.magnitude; var direction = dv.normalized; var speedK = distance / (Utils.GetApproxSquareAnimCurve(speedLaw) * time); while (timer < time) { _Rigidbody.velocity = speedLaw.Evaluate(timer / time) * direction * speedK; yield return new WaitForFixedUpdate(); timer += Time.fixedDeltaTime; } _Rigidbody.isKinematic = true; } } 


GetApproxSquareAnimCurve рд╡рд┐рдзрд┐ рд╣рдорд╛рд░рд╛ рдПрдХреАрдХрд░рдг рд╣реИред рд╣рдо рдЗрд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдмрд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдпреЛрдЧ рдХрд░реЗрдВред рдореИрдВ рдирд┐рд╖реНрдард╛ рдХреЗ рд▓рд┐рдП 1000 рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред

  private const int Iterations = 1000; public static float GetApproxSquareAnimCurve(AnimationCurve curve) { float square = 0; for (int i = 0; i <= Iterations; i++) { square += curve.Evaluate((float) i / Iterations); } return square / Iterations; } 

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




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

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

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

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


All Articles