团结避免障碍与寻路c#

时间:2015-04-12 15:59:32

标签: c# unity3d path-finding raycasting

我有一个简单的项目,其中包括避障的寻路。现在,由于路径不直,我有void Steer操纵物体。然后我有void AvoidObstacles基本上有光线投射和避障部分。

每当对象操纵时,它都会调用AvoidObstacles函数。现在的问题是,一开始,只要它还没有调用Steer函数,因为它是一条直线,它会通过对象而不是避开它。

以下是一些使用的代码:

 public Vector3 Steer(Vector3 target, bool bFinalPoint = false)
 {
    //Calculate the directional vector from the current position towards the target point
    Vector3 desiredVelocity = (target - transform.position);
    float dist = desiredVelocity.magnitude;



    AvoidObstacles(ref desiredVelocity);
    //Normalise the desired Velocity
    desiredVelocity.Normalize();

    //Calculate the velocity according to the speed
    if (bFinalPoint && dist < 10.0f)
        desiredVelocity *= (curSpeed * (dist / 10.0f));
    else 
        desiredVelocity *= curSpeed;

    //Calculate the force Vector
    Vector3 steeringForce = desiredVelocity - velocity; 
    Vector3 acceleration = steeringForce / mass;

    return acceleration;
}

这是另一个

public void AvoidObstacles(ref Vector3 desiredVelocity)
{
    RaycastHit hit;
    Vector3 leftRay = transform.position;
    Vector3 rightRay = transform.position;

    //leftRay.x -= 2;
    //rightRay.x += 2;

    Debug.DrawLine(transform.position,(transform.forward * 5) + transform.position,Color.green);

    if(Physics.Raycast(transform.position, transform.forward,out hit, minimumDistToAvoid))
    {
        Debug.DrawLine(transform.position,(transform.forward * 10) + transform.position,Color.red);
        if(hit.transform != transform)
        {
           //dir += hit.normal * 50;
           //Get the normal of the hit point to calculate the new direction
           Vector3 hitNormal = hit.normal;
           hitNormal.y = 0.0f; //Don't want to move in Y-Space

           //Get the new directional vector by adding force to vehicle's current forward vector
           desiredVelocity = transform.forward + hitNormal * force;
        }
    }
}

这是我的更新

    void Update () 
{
    //Unify the speed
    curSpeed = speed * Time.deltaTime;

    targetPoint = path.GetPoint(curPathIndex);

    //If reach the radius within the path then move to next point in the path
    if(Vector3.Distance(transform.position, targetPoint) < path.Radius)
    {
        //Don't move the vehicle if path is finished 
        if (curPathIndex < pathLength - 1)
            curPathIndex ++;
        else if (isLooping)
            curPathIndex = 0;
        else
            return;
    }

    //Move the vehicle until the end point is reached in the path
    if (curPathIndex >= pathLength )
        return;

    //Calculate the next Velocity towards the path
    if(curPathIndex >= pathLength - 1 && !isLooping)
        velocity += Steer(targetPoint, true);
    else
        velocity += Steer(targetPoint);

    transform.position += velocity; //Move the vehicle according to the velocity
    transform.rotation = Quaternion.LookRotation(velocity); //Rotate the vehicle towards the desired Velocity
    //AvoidObstacles(ref Vector3 desiredVelocity);
    dir.Normalize();
}

也许有人可以帮助我购买让我知道如何在转向之外调用避障功能?也许在更新或开始或许。 我无法真正使用其他算法,就在这里。 TIA

0 个答案:

没有答案