//---------------------------------------------------------------------------------------------------- /// <summary> /// プレイヤーを追跡 /// </summary> void TrackingPlayer() { //移動方向 m_directionTravelPrev = m_directionTravel; m_directionTravel = (m_lineSightInfo.transform.position - transform.position).normalized; //攻撃範囲にプレイヤー if (m_lineSightInfo.distance <= m_attackableDistance) { m_behaviorState = EnemyBehaviorStatus.BeforeAttack; m_speed = 0; m_isAttackMotion = true; transform.LookAt( Vector3.Scale(m_lineSightInfo.transform.position, (Vector3.right + Vector3.forward)) + Vector3.Scale(transform.position, (Vector3.up))); m_countAttackTime = 0; return; } //移動 m_behaviorState = EnemyBehaviorStatus.Run; m_speed = m_runSpeed; transform.LookAt( Vector3.Scale(m_lineSightInfo.transform.position, (Vector3.right + Vector3.forward)) + Vector3.Scale(transform.position, (Vector3.up))); transform.position += m_directionTravel * m_speed * Time.deltaTime; }
//check if the status is something that interupts other actions public bool IsInterupted(EnemyBehaviorStatus status) { if (status == EnemyBehaviorStatus.BeingFinished || status == EnemyBehaviorStatus.Dying || status == EnemyBehaviorStatus.Frozen || status == EnemyBehaviorStatus.Staggered) { return(true); } return(false); }
//Check if a status is busy or not, this check if the given status is something that should not be interupted public bool IsBusy(EnemyBehaviorStatus status) { if (status != EnemyBehaviorStatus.PrimaryAttacker && status != EnemyBehaviorStatus.ArcRunner && status != EnemyBehaviorStatus.SurroundPlayer && status != EnemyBehaviorStatus.Waiting) { return(true); } return(false); }
//---------------------------------------------------------------------------------------------------- /// <summary> /// ダメージ /// </summary> /// <param name="attack">攻撃</param> void Damage(MyAttack attack) { m_hp -= attack.Power; //死亡 if (m_hp <= 0) { Destroy(gameObject, m_timeToDie); m_behaviorState = EnemyBehaviorStatus.Die; } }
public void wakeup() { if (anim == null) { CurrentStatus = EnemyBehaviorStatus.Waiting; } else { StartCoroutine(WakeUpAnimate()); } }
//THIS IS THE ONLY WAY AN ENEMY SHOULD BE KILLED public void KillEnemy(bool forceDestroy = false) { if (ArcAngle != 360 && CurrentStatus != EnemyBehaviorStatus.ArcRunner) { director.ReturnAngle(ArcAngle); ArcAngle = 360; } if (myAction != EnemyActions.None) { switch (myAction) { case EnemyActions.NormalAttack: director.NormalAttackCompleted(); break; case EnemyActions.Special1: director.Special1AttackCompleted(); break; default: break; } } timesKilled++; if (timesKilled >= finishersToKill) //kill enemy with an animation playing { if (forceDestroy) { Destroy(gameObject); } anim.updateMode = AnimatorUpdateMode.UnscaledTime; GetEnemyMovementCtrl.enabled = false; CurrentStatus = EnemyBehaviorStatus.Dying; GetComponent <CapsuleCollider>().enabled = false; anim.Play("Death"); this.enabled = false; StartCoroutine(DestroyEnemy()); } //BossComment specific code if (etc.MyEnemyType == EnemyType.Boss && (float)(finishersToKill - GetTimesKilled()) / finishersToKill < .34f) { etc.EnemySkin.material = GetComponent <Enemyhp>().lowRed; GetEnemyMovementCtrl.ResumeMovement(); GetEnemyMovementCtrl.SetLockToGround(true); GetComponent <EnemyMovementController>().EnableNavAgent(); } else if (etc.MyEnemyType == EnemyType.Boss && (float)(finishersToKill - GetTimesKilled()) / finishersToKill < .68f) { StartCoroutine(PutOnFountain()); } }
IEnumerator WakeUpAnimate() { anim.SetFloat("SleepModifier", 1); yield return(new WaitForSeconds(3.4f)); if (!director.IsInterupted(CurrentStatus)) { anim.Play("Idle"); CurrentStatus = EnemyBehaviorStatus.Waiting; } //Animation Section End }
//---------------------------------------------------------------------------------------------------- /// <summary> /// 攻撃 /// </summary> void Attack() { m_countAttackTime += Time.deltaTime; //攻撃時間 if (m_countAttackTime <= m_timeBeforeAttack) { m_behaviorState = EnemyBehaviorStatus.BeforeAttack; } else if (m_countAttackTime <= m_timeBeforeAttack + m_attackTime) { m_behaviorState = EnemyBehaviorStatus.Attack; } else { m_isAttackMotion = false; } }
//---------------------------------------------------------------------------------------------------- /// <summary> /// 徘徊 /// </summary> void WanderingAround() { //移動箇所なし if (m_movingPos.Length <= 1) { m_behaviorState = EnemyBehaviorStatus.Idle; return; } //移動方向 m_directionTravelPrev = m_directionTravel; m_directionTravel = (m_movingPos[m_numMovingPos] - transform.position).normalized; //移動 m_behaviorState = EnemyBehaviorStatus.Walk; m_speed = m_walkSpeed; transform.LookAt(Vector3.Scale(m_movingPos[m_numMovingPos], (Vector3.right + Vector3.forward)) + Vector3.Scale(transform.position, (Vector3.up))); transform.position += m_directionTravel * m_speed * Time.deltaTime; //目的地到着 if (Vector3.Cross(m_directionTravelPrev, transform.right).y <= 0) { //目的地を循環するか if (m_isCirculation) { //循環する位置 m_numMovingPos = ++m_numMovingPos % m_movingPos.Length; } else { //来た道を戻る位置 m_signOfNumMovingPos = (m_numMovingPos <= 0) ? +1 : (m_numMovingPos >= m_movingPos.Length - 1) ? -1 : m_signOfNumMovingPos; m_numMovingPos += m_signOfNumMovingPos; } //方向転換 transform.LookAt(Vector3.Scale(m_movingPos[m_numMovingPos], (Vector3.right + Vector3.forward)) + Vector3.Scale(transform.position, (Vector3.up))); m_directionTravel = transform.forward; } }
public void ChangeStatus(EnemyBehaviorStatus s) { PreviousStatus = CurrentStatus; CurrentStatus = s; }