Esempio n. 1
0
    //----------------------------------------------------------------------------------------------------
    /// <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;
    }
Esempio n. 2
0
 //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);
 }
Esempio n. 3
0
 //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);
 }
Esempio n. 4
0
    //----------------------------------------------------------------------------------------------------
    /// <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;
        }
    }
Esempio n. 5
0
 public void wakeup()
 {
     if (anim == null)
     {
         CurrentStatus = EnemyBehaviorStatus.Waiting;
     }
     else
     {
         StartCoroutine(WakeUpAnimate());
     }
 }
Esempio n. 6
0
    //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());
        }
    }
Esempio n. 7
0
    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
    }
Esempio n. 8
0
    //----------------------------------------------------------------------------------------------------
    /// <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;
        }
    }
Esempio n. 9
0
    //----------------------------------------------------------------------------------------------------
    /// <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;
        }
    }
Esempio n. 10
0
 public void ChangeStatus(EnemyBehaviorStatus s)
 {
     PreviousStatus = CurrentStatus;  CurrentStatus = s;
 }