public override void Initialize() { base.Initialize(); Body.Mass = 3f; cohesionBehaviour = GetComponent <CohesionBehavior <ChickenState> >(); separationBehaviour = GetComponent <SeparationBehavior <ChickenState> >(); velocityBehaviour = GetComponent <VelocityMatchBehavior <ChickenState> >(); followingBehaviour = GetComponent <FollowingBehavior <ChickenState> >(); fleeingBehaviour = GetComponent <FleeingBehavior <ChickenState> >(); playerFleeingBehavior = GetComponent <PlayerFleeingBehavior <ChickenState> >(); aiComponent.WithTrigger(FleeingTrigger).WithTrigger(FollowingTrigger).WithTrigger(PlayerFleeingTrigger); cohesionBehaviour.TargetPositions = proximitySensor.SensedEntities.Select((e) => e.Body.Position); separationBehaviour.TargetPositions = proximitySensor.SensedEntities.Select((e) => e.Body.Position); velocityBehaviour.TargetVelocities = proximitySensor.SensedEntities.Select((e) => e.Body.LinearVelocity); }
/// <summary> /// Creates a new instance of Navigator. /// </summary> public Navigator() { steerable = new Steerable(); steerable.BlendMode = SteeringBehaviorBlendMode.Solo; steerable.Behaviors.Add(new StuckAvoidanceBehavior()); steerable.Behaviors.Add(wallAvoidance = new WallAvoidanceBehavior() { Enabled = false }); steerable.Behaviors.Add(steerableAvoidance = new SteerableAvoidanceBehavior() { Enabled = false }); steerable.Behaviors.Add(separation = new SeparationBehavior() { Enabled = false }); steerable.Behaviors.Add(arrive = new ArriveBehavior() { Enabled = false }); waypoints = new Queue <Vector3>(); }
public void GroupBehaviours() { Vector3 _acceleration = new Vector3(0.0f, 0.0f, 0.0f); foreach (var agent in swarmNeighbors) { if (!agent.Attacking) { _acceleration = BehaviourUpdate.BehaviourUpdated(WanderBehavior.WanderMove(agent.transform, enemyData.WanderRadius, enemyData.WanderDistance, enemyData.WanderJitter, 1.0f), enemyData.WanderBehaviorWeight); _acceleration += (Vector3)BehaviourUpdate.BehaviourUpdated(CohesionBehavior.CalculateMove(agent.transform, swarmNeighborsTrans), enemyData.CohesionBehaviorWeight); _acceleration += (Vector3)BehaviourUpdate.BehaviourUpdated(SeparationBehavior.SeparationMove(agent.transform, swarmNeighborsTrans, enemyData.SeparationBehaviorRadius), enemyData.SeparationBehaviorWeight); _acceleration += (Vector3)BehaviourUpdate.BehaviourUpdated(AlignmentBehavior.CalculateMove(agent.transform, swarmNeighborsTrans), enemyData.AlignmentBehaviorWeight); agent.Velocity += _acceleration * Time.deltaTime; if (agent.Velocity.magnitude > enemyData.MaxSpeed) { agent.Velocity.Normalize(); agent.Velocity *= enemyData.MaxSpeed; } if (agent.transform.position.x < _bottomLeft.position.x) { agent.Velocity *= -1; } if (agent.transform.position.x > _topright.position.x) { agent.Velocity *= -1; } if (agent.transform.position.y < _topright.position.y) { agent.Velocity *= -1; } if (agent.transform.position.y > _bottomLeft.position.y) { agent.Velocity *= -1; } //agent.transform.position += agent.Velocity * Time.deltaTime; } else { _acceleration = BehaviourUpdate.BehaviourUpdated(SeekBehaviour.SeekMove(agent.transform, agent.Target, enemyData.Swarm_AttackSpeed), enemyData.SeekBehaviorWeight); agent.Velocity += _acceleration * Time.deltaTime; } Vector3 deltaPos = agent.Velocity * Time.deltaTime; if (deltaPos.x == 0 && deltaPos.y == 0) { Debug.Log("Enemy is stuck!"); } agent.transform.position += agent.Velocity * Time.deltaTime; //_acceleration += (Vector3)(BehaviourUpdate.BehaviourUpdated(WallAvoidance.WallAvoidanceCalculation(agent.transform, _bottomLeft.position.x, _topright.position.x, _topright.position.y, _bottomLeft.position.y), enemyData.WallAvoidWeight)); } //transform.position += _velocity * Time.deltaTime; // { // move = BehaviourUpdate.BehaviourUpdated(CohesionBehavior.CalculateMove(agent.transform, swarmNeighbors), 5.0f); // move *= speed; // if (move.sqrMagnitude > squareMaxSpeed) // { // move = move.normalized * maxSpeed; // } // agent.transform.position += (Vector3)move * Time.deltaTime; // } }