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 }; }
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 }; }
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); }
public ObstacleAvoidance(RaycastHit _collisionDetector, float _avoidDistance, float _lookahead, DynamicSeek _s) { collisionDetector = _collisionDetector; avoidDistance = _avoidDistance; lookahead = _lookahead; s = _s; }
void Awake() { dynamicSeek = new DynamicSeek(GetComponent <Rigidbody>(), getTargetPosition(), magnitude); }
// Use this for initialization void Start() { seek = GetComponent <DynamicSeek>(); align = GetComponent <DynamicAlign>(); }
public SteeringOutput ObstacleSeek() { DynamicSeek sb = new DynamicSeek(agent.k, target.k, maxAcceleration); return(ObstacleAvoidance(sb)); }
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); }