Пример #1
0
    /// <summary>
    /// 스테이트 머신
    /// </summary>
    /// <param name="nextState">몬스터의 다음 상태</param>
    public void Set_StateMachine(MONSTER_STATE nextState)
    {
        _state = nextState;

        switch (nextState)
        {
        case MONSTER_STATE.IDLE:
            StartCoroutine(IE_Idle());
            break;

        case MONSTER_STATE.TRACE:
            StartCoroutine(IE_Trace());
            break;

        case MONSTER_STATE.ATTACK:
            StartCoroutine(IE_Attack());
            break;

        case MONSTER_STATE.RETURN:
            StartCoroutine(IE_Return());
            break;

        case MONSTER_STATE.DEAD:
            Dead();
            break;
        }
    }
Пример #2
0
    protected virtual void Awake()
    {
        spawnPosition = transform.position;
        m_nowState    = MONSTER_STATE.IDLE;
        m_moveType    = MoveType.Stay;
        m_Animator    = GetComponentInChildren <Animator>();
        DetectLayer   = 1 << LayerMask.NameToLayer("Player");
        StartCoroutine(ChangeState());

        sc_ViewAngle = GetComponent <ViewAngle>();
        sc_Health    = GetComponent <Health>();

        m_prevHp = sc_Health.curHP;

        grid  = GetComponent <Grid>();
        Astar = GetComponent <AStarCompleted>();

        CC = GetComponent <CharacterController>();

        OriginPosition         = transform.position;
        OriginWalkSpeed        = WalkSpeed;
        FrameCheck             = 5;
        Animation_FrameCheck   = -1;
        ChangeState_FrameCheck = -1;
        TCP_isConnected        = false;
        SendRotation           = transform.rotation;
    }
 protected virtual void Start()
 {
     ms            = MONSTER_STATE.FIND;
     target        = GameObject.FindGameObjectWithTag("Player").transform;
     objectPool    = GameManager.instance.GetComponent <ObjectPool>();
     setter        = GetComponent <AIDestinationSetter>();
     setter.target = target;
 }
Пример #4
0
    IEnumerator StateCheck()
    {
        //오브젝트 풀에 생성시 다른 스크립트의 초기화를 위해 대기
        yield return(new WaitForSeconds(1.0f));

        while (m_bLive)
        {
            if (m_bAppear == false)
            {
                yield return(new WaitForSeconds(0.5f));

                continue;
            }
            //    yield return null;

            if (m_bLive == false)
            {
                yield break;
            }


            float distanceToPlayer = Vector2.Distance(m_playerTransform.position, this.transform.position);


            if (m_animFunction.GetCurrntAnimClipName() == "hit")
            {
                yield return(null);
            }

            if (m_monsterInfo.IsCharacterDie())
            {
                m_eState = MONSTER_STATE.DIE;
            }
            else if (distanceToPlayer < m_attackDistance)
            {
                m_eState = MONSTER_STATE.ATTACK;
            }
            else if (m_eState == MONSTER_STATE.APPEAR)
            {
                m_eState = MONSTER_STATE.MOVE;
            }
            else
            {
                m_eState = MONSTER_STATE.APPEAR;
            }

            if (m_monsterPosition != Monster_Position.Monster_Position_Ground)
            {
                m_eState = MONSTER_STATE.HIT;
                ResetAnim();
                if (m_monsterInfo.IsCharacterDie())
                {
                    m_eState = MONSTER_STATE.DIE;
                }
            }
            yield return(m_secondsDelay);
        }
    }
