/
darov
/
Platformer
Обзор
Документация
Войти
/
darov
/
Platformer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/PlatformMove.cs
76 строк
2 KB
Roman Danilov
Module17_1: physics, joints, connectors, effectors
01 июл 2025, 06:03
01 июл 2025, 06:03
91a8271
Код
Авторство
О чём код?
using System.Collections; using UnityEngine; public class PlatformMove : MonoBehaviour { [SerializeField] private Vector2 _finalPoint; [SerializeField] private float _maxSpeed; private Rigidbody2D _platform; private Vector2 _startPoint; private bool _isBackwards; private bool _isMoving; private void Start() { TryGetComponent(out _platform); _startPoint = transform.position; _isMoving = true; } private void FixedUpdate() { if (_isMoving) { DetermineTargetPoint(out Vector2 targetPoint); CountSpeed(targetPoint, out float speed, out float distance); MovePlatform(targetPoint, speed); if (distance < 0.01f) { _isMoving = false; StartCoroutine(MakeStop()); } } } private void DetermineTargetPoint(out Vector2 targetPoint) { if (_isBackwards) { targetPoint = _startPoint; } else { targetPoint = _finalPoint; } } private void CountSpeed(Vector2 targetPoint, out float speed, out float distance) { distance = Vector2.Distance(transform.position, targetPoint); float routeLenth = Vector2.Distance(_startPoint, _finalPoint); float speedRatio = 1f - Mathf.Abs(distance / routeLenth - 0.5f) / 0.5f; speedRatio = Mathf.Clamp(speedRatio, 0.1f, 0.6f); speed = _maxSpeed * speedRatio; } private void MovePlatform(Vector2 targetPoint, float speed) { Vector2 nextStep = Vector2.MoveTowards(transform.position, targetPoint, Time.deltaTime * speed); _platform.MovePosition(nextStep); } private IEnumerator MakeStop() { yield return new WaitForSecondsRealtime(1f); _isBackwards = !_isBackwards; _isMoving = true; } }