コード例 #1
0
    private void ChangeAnimations()
    {
        if (CurrentState.HasFlag(EAIState.ALIVE))
        {
            m_animator.animator.SetBool(IDliving, true);
        }
        if (CurrentState.HasFlag(EAIState.IDLE))
        {
            m_animator.animator.SetBool(IDmove, false);
            m_animator.animator.SetBool(IDattack, false);
            m_animator.animator.SetBool(IDdeath, false);
        }
        if (CurrentState.HasFlag(EAIState.MOVING))
        {
            m_animator.animator.SetBool(IDmove, true);
        }
        if (CurrentState.HasFlag(EAIState.ATTACKING))
        {
            m_animator.animator.SetBool(IDattack, true);
        }
        if (!CurrentState.HasFlag(EAIState.ATTACKING) && previousState.HasFlag(EAIState.ATTACKING))
        {
            m_animator.animator.SetBool(IDattack, false);
        }
        if (CurrentState.HasFlag(EAIState.DYING))
        {
            m_animator.animator.SetBool(IDliving, false);

            //now called via animation event
            //KillNPC();
        }
        if (CurrentState.HasFlag(EAIState.DEAD))
        {
            m_animator.animator.SetBool(IDdeath, true);
        }

        previousState = CurrentState;
    }
コード例 #2
0
    protected override void NPCDecision()
    {
        if (CurrentState.HasFlag(EAIState.IDLE) && !CurrentState.HasFlag(EAIState.DEAD))
        {
            if (m_PlayerInRange)
            {
                List <RaycastHit> hits = new List <RaycastHit>();
                RaycastHit        hit;

                foreach (GameObject Player in m_TargetPlayers)
                {
                    if (Physics.Raycast(m_head.transform.position, (Player.transform.position - m_head.transform.position).normalized
                                        , out hit, m_aggroDistance * m_aggroDistance, LayerMask.GetMask(new string[] { "Walls", "Player" })
                                        , QueryTriggerInteraction.Ignore))
                    {
                        Vector3 playerAng = Player.transform.position;
                        playerAng.y = m_head.transform.position.y;
                        float angle = Vector3.SignedAngle((playerAng - m_head.transform.position), m_head.forward, Vector3.up);
                        if (angle >= -90 && angle <= 90)
                        {
                            hits.Add(hit);
                        }
                    }
                }
                if (hits.Count > 0)
                {
                    float distance = m_aggroDistance * m_aggroDistance + 1;
                    foreach (RaycastHit RHit in hits)
                    {
                        float dist = (RHit.transform.position - m_head.transform.position).sqrMagnitude;
                        if (dist < distance)
                        {
                            m_Target = RHit.transform.gameObject;
                            distance = dist;
                        }
                    }
                    CurrentState -= EAIState.IDLE;
                    CurrentState  = CurrentState | EAIState.MOVING;
                }
                else
                {
                    return;
                }
            }
        }
        if (CurrentState.HasFlag(EAIState.MOVING) && !CurrentState.HasFlag(EAIState.DEAD))
        {
            m_agent.destination = m_Target.transform.position;


            if (m_agent.remainingDistance < m_hitdistance &&
                !m_agent.pathPending)
            {
                Attack();

                return;
            }
            else
            {
                NotAttacking();
            }


            if ((m_agent.transform.position - m_Target.transform.position).sqrMagnitude >= m_deAggroDistance)
            {
                m_agent.SetDestination(m_Target.transform.position);

                if (CurrentState.HasFlag(EAIState.ATTACKING))
                {
                    CurrentState -= EAIState.ATTACKING;
                }

                CurrentState -= EAIState.MOVING;
                CurrentState  = CurrentState | EAIState.IDLE;
                return;
            }
        }
    }