GameObject вращается вперед и назад - PullRequest
0 голосов
/ 22 марта 2020

Я работаю над травой для моей игры, где она должна выглядеть так, как будто есть ветер. Поэтому я попытался написать сценарий, но безуспешно. Сценарий будет примерно таким, где он немного вращается, а потом наоборот. Просто взад и вперед.

public GameObject grass;

    private void FixedUpdate()
    {
        grass.transform.Rotate(transform.rotation.x, transform.rotation.y, 90f * Time.deltaTime, Space.Self);
    }

Как вы можете видеть из моего кода, он будет вращаться вокруг себя вечность. Это именно то, что я получил.

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Прежде всего, вы не захотите делать это в FixedUpdate, а скорее в Update, в противном случае вы получите дрожащее движение.

Тогда вы можете просто определить два ваших вращения цели и использовать Mathf.PingPong как фактор в Quaternion.Slerp для интерполяции вперед и назад между двумя вращениями:

public Vector3 eulerAngles1;
public Vector3 eulerAngles2;
// How long it takes to go from eulerAngles1 to eulerAngles2
public float duration;

Quaternion rotation1;
Quaternion rotation2;

private void Start()
{
    rotation1 = Quaternion.Euler(eulerAngles1);
    rotation2 = Quaternion.Euler(eulerAngles2);
}

private void Update()
{
    var factor = Marhf.PingPong(Time.time / duration, 1);
    // Optionally you can even add some ease-in and -out
    factor = Mathf.SmoothStep(0, 1, factor);

    // Now interpolate between the two rotations on the current factor
    transform.rotation = Qiaternion.Slerp(rotation1, rotation2, factor);
}
0 голосов
/ 22 марта 2020

Я никогда не делал что-то с Unity, но вы можете попробовать что-то вроде этого.

Если вам нужен хороший wave эффект, вы должны использовать Math.Sin() для этого. Может быть что-то вроде:

public GameObject grass;
private double _time;

    private void FixedUpdate()
    {
        _time = _time + Time.deltaTime;

        // I assumed that the angle for unity is in degrees.
        // Math.Sin work with Radians. a full wave will take about 6 seconds.
        // It will go between 0 and 90 degrees.
        var angle = (float)(45 + (45 * Math.Sin(_time))); 

        grass.transform.Rotate(transform.rotation.x, transform.rotation.y, angle, Space.Self);
    }

Если вы хотите, чтобы угол поворота был от -45 до 45 градусов, используйте: (float)(45 * Math.Sin(_time));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...