Пример #5
0
    // -------------------------------------- Send Management -------------------------------------

    // 상태 변경하기
    public void TCP_SendChangeState(MONSTER_STATE desiredState)
    {
        if (ChangeState_FrameCheck == 0)
        {
            switch (m_nowState)
            {
            case MONSTER_STATE.TRACE:
                ChangeState_FrameCheck = -2;
                break;

            case MONSTER_STATE.BATTLE:
                ChangeState_FrameCheck = -1;
                break;
            }

            try
            {
                TCPClient.m_Monster.Monster_ChangeState(
                    Packing.STATE.FANATIC_GUN,
                    index,
                    (UInt64)TCPClient.PROTOCOL.M_CHANGE_STATE,
                    m_nowState,
                    desiredState);

                TCP_isConnected = true;
            }
            catch
            {
                print("Monster_ChangeState / No connection found with Server");
                TCP_isConnected = false;

                switch (desiredState)
                {
                case MONSTER_STATE.TRACE:
                    SetMoveType(MoveType.WalkForward);
                    //m_moveType = MoveType.WalkForward;

                    //print("추적 상태로");

                    break;

                case MONSTER_STATE.BATTLE:
                    m_isAttack    = false;
                    isMoving      = false;
                    MoveTime      = 0;
                    GunAttackOnce = false;

                    //print("전투 상태로");
                    break;
                }

                m_nowState = desiredState;
            }
        }
    }
Пример #6
0
    void MonsterDie()
    {
        m_Animator.SetTrigger("IsDie");
        m_bDie = true;
        m_NaviMesh.Stop();
        m_MonsterState = MONSTER_STATE.MONSTER_DIE;

        GetComponent <CapsuleCollider>().enabled = false;

        Destroy(GetComponent <CapsuleCollider>());
        Destroy(GetComponent <NavMeshAgent>());
    }
Пример #7
0
    private void Awake()
    {
        //몬스터 유저 찾기 2가지 방법중
        //1) 어웨이크에서 유저 오브젝트를 저장 해놓고 좌표 거리계산으로 유저 찾기 << 선택
        //2) 탐색 콜리전으로 크게 콜리젼만들고 콜리젼 안에 들어오면 찾기
        StageManager.Inst.playerTransform = GameObject.FindGameObjectWithTag("Player").GetComponent <Transform>();
        m_playerTransform = StageManager.Inst.playerTransform;

        m_eState = MONSTER_STATE.APPEAR;

        InitMonsterInfo();
        InitAniamation();

        m_attackDistance = m_monsterInfo.GetAttackDistance();
    }
Пример #8
0
    // Use this for initialization
    void Start()
    {
        minX = 0.0f;
        maxX = 50.0f;

        minZ          = 0.0f;
        maxZ          = 30.0f;
        current_state = MONSTER_STATE.walk;
        playerTr      = GameObject.FindGameObjectWithTag("Player").transform;
        nav           = GetComponent <UnityEngine.AI.NavMeshAgent>();
        StartCoroutine(State_Control());
        anim = GetComponentInChildren <Animator>();
        GetNextPosition();
        thisrigidBody = GetComponent <Rigidbody>();
        thisColl      = GetComponent <BoxCollider>();
        EventManager.Instance.AddListener(EVENT_TYPE.GAME_ENEMY_DIE, this);
    }
Пример #9
0
    void MonsterState()
    {
        switch (m_MonsterState)
        {
        case MONSTER_STATE.MONSTER_IDLE:

            Vector3 vDestPos = Vector3.zero;

            vDestPos.x = Random.Range(-50.0f, 50.0f);
            vDestPos.z = Random.Range(-50.0f, 50.0f);

            m_NaviMesh.destination = vDestPos;
            m_NaviMesh.Resume();

            m_MonsterState = MONSTER_STATE.MONSTER_WALK;

            m_Animator.SetBool("IsWalk", true);

            break;

        case MONSTER_STATE.MONSTER_WALK:

            float fRandom = Random.Range(0.0f, 100.0f);

            fRandom = fRandom % 2;

            if (fRandom == 0)
            {
                m_MonsterState = MONSTER_STATE.MONSTER_IDLE;
                m_Animator.SetBool("IsWalk", false);
                m_NaviMesh.Stop();
            }
            else
            {
                Vector3 vPos = Vector3.zero;

                vPos.x = Random.Range(-50.0f, 50.0f);
                vPos.z = Random.Range(-50.0f, 50.0f);

                m_NaviMesh.destination = vPos;
                m_NaviMesh.Resume();
            }

            break;
        }
    }
