Единство - не можете заставить объекты вибрировать / зависать на месте? - PullRequest
0 голосов
/ 06 декабря 2018

Хорошо, у меня есть куча кубиков, которые мне просто нужно медленно вибрировать / трясти в пространстве, как будто почти завис.Сначала я попытался использовать излучатель частиц с шумом, но не смог получить часть движения.Сейчас я пытаюсь прикрепить скрипт к каждому объекту:

 float speed = 1.0f; //how fast it shakes
    float amount = 1.0f;
   public  Vector2 startingPos;

    void Awake()
    {
        startingPos.x = transform.position.x;
        startingPos.y = transform.position.y;
    }

    // Update is called once per frame
    void Update()
    {

        float newx = startingPos.x + (Mathf.Sin(Time.time * speed) * amount);
        float newy = startingPos.y + (Mathf.Sin(Time.time * speed) * amount);

        transform.position = new Vector3(newx, newy, transform.position.z);

    }

При этом кубы полностью исчезают.Я смотрел на форумах безрезультатно - что я могу сделать, чтобы кубы просто вибрировали / зависали на месте?

1 Ответ

0 голосов
/ 06 декабря 2018

В идеале вы должны использовать пакет, такой как LeanTween , для обработки ваших переходов / анимаций, по крайней мере, в простых, мелкомасштабных случаях, подобных этому.

По сути, процессэто:

On Start:
    store 'starting' position

On Enabled:
    Run DoHover

On DoHover:
    Pick random offset within radius (Random.insideUnitCircle() * radius)
    LeanTween current transform to startingPos + offset over timeDelay
    Set LeanTween.OnComplete to run DoHover

Если вы решили не использовать сторонний пакет для управления анимацией движения, вы можете попробовать это (я использую 3D-сцены, но вы должны иметь возможность сгладить еголегко):

    private const float threshold = 0.02f;

    private Vector3 startingPos;
    private Vector3 destinationPos;
    private Vector3 velocity;
    public float radius = 0.1f;
    public float minTimeDelay = 0.1f;
    public float maxTimeDelay = 0.3f;

    private void Start() {
        startingPos = destinationPos = transform.position;
    }


    // This is a 'physics' frame update
    public void FixedUpdate() {

        if ( Vector3.Distance(transform.position, destinationPos) < threshold ) {
            // Pick new destination and speed
            destinationPos = startingPos + Random.insideUnitSphere * radius;
            velocity = (destinationPos - transform.position) / Random.Range(minTimeDelay, maxTimeDelay);
        }

        // Move toward destination
        transform.position += velocity * Time.fixedDeltaTime;
    }
...