using UnityEngine;
[RequireComponent(typeof(BoxCollider2D))]
public class MoveSprite : MonoBehaviour
{
public Transform sprite; // вас спрайт
public float moveSpeed = 1f; // скорость движения
public float angSpeed = 2f; // скорость разворота к цели
public float changeTargetInSec = 0.2f; // сколько раз в секунду меняется цель
private Vector3 target; // позиция цели
private Vector3 _spriteDirection; // текущее направление спрайта
private float _currentTime; // считаем время, чтобы знать, когда сменить позицию
private Bounds _boxBounds; // сюда запишем границы боксКоллайдера
private void Start()
{
// сохраняем границы боксКоллайдера и скрываем его
BoxCollider2D _boxCollider2D = GetComponent<BoxCollider2D>();
_boxBounds = _boxCollider2D.bounds;
_boxCollider2D.enabled = false;
// обновляем позицию цели, куда будет двигаться спрайт
updateTargetPosition();
}
private void Update()
{
// считаем прошедшее время
_currentTime += Time.deltaTime;
// если пора менять позицию цели то меняем её
if (_currentTime >= 1f / changeTargetInSec)
{
_currentTime = 0;
updateTargetPosition();
}
// направление для спрайта медленно поворачивается к цели
_spriteDirection = Vector2.Lerp(_spriteDirection, (target - sprite.position).normalized, angSpeed * Time.deltaTime).normalized;
// спрайт перемещается вдоль своего направления
sprite.transform.position += _spriteDirection * moveSpeed * Time.deltaTime;
}
// обновление позиции цели, куда будет лететь спрайт.
// находит случайную точку внутри боксКоллайдера
private void updateTargetPosition()
{
target.x = Random.Range(_boxBounds.min.x, _boxBounds.max.x);
target.y = Random.Range(_boxBounds.min.y, _boxBounds.max.y);
}
// это для отладки, визуально в окне сцены рисуется текущая цель на экране
// и направление спрайта
// всё это видно, только если выделен объект, которому принадлежит этот скрипт
private void OnDrawGizmosSelected()
{
Gizmos.DrawSphere(new Vector3(target.x, target.y), 0.1f);
Gizmos.DrawRay(sprite.position, _spriteDirection);
}
}