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());
    }
        public HumanActuator(DynamicCharacter character)
        {
            SeekMovement = new DynamicSeek
            {
                MaxAcceleration = 60f,
                Character       = character.KinematicData,
                StopRadius      = 49f // 49 = 7^2
            };

            this.Character          = character;
            this.Character.MaxSpeed = 30f;

            FollowPathMovement = new DynamicFollowPath(character.KinematicData)
            {
                MaxAcceleration = 40f,
                MaxSpeed        = 30f,
                SlowRadius      = 3.5f,
                StopRadius      = 3f,
                GoalPosition    = GoalPosition
            };
        }
Exemple #3
0
        public override MovementOutput GetMovement()
        {

           MovementOutput steering = new MovementOutput();

            // Percorrer cada canal
            if (goal.hasOrientation)
            {
                // usar o DynamicAlign...
                DynamicVelocityMatch da = new DynamicVelocityMatch()
                {
                    Character = this.Character,
                    Target = new KinematicData(),
                    MaxAcceleration = this.MaxAcceleration
                };
                da.Target.orientation = goal.orientation;
                steering.angular += da.GetMovement().angular;
            }

            if (goal.hasPosition)
            {
                // usar o DynamicSeek
                DynamicSeek ds = new DynamicSeek()
                {
                    Character = this.Character,
                    Target = new KinematicData(),
                    MaxAcceleration = this.MaxAcceleration
                };
                ds.Target.position = goal.position;
                steering.linear += ds.GetMovement().linear;
            }

            //  velocidades e possivelmente erros

            steering.linear.Normalize();
            steering.linear *= this.MaxAcceleration;
            steering.angular *= this.MaxAcceleration;            

            return steering;
        }
        public CarActuator(DynamicCharacter character)
        {
            SeekMovement = new DynamicSeek()
            {
                MaxAcceleration = 80f,
                Character       = character.KinematicData,
                StopRadius      = 49f // 49 = 7^2
            };

            this.Character           = character;
            this.Character.BackingUp = false;
            //setting character MaxSpeed according to actuator
            this.Character.MaxSpeed = 40f;
            this.FollowPathMovement = new DynamicFollowPath(character.KinematicData)
            {
                MaxAcceleration = 60f,
                MaxSpeed        = 50f,
                SlowRadius      = 15f,
                StopRadius      = 7f,
                GoalPosition    = GoalPosition
            };
        }
Exemple #5
0
        public override MovementOutput GetMovement()
        {
            MovementOutput steering = new MovementOutput();

            // Percorrer cada canal
            if (goal.hasOrientation)
            {
                // usar o DynamicAlign...
                DynamicVelocityMatch da = new DynamicVelocityMatch()
                {
                    Character = this.Character,
                    Target = new KinematicData(),
                    MaxAcceleration = this.MaxAcceleration
                };
                da.Target.orientation = goal.orientation;
                steering.angular += da.GetMovement().angular;
            }

            if (goal.hasPosition)
            {
                // usar o DynamicSeek
                DynamicSeek ds = new DynamicSeek()
                {
                    Character = this.Character,
                    Target = new KinematicData(),
                    MaxAcceleration = this.MaxAcceleration
                };
                ds.Target.position = goal.position;
                steering.linear += ds.GetMovement().linear;
            }

            //  velocidades e possivelmente erros

            steering.linear.Normalize();
            steering.linear *= this.MaxAcceleration;
            steering.angular *= this.MaxAcceleration;

            return steering;
        }
        public void ManageAI(MovementAI ai, Rigidbody2D character)
        {
            Kinematic characterKinematic = KinematicAdapter.FromRigidbody2DToKinematic(character);
            Kinematic targetKinematic    = new Kinematic();
            Algorithm algorithm          = new DynamicNone();

            switch (ai.aiAlgorithm)
            {
            case AIAlgorithm.DynamicSeek:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicSeek(characterKinematic, targetKinematic, ai.maxSpeed);
                break;

            case AIAlgorithm.DynamicFlee:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicFlee(characterKinematic, targetKinematic, ai.maxSpeed);
                break;

            case AIAlgorithm.DynamicArrive:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicArrive(characterKinematic, targetKinematic, ai.maxAcceleration, ai.maxSpeed, ai.targetRadius, ai.slowRadius, ai.timeToTarget);
                break;

            case AIAlgorithm.DynamicAlign:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicAlign(characterKinematic, targetKinematic, ai.maxRotation, ai.maxAngularAcceleration,
                                                   ai.targetRadius, ai.slowRadius, ai.timeToTarget);
                break;

            case AIAlgorithm.DynamicVelocityMatch:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicVelocityMatch(characterKinematic, targetKinematic, ai.maxAcceleration, ai.timeToTarget);
                break;
            }
            SteeringOutput steering = algorithm.getSteering();

            steering.Apply(characterKinematic, ai.lookWhereYoureGoing, ai.maxSpeed, Time.deltaTime);
            KinematicAdapter.UpdateRigidbody2DWithKinematic(character, characterKinematic);
        }
