// Update is called once per frame
    void Update()
    {
        if (useKinematic == false)
        {
            return;
        }

        SteeringOutput steering;

        if (singleAlternative == null)
        {
            steering = behaviour.getSteering(selfKinematic, target, targetKinematic);
        }
        else
        {
            steering = singleAlternative.getSteering(selfKinematic, target, targetKinematic);
        }

        if (target != null)
        {
            Debug.DrawRay(parentTransform.position, target.transform.position - parentTransform.position, Color.white);
        }

        ProcessSteering();
        UpdateSelfKinematic(steering);
    }
Beispiel #2
0
    public SteeringOutput getSteering()
    {
        Vector3 rayVector = s.getCharacter().velocity;

        rayVector.Normalize();
        rayVector *= lookahead;
        //Debug.Log(lookahead);
        // Does the ray intersect any objects excluding the player layer
        collisionDetector = new RaycastHit();
        float angleInc = 10f;

        //Debug.DrawRay(s.getCharacter().position, s.getCharacter().velocity, Color.green);
        for (int i = 0; i < 6; i++)
        {
            Vector3 rotRayVec;
            if (i % 2 == 0)
            {
                rotRayVec = Quaternion.AngleAxis(angleInc * -(i / 2), Vector3.up) * rayVector;
            }
            else
            {
                rotRayVec = Quaternion.AngleAxis(angleInc * Mathf.Ceil(i / 2), Vector3.up) * rayVector;
            }


            rotRayVec.Scale(new Vector3(1f, 0f, 1f));
            Debug.DrawRay(s.getCharacter().position, rotRayVec, Color.cyan);
            s.getCharacter().owner.GetComponent <NPCController>().DrawLine(s.getCharacter().owner.transform.position, rotRayVec * lookahead);
            if (Physics.Raycast(s.getCharacter().position, rotRayVec, out collisionDetector, lookahead))
            {
                if (collisionDetector.collider.gameObject.Equals(s.getCharacter().owner))
                {
                    continue;
                }

                Debug.DrawRay(collisionDetector.point, collisionDetector.normal * avoidDistance, Color.red);
                s.setTargetPosition(collisionDetector.point + (collisionDetector.normal * avoidDistance));
                Kinematic avoid = new Kinematic()
                {
                    position = collisionDetector.point + (collisionDetector.normal * avoidDistance)
                };
                //targetPos = s.getTarget().position;

                DynamicSeek seekAvoidPoint = new DynamicSeek(s.getCharacter(), avoid, maxAcceleration);
                return(seekAvoidPoint.getSteering());
            }
        }

        try
        {
            targetPos = s.getTarget().position;
        }
        catch (Exception e) {
        }
        return(s.getSteering());
    }
