void OnTriggerExit2D(Collider2D collider) { if (collider.GetType() == typeof(BoxCollider2D)) { if (collider.gameObject.layer == 8) { m_ZombieState = ZombieAIState.Idle; } } }
void OnTriggerEnter2D(Collider2D collider) { if (collider.gameObject.layer == 8) { if (collider.GetType() == typeof(BoxCollider2D)) { m_ZombieState = ZombieAIState.Seeking; m_Target = collider.gameObject; } if (collider.GetType() == typeof(CircleCollider2D)) { m_Animator.SetBool("isAttacking", true); } } }
void Update() { if (aiState == ZombieAIState.idle || aiState == ZombieAIState.wandering) { RaycastHit hitInfo; Physics.SphereCast(transform.position, currentCastRadius, transform.forward, out hitInfo, currentCastRadius, playerLayerMask); if (hitInfo.transform != null) { target = hitInfo.transform.gameObject.GetComponent <Player>(); aiState = ZombieAIState.chasing; } } if (aiState == ZombieAIState.chasing) { if (target == null) { aiState = ZombieAIState.idle; return; } rigid.MovePosition(Vector3.MoveTowards(transform.position, target.transform.position, moveSpeed * Time.deltaTime)); float distanceToTarget = Vector3.Distance(transform.position, target.transform.position); if (distanceToTarget > currentCastRadius * 1.4f) { aiState = ZombieAIState.idle; } else if (distanceToTarget < 2 && readyToAttack) { StartCoroutine(Attack()); } } }
void CheckDistance() { if (!FollowTarget) { //TODO CALL IDLE ANIM FollowState = ZombieAIState.Idle; return; } float distancea = (FollowTarget.position - transform.position).magnitude; if (distancea <= AttackDistance) { Vector3 destinya = FollowTarget.position; destinya.y = transform.position.y; transform.LookAt(destinya); StartCoroutine(Attack()); } if (distancea > ApproachDistance) { FollowState = ZombieAIState.Moving; //TODO CALL WALK ANIM } }
//修改状态 public void SetZombieState(ZombieAIState zombieAIState) { zombieState = zombieAIState; }
//静态创建所有状态 //并初始化当前状态为1 void InitializeAIState() { partolState = new PatrolState(this); chasingState = new ChasingState(this); zombieState = partolState; }
void Update() { var status = GetComponent <CharacterStatus>(); CharacterController controller = GetComponent <CharacterController>(); PlayerObjects = GameObject.FindGameObjectsWithTag("Player"); if (PlayerObjects.Length > 0) { FollowTarget = FindClosest().transform; } if (status.IsFear) { CancelAttack = true; Vector3 lui = transform.TransformDirection(Vector3.back); controller.Move(lui * 5 * Time.deltaTime); return; } if (Freeze || status.Freeze) { return; } if (!FollowTarget) { return; } if (FollowState == ZombieAIState.Moving) { float distance = (FollowTarget.position - transform.position).magnitude; if (distance <= ApproachDistance) { FollowState = ZombieAIState.Pausing; //TODO CALL IDLE ANIMATION } else if (distance >= LostSight) { status.Health = status.MaxHealth; FollowState = ZombieAIState.Idle; //TODO CALL IDLE ANIMATION } else { Vector3 forward = transform.TransformDirection(Vector3.forward); controller.Move(forward * Speed * Time.deltaTime); Vector3 destiny = FollowTarget.position; destiny.y = transform.position.y; transform.LookAt(destiny); } if (distance <= AttackDistance) { StartCoroutine(Attack()); } } else if (FollowState == ZombieAIState.Pausing) { Vector3 destinya = FollowTarget.position; destinya.y = transform.position.y; transform.LookAt(destinya); Distance = (transform.position - GetDestination()).magnitude; if (Distance > ApproachDistance) { FollowState = ZombieAIState.Moving; //TODO WALK ANIMATION } } //----------------Idle Mode-------------- else if (FollowState == ZombieAIState.Idle) { Vector3 destinyheight = FollowTarget.position; destinyheight.y = transform.position.y - destinyheight.y; int getHealth = status.MaxHealth - status.Health; Distance = (transform.position - GetDestination()).magnitude; if (Distance < DetectRange && Mathf.Abs(destinyheight.y) <= 4 || getHealth > 0) { FollowState = ZombieAIState.Moving; //TODO CALL WALK ANIMATION } } //----------------------------------- }