当碰撞发生时,Ai一直旋转

时间:2017-09-01 19:29:49

标签: c# unity3d vector artificial-intelligence collision-detection

在范围内有一个简单的AI跟随玩家,当ai不在玩家范围内时随机移动ai。当人工智能击中墙壁并且不在球员范围内时,它会一直开始旋转。无法解决为什么一直这样做。

我可能错过了一件简单的事...... 非常感谢您的帮助。

void Update()
{
    Target = GameObject.FindGameObjectWithTag("Player");

    if (Vector3.Distance(Target.transform.position, transform.position) < 25)
    {
        followPlayer();
    }
    else
    {
        randomMovement();
    }

}

public void followPlayer()
{

    if (Vector3.Distance(transform.position, Target.transform.position) >= MinDist)
    {

        transform.position += transform.forward * MoveSpeed * Time.deltaTime;
        transform.LookAt(Target.transform);


        if (Vector3.Distance(transform.position, Target.transform.position) <= MaxDist)
        {
        }

    }
    else
    {

    }

}

public void randomMovement()
{
    transform.position += transform.forward * MoveSpeed * Time.deltaTime;
    transform.Rotate(RandomDirection * Time.deltaTime * 10.0f);

}

void OnCollisionEnter(Collision col)
{
    bool hasTurned = false;

    if (col.transform.gameObject.name != "Terrain")
    {
        if(hasTurned == false)
        {
            RandomDirection = new Vector3(0, Mathf.Sin(TimeBetween) * (RotationRange / 2) + OriginalDirection, 0);
            randomMovement();
            hasTurned = true;
        }
        else
        {
            randomMovement();
            hasTurned = false;
        }


        Debug.Log("Hit");
    }

1 个答案:

答案 0 :(得分:1)

它持续旋转的原因是因为您在Update()中不断调用randomMovement(),它会使用Rotate()不断向您的对象应用旋转。这听起来像你正在尝试做的是让对象每隔几秒钟漫无目的地游荡。你可以通过在randomMovement()上实现计时器来做到这一点,这样每隔几秒就会产生一个新的旋转(类似于你在onCollision中的旋转)。示例如下。

float t = 0;
public void randomMovement()
{
    transform.position += transform.forward * MoveSpeed * Time.deltaTime;

    t += Time.deltaTime;
    if (t > 3f) // set to a new rotation every 3 seconds.
    {
        t = 0; // reset timer
        RandomDirection = new Vector3(0, Random.Range(0f, 360f), 0); // turn towards random direction

        transform.Rotate(RandomDirection);
    }
}