统一运动近点

时间:2019-05-20 15:01:50

标签: c# unity3d

我有飞船互相追逐。它们当前正好精确地移动到目标,但是我想复制一下您可能在水面上或在零重力下看到的物理学,其中物体将超过目标,然后转向并向后移动。可能在目标周围来回徘徊。我尝试了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 个答案:

答案 0 :(得分:1)

这是我在2D太空射击游戏中实现AI的方式:

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)个形状的AI。如果您有很多对象在运行此代码,我建议向目标添加一个随机偏移量,以模拟群聚和更逼真的飞行目标。

我添加了注释以解释代码的一些细节。