Случайное движение врага по направлению движения - PullRequest
0 голосов
/ 23 июня 2019

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

https://imgur.com/tBslTpI

В настоящее время я пытаюсь сделать код, который я показал, но он заставляет вражеский объект мерцать между каждым поворотом, и он не плавный.

    public float directionChangeTimer = 5f;

    public float accelerateSpeed;

    public void addRandomDirection()
    {
        float randomAngleAdd = Random.Range(-5f, 5f);

        transform.Rotate(0, 0, randomAngleAdd);
    }

    public void Update()
    {
        //Add our Functions
        addRandomDirection();
    }

1 Ответ

0 голосов
/ 24 июня 2019

В настоящее время вы поворачиваетесь между -5 и 5 градусами каждый кадр .

Если вы хотите, чтобы это было более плавным, вы можете использовать Coroutine , например,

public float directionChangeTimer = 5f;

public float anglesPerSecond = 1f;

public float accelerateSpeed;

private void Start()
{
    StartCoroutine(RandomRotations);
}

private void IEnumerator RandomRotations()
{
    while(true)
    {
        // wait for directionChangeTimer seconds
        yield return new WaitForSeconds(directionChangeTimer);

        // get currentRotation
        var startRot = transform.rotation;

        // pick the next random angle
        var randomAngleAdd = Random.Range(-5f, 5f);

        // store already rotated angle
        var alreadyRotated = 0f;

        // over time add the rotation
        do
        {
            // prevent overshooting
            var addRotation = Mathf.Min(Mathf.Abs(randomAngleAdd) - alreadyRotated, Time.deltaTime * anglesPerSecond);

            // rotate a bit in the given direction
            transform.Rotate(0, 0, addRotation * Mathf.Sign(randomAngleAdd));

            alreadyRotated += addRotation;

            yield return null;
        }
        while(alreadyRotated < Mathf.Abs(randomAngleAdd));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...