public void escape_player(Message m) { playerTransform = m.MessageSource.transform; if (m.MessageValue == gameObject.transform.name) { mySwarmState = SwarmState.Escaping_player; } }
// Update is called once per frame void Update() { myTransform.position = prev_pos; switch (mySwarmState) { case SwarmState.Wandering_around: { WanderAround(); UpdatePosition(); } break; case SwarmState.Moving_away_player: { MoveAwayFromPlayers(); UpdatePosition(); } break; case SwarmState.Chasing_player: { myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime); myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime; } break; case SwarmState.Escaping_player: { transform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(myTransform.position - playerTransform.position), 0.001f * Time.deltaTime); myTransform.position -= myTransform.forward * 1 * Time.deltaTime; timer += Time.deltaTime; if (timer > escaping_time) { mySwarmState = SwarmState.Wandering_around; timer = 0; } } break; } prev_pos = myTransform.position; move.x = 0; move.y = 0.008f + amplitude * (Mathf.Sin(2 * Mathf.PI * frequency * Time.time) - Mathf.Sin(2 * Mathf.PI * frequency * (Time.time - Time.deltaTime))); move.z = 0; transform.position += move * 5 * Time.deltaTime; transform.position = new Vector3(Mathf.Clamp(transform.position.x, -3, 3), Mathf.Clamp(transform.position.y, downlimit, uplimit), Mathf.Clamp(transform.position.z, -3, 3)); myTransform.Rotate(new Vector3(-transform.eulerAngles.x, 0, -transform.eulerAngles.z)); }
private void WanderAround() { if ((player1.position - myTransform.position).sqrMagnitude < distanceToPlayers * distanceToPlayers || counterNextPlayer1 != 0) { mySwarmState = SwarmState.Moving_away_player; counterNextPlayer1 = 0f; } else { if ((player2.position - myTransform.position).sqrMagnitude < distanceToPlayers * distanceToPlayers || counterNextPlayer2 != 0) { mySwarmState = SwarmState.Moving_away_player; counterNextPlayer2 = 0f; } else { tiempo += Time.deltaTime; if (transform.localPosition.x > xMax) { x = Random.Range(-speedMax, speedMin); angulo = Mathf.Atan2(x, z) * (180 / 3.141592f) + 90; transform.localRotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, angulo, 0), 0.0001f * Time.deltaTime); tiempo = 0.0f; } if (transform.localPosition.x < xMin) { x = Random.Range(speedMin, speedMax); angulo = Mathf.Atan2(x, z) * (180 / 3.141592f) + 90; transform.localRotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, angulo, 0), 0.0001f * Time.deltaTime); tiempo = 0.0f; } if (transform.localPosition.z > zMax) { z = Random.Range(-speedMax, speedMin); angulo = Mathf.Atan2(x, z) * (180 / 3.141592f) + 90; transform.localRotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, angulo, 0), 0.0001f * Time.deltaTime); tiempo = 0.0f; } if (transform.localPosition.z < zMin) { z = Random.Range(speedMin, speedMax); angulo = Mathf.Atan2(x, z) * (180 / 3.141592f) + 90; transform.localRotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, angulo, 0), 0.0001f * Time.deltaTime); tiempo = 0.0f; } if (tiempo > 5.0f) { x = Random.Range(-speedMax, speedMax); z = Random.Range(-speedMax, speedMax); angulo = Mathf.Atan2(x, z) * (180 / 3.141592f) + 90; transform.localRotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, angulo, 0), 0.0001f * Time.deltaTime); tiempo = 0.0f; } } } }
void Update() { if (behaviour.Exit()) { foreach (SwarmBase state in states) { if (state.Enter()) { behaviour = state; stateType = behaviour.stateType; } } } behaviour.Run(); }
protected override void OnStart() { GameObject go = GameObject.FindGameObjectWithTag("Player"); target = go.transform; x = Random.Range(-speedMax, speedMax); z = Random.Range(-speedMax, speedMax); angulo = Mathf.Atan2(x, z) * (180 / 3.141592f) + 90; transform.localRotation = Quaternion.Euler(0, angulo, 0); prev_pos = myTransform.position; mySwarmState = SwarmState.Wandering_around; Messenger.RegisterListener(new Listener("Insect_catched_player1", gameObject, "escape_player")); Messenger.RegisterListener(new Listener("Insect_catched_player2", gameObject, "escape_player")); }
private void MoveAwayFromPlayers() { if ((player1.position - myTransform.position).sqrMagnitude < distanceToPlayers * distanceToPlayers || counterNextPlayer1 != 0) { if (counterNextPlayer1 == 0) { float length = Vector3.Distance(transform.position, player1.position); x = (transform.position.x - player1.position.x) / length; x *= speedMax; z = (transform.position.z - player1.position.z) / length; z *= speedMax; } counterNextPlayer1 += Time.deltaTime; if (counterNextPlayer1 > waitingNextToPlayer) { counterNextPlayer1 = 0.0f; } } else { if ((player2.position - myTransform.position).sqrMagnitude < distanceToPlayers * distanceToPlayers || counterNextPlayer2 != 0) { if (counterNextPlayer2 == 0) { float length = Vector3.Distance(transform.position, player2.position); x = (transform.position.x - player2.position.x) / length; x *= speedMax; z = (transform.position.z - player2.position.z) / length; z *= speedMax; } counterNextPlayer2 += Time.deltaTime; if (counterNextPlayer2 > waitingNextToPlayer) { counterNextPlayer2 = 0.0f; } } else { mySwarmState = SwarmState.Wandering_around; timer = 0f; } } }
void Start() { controller = GetComponent <SwarmerController>(); stateType = SwarmState.ERROR; }
public override void CheckRange(Player player, GameTime gameTime) { if (State == SwarmState.MovingToDestination) return; // Get aggro if (!IsAggro && gameTime.TotalGameTime - LastAttack > AttackCooldown) { float distSqr = Vector2.DistanceSquared(player.Position, Position); if (distSqr < AggroRange * AggroRange) { IsAggro = true; Player = player; } } // If center point is over player if (player.Hitbox.Over(Position)) { Game1.EventMan.Notify(Events.PlayerSwarmedBySwarm, this); State = SwarmState.Attacking; } }
void MoveTo(Vector2 destination) { Destination = destination; State = SwarmState.MovingToDestination; }
public override void Update(GameTime gameTime) { //float timeDelta = (float)gameTime.ElapsedGameTime.TotalSeconds; if (State == SwarmState.MovingToDestination) { if (Vector2.Distance(Position, Destination) < 10) { State = SwarmState.Neutral; Velocity = Vector2.Zero; LastAttack = gameTime.TotalGameTime; } else { double angle = Math.Atan2(Destination.Y - Position.Y, Destination.X - Position.X); Velocity.X = (float)Math.Cos(angle) * SwarmSpeed; Velocity.Y = (float)Math.Sin(angle) * SwarmSpeed; } } else if (IsAggro) { Point playerCenter = Player.Hitbox.Center; double angle = Math.Atan2(playerCenter.Y - Position.Y, playerCenter.X - Position.X); DrawInFront = true; Velocity.X = (float)Math.Cos(angle) * SwarmSpeed; Velocity.Y = (float)Math.Sin(angle) * SwarmSpeed; } else { DrawInFront = false; } //Position.X += Velocity.X * timeDelta; //Position.Y += Velocity.Y * timeDelta; foreach (var item in Flies) item.UpdatePosition(Position); UpdateMovement(gameTime); }
// Update is called once per frame void Update() { switch (mySwarmState) { case SwarmState.Idle: if (Vector3.Distance(my_user.position, myTransform.position) > 0.2) { mySwarmState = SwarmState.Following_user; } break; case SwarmState.Following_user: if (Vector3.Distance(my_user.position, myTransform.position) < 0.007) { mySwarmState = SwarmState.Idle; } else { //myTransform.rotation = Quaternion.Slerp (myTransform.rotation, Quaternion.LookRotation (my_user.position - myTransform.position), 80 * Time.deltaTime); myTransform.position = my_user.position; //myTransform.forward * moveSpeed * Time.deltaTime; } break; case SwarmState.Guiding_hunter_to_other_user: if (Vector3.Distance(my_user.position, myTransform.position) < 5) { myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(other_user.position - myTransform.position), rotationSpeed * Time.deltaTime); myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime; } timer += Time.deltaTime; if (timer > pasivetime2) { mySwarmState = SwarmState.Guiding_hunter_to_other_insects; timer = 0; } break; case SwarmState.Guiding_hunter_to_other_insects: if (Vector3.Distance(my_user.position, myTransform.position) < 4) { myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(other_insects.position - myTransform.position), rotationSpeed * Time.deltaTime); myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime; } timer += Time.deltaTime; if (timer > pasivetime3) { mySwarmState = SwarmState.Following_user; timer = 0; } break; } myTransform.position = new Vector3(myTransform.position.x, insectsHeight, myTransform.position.z); myTransform.Rotate(new Vector3(-transform.eulerAngles.x, 0, -transform.eulerAngles.z)); }
// Use this for initialization void OnStart() { mySwarmState = SwarmState.Idle; }