// Use this for initialization void Start() { state = Enemy2State.Idle; player = GameObject.FindGameObjectWithTag("Player"); playerController = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerController>(); }
// 攻撃 void Attack() { m_State = Enemy2State.Attack; var bulletInstance = GameObject.Instantiate(m_Bullet, m_Muzzle.position, m_Muzzle.rotation, m_BulletParent); bulletInstance.GetComponent <Rigidbody>().AddForce(bulletInstance.transform.forward * m_BulletPower); Destroy(bulletInstance, 5); m_AttackCount = 0; }
// Use this for initialization void Start() { m_Rigidbody = GetComponent <Rigidbody>(); m_Agent = GetComponent <NavMeshAgent>(); m_Agent.destination = new Vector3(0.0f, 0.0f, 0.0f); // 追従目標を指定 SetTarget(); m_State = Enemy2State.Attack; m_AttackCount = 0; }
void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "PlayerProjectile") { Instantiate(enemyExplosion, transform.position, transform.rotation); Destroy(other.gameObject); state = Enemy2State.Die; Destroy(this.gameObject, 0.8f); } if (other.gameObject.tag == "Grenade") { Instantiate(grenadeExplosionPrefab, transform.position, transform.rotation); this.transform.position += transform.up * 6.5f * Time.deltaTime; state = Enemy2State.GrenadeDie; Destroy(this.gameObject, 1.2f); } }
void FixedUpdate() { Vector3 direction = (player.transform.position - this.transform.position).normalized; Ray ray = new Ray(this.transform.position, direction); RaycastHit hitinfo; bool isPlayer = Physics.Raycast(ray, out hitinfo, 0.5f); if (isPlayer) { state = Enemy2State.Throw; if (playerController != null && playerController.Projectile && transform.localScale.x == -player.transform.localScale.x) { state = Enemy2State.Die; Instantiate(enemyExplosion, this.transform.position, Quaternion.identity); Destroy(this.gameObject, 0.5f); } isPlayer = false; } //Debug.DrawLine(transform.position, ray.direction, Color.red, 1); }
// Update is called once per frame void Update() { // 一定間隔で追従目標を変更 if (m_ChangeTargetCount >= m_ChangeTargetInterval) { SetTarget(); } // 目標との距離を取得 if (m_Target == null) { return; } float m_Distance = Vector3.Distance(transform.position, m_Target.position); // 目標が近すぎると後退 if (m_Distance < m_MinRange) { m_State = Enemy2State.Backward; } // 目標が遠すぎると前進 else if (m_Distance > m_MaxRange) { m_State = Enemy2State.Forward; } // 目標が射程距離内に居れば攻撃 else { if (m_AttackCount >= m_AttackInterval && GameManager.Instance.m_PlayMode != PlayMode.Combine && GameManager.Instance.m_PlayMode != PlayMode.Release) { Attack(); } } // 目標変更カウンター ++m_ChangeTargetCount; // 攻撃カウンター ++m_AttackCount; }
// Update is called once per frame void Update() { if (transform.position.x > player.transform.position.x) { transform.localScale = new Vector3(1, 1, 1); } else { transform.localScale = new Vector3(-1, 1, 1); } mtime += Time.deltaTime; switch (state) { case Enemy2State.Idle: if (mtime > 0.8f) { if (Mathf.Abs(transform.position.x - transform.position.x) < 3.5f) { state = Enemy2State.Throw; } } Enemy2Idle.SetActive(true); Enemy2Die.SetActive(false); Enemy2GrenadeDie.SetActive(false); Enemy2Throw.SetActive(false); break; case Enemy2State.Die: if (mtime > 1.5f) { AudioSource.PlayClipAtPoint(enemyDie, new Vector3(transform.position.x, transform.position.y, transform.position.z)); mtime = 0; } Enemy2Idle.SetActive(false); Enemy2Die.SetActive(true); Enemy2GrenadeDie.SetActive(false); Enemy2Throw.SetActive(false); if (Enemy2Die != null) { Destroy(this.gameObject,1f); } break; case Enemy2State.GrenadeDie: if (mtime > 1.5f) { AudioSource.PlayClipAtPoint(enemyDie, new Vector3(transform.position.x, transform.position.y, transform.position.z)); mtime = 0; } Enemy2Idle.SetActive(false); Enemy2Die.SetActive(false); Enemy2GrenadeDie.SetActive(true); Enemy2Throw.SetActive(false); if (Enemy2Throw != null) { Destroy(this.gameObject, 1f); } break; case Enemy2State.Throw: Enemy2Idle.SetActive(false); Enemy2Die.SetActive(false); Enemy2GrenadeDie.SetActive(false); Enemy2Throw.SetActive(true); timer -= Time.deltaTime; if (timer < 0 && Mathf.Abs(transform.position.x -player.transform.position.x) < 3.5f) { bomb = Instantiate(bombPrefab, this.transform.position, this.transform.rotation) as GameObject; if ((!float.IsNaN(BallisticVel(player.transform, bomb.transform).x)) && (!float.IsNaN(BallisticVel(player.transform, bomb.transform).y)) && (!float.IsNaN(BallisticVel(player.transform, bomb.transform).z))) bomb.rigidbody.velocity =1.1f*BallisticVel(player.transform,bomb.transform); timer = 0.5f; Destroy(bomb, 5); } break; default: break; } }
// Update is called once per frame void Update() { if (transform.position.x > player.transform.position.x) { transform.localScale = new Vector3(1, 1, 1); } else { transform.localScale = new Vector3(-1, 1, 1); } mtime += Time.deltaTime; switch (state) { case Enemy2State.Idle: if (mtime > 0.8f) { if (Mathf.Abs(transform.position.x - transform.position.x) < 3.5f) { state = Enemy2State.Throw; } } Enemy2Idle.SetActive(true); Enemy2Die.SetActive(false); Enemy2GrenadeDie.SetActive(false); Enemy2Throw.SetActive(false); break; case Enemy2State.Die: if (mtime > 1.5f) { AudioSource.PlayClipAtPoint(enemyDie, new Vector3(transform.position.x, transform.position.y, transform.position.z)); mtime = 0; } Enemy2Idle.SetActive(false); Enemy2Die.SetActive(true); Enemy2GrenadeDie.SetActive(false); Enemy2Throw.SetActive(false); if (Enemy2Die != null) { Destroy(this.gameObject, 1f); } break; case Enemy2State.GrenadeDie: if (mtime > 1.5f) { AudioSource.PlayClipAtPoint(enemyDie, new Vector3(transform.position.x, transform.position.y, transform.position.z)); mtime = 0; } Enemy2Idle.SetActive(false); Enemy2Die.SetActive(false); Enemy2GrenadeDie.SetActive(true); Enemy2Throw.SetActive(false); if (Enemy2Throw != null) { Destroy(this.gameObject, 1f); } break; case Enemy2State.Throw: Enemy2Idle.SetActive(false); Enemy2Die.SetActive(false); Enemy2GrenadeDie.SetActive(false); Enemy2Throw.SetActive(true); timer -= Time.deltaTime; if (timer < 0 && Mathf.Abs(transform.position.x - player.transform.position.x) < 3.5f) { bomb = Instantiate(bombPrefab, this.transform.position, this.transform.rotation) as GameObject; if ((!float.IsNaN(BallisticVel(player.transform, bomb.transform).x)) && (!float.IsNaN(BallisticVel(player.transform, bomb.transform).y)) && (!float.IsNaN(BallisticVel(player.transform, bomb.transform).z))) { bomb.rigidbody.velocity = 1.1f * BallisticVel(player.transform, bomb.transform); } timer = 0.5f; Destroy(bomb, 5); } break; default: break; } }
// Use this for initialization void Start() { state = Enemy2State.Idle; player = GameObject.FindGameObjectWithTag("Player"); playerController = GameObject.FindGameObjectWithTag("Player").GetComponent <PlayerController>(); }
// Update is called once per frame void Update() { //FSM control code below switch (state) { //starts in the default state case Enemy2State.DEFAULT: destination = transform.position + RandomPosition(); //add a random position to the enemy's position that the enemy will move to //if the player is less than the "chaseDistance" from the enemy, switch to the "CHASE" state if (Vector3.Distance(transform.position, player.transform.position) < chaseDistance) { state = Enemy2State.CHASE; } else //move the enemy randomly if the enemy is too far from the enemy { state = Enemy2State.MOVING; agent.SetDestination(destination); //destination will be a random location } if (Vector3.Distance(transform.position, player.transform.position) <= attackDistance) { state = Enemy2State.ATTACK; } break; //Moving state controls random movement case Enemy2State.MOVING: isRunning = true; isAttacking = false; BearAnimations(isRunning, isAttacking); //Debug.Log("Dest = " + destination); //when enemy is < 5 from the random distance, change destination again (done in Default state) if (Vector3.Distance(transform.position, destination) < 5) { state = Enemy2State.DEFAULT; //firePoint.shoot = false; } //if the enemy gets close enough to the player, switch to the chase state and chase the player if (Vector3.Distance(transform.position, player.transform.position) < chaseDistance) { state = Enemy2State.CHASE; //firePoint.shoot = false; } if (Vector3.Distance(transform.position, player.transform.position) <= attackDistance) { state = Enemy2State.ATTACK; //firePoint.shoot = true; } break; //state that chases the player case Enemy2State.CHASE: isRunning = true; isAttacking = false; BearAnimations(isRunning, isAttacking); //FindObjectOfType<AudioManager>().Play("chase"); //if the distance b/w the enemy and player exceeds the chase distance, switch to Default state if (Vector3.Distance(transform.position, player.transform.position) > chaseDistance) { //FindObjectOfType<AudioManager>().Play("lost"); state = Enemy2State.DEFAULT; //firePoint.shoot = false; } if (Vector3.Distance(transform.position, player.transform.position) <= attackDistance) { state = Enemy2State.ATTACK; //firePoint.shoot = true; } FaceTarget(); agent.SetDestination(player.transform.position); //moves the enemy to the player's position break; //state where the enemy attacks the player case Enemy2State.ATTACK: //FindObjectOfType<AudioManager>().Play("shoot"); isRunning = false; isAttacking = true; BearAnimations(isRunning, isAttacking); if (Vector3.Distance(transform.position, player.transform.position) > attackDistance) { //FindObjectOfType<AudioManager>().Play("get back"); state = Enemy2State.CHASE; //firePoint.shoot = false; } if (Vector3.Distance(transform.position, player.transform.position) > chaseDistance) { state = Enemy2State.DEFAULT; //firePoint.shoot = false; } if (Time.time > biteTime) { //FindObjectOfType<AudioManager>().Play("blaster SFX"); //firePoint.FireBullet(); biteTime = Time.time + chewTime; } FaceTarget(); agent.SetDestination(player.transform.position); break; default: break; } }