Exemple #7
0
 public ObstacleAvoidance(RaycastHit _collisionDetector, float _avoidDistance, float _lookahead, DynamicSeek _s)
 {
     collisionDetector = _collisionDetector;
     avoidDistance     = _avoidDistance;
     lookahead         = _lookahead;
     s = _s;
 }
Exemple #8
0
 void Awake()
 {
     dynamicSeek = new DynamicSeek(GetComponent <Rigidbody>(), getTargetPosition(), magnitude);
 }
Exemple #9
0
 // Use this for initialization
 void Start()
 {
     seek  = GetComponent <DynamicSeek>();
     align = GetComponent <DynamicAlign>();
 }
Exemple #10
0
    public SteeringOutput ObstacleSeek()
    {
        DynamicSeek sb = new DynamicSeek(agent.k, target.k, maxAcceleration);

        return(ObstacleAvoidance(sb));
    }
Exemple #11
0
    public SteeringOutput ObstacleAvoidance(SteeringBehaviour behaviourWhenNotAvoiding)
    {
        Kinematic currentTarget = target.k;

        float dis = (agent.k.position - currentTarget.position).magnitude;

        if (dis <= slowRadiusL && agent.mapState != 7)
        {
            return(Arrive());
        }
        stationaryTimeIncrimented = false;

        //trigger, sets unstuck position
        if (stationaryTime > 5f)
        {
            seekingUnstuckPoint = true;
            stationaryTime      = 0f;
            //unstuckTarget.position = agent.k.position - (Quaternion.Euler(0f, Random.Range(0,360f), 0f) * Vector3.forward)*15f;
            unstuckTarget.position = agent.k.position + getEscapeVector(agent.k.position, 20).normalized * 10f;
        }

        SteeringBehaviour s;

        if (seekingUnstuckPoint)
        {
            currentTarget = unstuckTarget;
            if ((agent.k.position - unstuckTarget.position).magnitude < slowRadiusL)
            {
                seekingUnstuckPoint = false;
            }
            s = new DynamicSeek(agent.k, currentTarget, maxAcceleration);
        }
        else
        {
            s = behaviourWhenNotAvoiding;
        }



        //DynamicPursue dp = new DynamicPursue(agent.k, target.k, maxAcceleration, maxPrediction);
        deltaPos = lastFramePos - agent.k.position;
        //check if x is stagnant

        //check if it is heading in the direction of the target

        if (s.isStuck())
        {
            stationaryTime += Time.deltaTime;
        }
        else
        {
            stationaryTime -= Time.deltaTime;
            stationaryTime  = Mathf.Max(0, stationaryTime);
        }
        //if (Vector3.Dot(agent.k.velocity.normalized, (currentTarget.position - agent.k.position).normalized) < 0.8f)
        //{

        //    if (deltaPos.x < theta)
        //    {
        //        stationaryTime += Time.deltaTime;
        //        stationaryTimeIncrimented = true;
        //    }

        //    //check for z
        //    else if (deltaPos.z < theta)
        //    {
        //        if (!stationaryTimeIncrimented)
        //        {
        //            stationaryTime += Time.deltaTime;
        //        }
        //    }
        //}
        //else {


        //    //stationaryTime = 0;
        //}
        DynamicObstacleAvoidance doa = new DynamicObstacleAvoidance(3f, 2f, s, maxAcceleration);
        SteeringOutput           so  = doa.getSteering();

        if (agent.mapState == 7)
        {
            agent.DrawCircle(targetPos, wanderRadius);
        }
        else
        {
            agent.DrawLine(agent.k.position, doa.targetPos);
        }
        lastFramePos = agent.k.position;
        return(so);
    }