Плавное абстрактное передвижение на фоне

Программирование на Юнити.

Плавное абстрактное передвижение на фоне

Сообщение GRAVTIT 17 фев 2017, 09:42

Как заставить спрайт летать на фоне (или в определенной области) абстрактно и с определенной (медленной) скоростью? Заранее спасибо!
GRAVTIT
UNец
 
Сообщения: 1
Зарегистрирован: 17 фев 2017, 09:37

Re: Плавное абстрактное передвижение на фоне

Сообщение samana 17 фев 2017, 10:28

Есть такой способ:
- создаём цель-объект к которой всегда будет стремится спрайт
- с нужным интервалом времени (пару раз в секунду например), изменяем положение цели в нужной вам области
- если спрайт подлетел очень близко к цели, то сразу меняем её положение
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Плавное абстрактное передвижение на фоне

Сообщение samana 17 фев 2017, 12:06

Если всё это у вас 2d, то можно сделать так.
Повесьте скрипт на какой нибудь пустой объект. У него появится боксКоллайдер2д, настройте его границы, как вам нужно, именно в этой области будет появляться цель к которой будет лететь спрайт.


Синтаксис:
Используется csharp
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);
    }
}
 
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6