Пример #10
0
    public IEnumerator State_Control() // 몬스터의 상태변화를 컨트롤합니다
    {
        while (true)
        {
            yield return(new WaitForSeconds(.1f));

            switch (current_state)
            {
            case MONSTER_STATE.idle:
                break;

            case MONSTER_STATE.walk:
                anim.SetTrigger("walk");

                rayDirection = playerTr.position - transform.position;

                if ((Vector3.Angle(rayDirection, transform.forward)) < 45) // 몬스터의 45도 시야안에 있고
                {
                    current_state = MONSTER_STATE.trace;                   // 추격한다
                }
                if (Vector3.Distance(transform.position, tarPos) <= 0.5f)
                {
                    GetNextPosition();     // 몬스터가 랜덤한위치로 이동완료했을때 다음위치를 찾는다
                }
                nav.SetDestination(tarPos);
                break;

            case MONSTER_STATE.trace:
                //anim.SetTrigger("walk");
                nav.SetDestination(playerTr.position);
                if (Vector3.Distance(transform.position, playerTr.position) < 50f) // 플레이어와 몬스터의 위치가 가까우면
                {
                    current_state = MONSTER_STATE.attack;                          // 어택모드
                }
                break;

            case MONSTER_STATE.attack:
                anim.SetTrigger("attack");
                //attack();
                break;
            }
        }
    }
Пример #11
0
    // Update is called once per frame
    void Update()
    {
        if (m_bDie)
        {
            return;
        }

        if (m_PhotonView.isMine)
        {
            m_fTime += Time.deltaTime;

            if (m_fTime >= 10.0f)
            {
                m_fTime = Random.Range(-1.0f, 3.0f);

                //MonsterState();

                if (m_MonsterState == MONSTER_STATE.MONSTER_IDLE)
                {
                    Vector3 vDestPos = Vector3.zero;

                    vDestPos.x = Random.Range(-50.0f, 50.0f);
                    vDestPos.z = Random.Range(-50.0f, 50.0f);

                    m_NaviMesh.destination = vDestPos;
                    m_NaviMesh.Resume();

                    m_MonsterState = MONSTER_STATE.MONSTER_WALK;

                    m_Animator.SetBool("IsWalk", true);
                }
            }

            float fDist = Vector3.Distance(m_TrInfo.position, m_NaviMesh.destination);

            if (fDist <= 2.0f)
            {
                m_MonsterState = MONSTER_STATE.MONSTER_IDLE;
                m_Animator.SetBool("IsWalk", false);
                m_NaviMesh.Stop();
            }
        }
        else
        {
            Vector3 vPos = m_TrInfo.position;

            m_TrInfo.position = Vector3.Lerp(m_TrInfo.position, m_CurrPos, Time.deltaTime * 3.0f);
            m_TrInfo.rotation = Quaternion.Slerp(m_TrInfo.rotation, m_CurrRot, Time.deltaTime * 3.0f);

            if (vPos == m_TrInfo.position)
            {
                m_MonsterState = MONSTER_STATE.MONSTER_IDLE;
                m_Animator.SetBool("IsWalk", false);
            }
            else
            {
                m_MonsterState = MONSTER_STATE.MONSTER_WALK;
                m_Animator.SetBool("IsWalk", true);
            }
        }
    }
Пример #12
0
 void Start()
 {
     monsterState = MONSTER_STATE.BASIC;
 }
Пример #13
0
    // 타겟 지정
    // 플레이어의 classNumber를 받아서 타겟을 판별
    public void Monster_SetTarget(STATE MTYPE, int index, UInt64 _Protocol, MONSTER_STATE nowState, int classNumber)
    {
        UInt64 Protocol = (UInt64)CLASS_STATE.MONSTER_STATE | (UInt64)MTYPE | _Protocol;

        TCPClient.Instance.PackingData(Protocol, PackingData(index, (int)nowState, classNumber));
    }
Пример #14
0
    // 몬스터 상태 변경
    public void Monster_ChangeState(STATE MTYPE, int index, UInt64 _Protocol, MONSTER_STATE nowState, MONSTER_STATE desiredState)
    {
        UInt64 Protocol = (UInt64)CLASS_STATE.MONSTER_STATE | (UInt64)MTYPE | _Protocol;

        TCPClient.Instance.PackingData(Protocol, PackingData(index, (int)nowState, (int)desiredState));
    }