Движение единства возле точки - PullRequest
1 голос
/ 20 мая 2019

У меня есть космические корабли, которые преследуют друг друга.В настоящее время они точно перемещаются к своей цели, но я хочу воспроизвести физику, которую вы можете увидеть на воде или в условиях невесомости, где объект будет отклоняться от своей цели, поворачиваться и двигаться назад к ней.Возможно зависание вокруг цели вперед и назад.Я пробовал addforce и addrelativeforce, и скорость, но они, кажется, не дают мне желаемого эффекта.Есть идеи?

Это мой код ...

Vector3 dir = (new Vector3(x, y, 0) - transform.parent.position).normalized;
        float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward);
        float heading = Mathf.Atan2(dir.x, dir.y);
        transform.parent.rotation = Quaternion.Slerp(transform.parent.rotation, Quaternion.Inverse(Quaternion.Euler(0f, 0f, heading * Mathf.Rad2Deg)), Time.deltaTime * 12f);
        //transform.parent.position += dir * speed * Time.deltaTime;
        //rb.AddForce(dir);
        rb.velocity = new Vector3(dir.x * speed, dir.y * speed, 0);

1 Ответ

1 голос
/ 20 мая 2019

Вот как мне добиться этого ИИ в 2D космическом шутере:

void FixedUpdate()
{
    var target = Player != null ? PlayerObject : Target; // If player is dead, go for secondary target
    Vector2 dir = -(Vector2)(transform.position - target.transform.position + targetOffset); // Direction

    // dir.magnitude is the distance to target
    if (dir.magnitude > reaction * rangeModifier) // If I'm far away from the target, slowly rotate towards it
    { 
        // calculate angle toward target and slowly rotate child ship object toward it in the speed of turnRate
        float attackAngle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90;
        ship.transform.rotation = Quaternion.Slerp(ship.transform.rotation, Quaternion.AngleAxis(attackAngle, Vector3.forward), turnRate * Time.deltaTime);
    }
    else // If I'm close to the target just keep going straight ahead and fire until I'm too far away again
    {
        My.weapon.Shoot(dir);
    }


    _rb.velocity = ship.transform.up.normalized * My.Movementspeed; // Add velocity in the direction of the ship's rotation
}

Это даст вам ИИ, который будет в восьми (8) формах вокруг цели.Если у вас много объектов, использующих этот код, я рекомендую добавить случайное смещение к цели, чтобы имитировать рой и более реалистичную цель полета.

Я добавил комментарии, чтобы объяснить некоторые детали кода.

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