Beispiel #3
0
    private void arbitroEscenaFinal()
    {
        if (isAlive())
        {
            if (currentAction != null && currentAction is AccionCompuesta) //siguiente accion de la lista
            {
                ((AccionCompuesta)currentAction).actualizeAction();        //aceder a currentaction
            }
            if (currentAction != null && currentAction.isDone())
            {
                kinetic.Clear();
                currentAction     = null;
                selectedBehaviour = null;
                steeringActual    = new Steering();
            }
            else
            {
                //ESTO ESTA MAL DE ALGUNA FORMA

                //auxiliarmente elegimos el primero de la lista
                if (kinetic.Count > 0)
                {
                    kinetic[0].getSteering(this);
                    if ((kinetic[0] as WallAvoidance3WhiswersGridSD).finishedLinear)
                    {
                        if (recalcularAccion)
                        {
                            recalcularAccion = false;
                            if (currentAction != null)
                            {
                                currentAction.doit();
                            }
                        }
                        selectedBehaviour = kinetic[1];
                        if (!(currentAction is AccionCompuesta))
                        {
                            actuadorHumanoNoDriftin();
                        }
                    }
                    else
                    {
                        recalcularAccion  = true;
                        selectedBehaviour = kinetic[0];
                    }
                    steeringActual = selectedBehaviour.getSteering(this);
                }
            }
        }
    }
    public SteeringOutput getSteering()
    {
        Vector3 rayVector = s.getCharacter().velocity;

        rayVector.Normalize();
        rayVector *= lookahead;
        //Debug.Log(lookahead);
        // Does the ray intersect any objects excluding the player layer
        collisionDetector = new RaycastHit();
        float angleInc = 10f;

        //Debug.DrawRay(s.getCharacter().position, s.getCharacter().velocity, Color.green);
        for (int i = 0; i < 6; i++)
        {
            Vector3 rotRayVec;
            if (i % 2 == 0)
            {
                rotRayVec = Quaternion.AngleAxis(angleInc * -(i / 2), Vector3.up) * rayVector;
            }
            else
            {
                rotRayVec = Quaternion.AngleAxis(angleInc * Mathf.Ceil(i / 2), Vector3.up) * rayVector;
            }


            rotRayVec.Scale(new Vector3(1f, 0f, 1f));
            //Debug.DrawRay(s.getCharacter().position, rotRayVec, Color.cyan);
            if (Physics.Raycast(s.getCharacter().position, rotRayVec, out collisionDetector, lookahead))
            {
                //Debug.DrawRay(collisionDetector.point, collisionDetector.normal * avoidDistance, Color.red);
                s.setTargetPosition(collisionDetector.point + (collisionDetector.normal * avoidDistance));
                targetPos = s.getTarget().position;
                DynamicSeek seekAvoidPoint = new DynamicSeek(s.getCharacter(), s.getTarget(), maxAcceleration);
                return(seekAvoidPoint.getSteering());
            }
        }


        targetPos = s.getTarget().position;
        return(s.getSteering());
    }
Beispiel #5
0
    //Calculamos para cada SteeringBehavior su Steering y lo añadimos a una lista
    //para despues seleccionar cual se va a aplicar

    /*void LateUpdate()
     * {
     *  arbitro();
     * }*/


    //Seleccionamos que Steering se va a aplicar recorriendo la lista kinetic
    //actualizando el atributo steeringActual
    private void arbitro()
    {
        //auxiliarmente elegimos el primero de la lista
        if (kinetic.Count > 0)
        {
            //steeringActual = kinetic[0].getSteering(this); //se hace antes para hacer el raycast y no hacerlo dos veces
            //CHECK IF WALLAVOIDANCE
            int i = 0;
            if ((kinetic[0] as WallAvoidance3WhiswersSD) != null)
            {
                steeringActual = kinetic[0].getSteering(this);
                if ((kinetic[0] as WallAvoidance3WhiswersSD).finishedLinear)
                {
                    i = 1;
                    // lo que no es evadir parede
                    bool allFinished = true;

                    for (i = 1; i < kinetic.Count; i++)
                    {
                        if (!(kinetic[i].finishedLinear && kinetic[i].finishedAngular))
                        {
                            selectedBehaviour = kinetic[i];
                            allFinished       = false;
                            break;
                        }
                    }
                    if (allFinished)
                    {
                        newTask(defaultSteering);
                        selectedBehaviour = kinetic[1];
                    }
                    else
                    {
                        selectedBehaviour = kinetic[i];
                    }
                    if (allFinished)
                    {
                        i--;
                    }
                    selectedBehaviour = kinetic[i];
                    steeringActual    = selectedBehaviour.getSteering(this);
                }
                else
                {
                    selectedBehaviour = kinetic[0];
                }
            }
            else
            {
                bool allFinished = true;
                for (i = i; i < kinetic.Count; i++)
                {
                    if (!(kinetic[i].finishedLinear && kinetic[i].finishedAngular))
                    {
                        selectedBehaviour = kinetic[i];
                        allFinished       = false;
                        break;
                    }
                }
                if (allFinished)
                {
                    newTask(defaultSteering);
                    selectedBehaviour = kinetic[1];
                }
                else
                {
                    selectedBehaviour = kinetic[i];
                }
                selectedBehaviour = kinetic[i];
                steeringActual    = selectedBehaviour.getSteering(this);
            }
            //CUANDO NO HAY WALL AVOIDANCE
            //selectedBehaviour = kinetic[0];

            //steering finish

            /*if (steeringActual.angular == 0 && steeringActual.linear == Vector3.zero)
             * {
             *  kinetic.RemoveAt(0);
             *  steeringActual = null;
             * }*/
        }
    }