728x90
IEnumerator Battle()
    {
     

        myanim.SetBool("IsRunnig", true); // 뛰어오는 애니메이션 재생을위해 
        while (true)
        {
            float distance = Vector3.Distance(transform.position, myTarget.transform.position); // 플레이어와 몬스터사이 거리 재기위함

            myanim.SetBool("IsWalking", false); // walking 이 true 로 안바뀌기위해 
            if(distance <=20f)
            {
                transform.LookAt(myTarget.transform);
            }
            
            nav.SetDestination(myTarget.transform.position); // 따라가게 하기위한 코드 
            if (myanim.GetBool("IsAttack")==true || myanim.GetBool("IsDamage") ==true ) // 공격애니메이션 이나 데미지애니메이션 둘중하나라도 재생중이라면 움직임이 멈추고
            {
                nav.isStopped=true;
            }
            else // 아니라면 움직여라
            {
                nav.isStopped = false;
            }
           

           
            if (distance <= Attackrange) // 거리가 어택사거리 보다 짧거나 같다면 
            {
                if (myanim.GetBool("IsAttack") == false) // 공격중이아니라면 
                {
                    myanim.SetTrigger("Attack"); //공격애니메이션 재생 
                    StartCoroutine(Attack()); // 코루틴시작 
                }


            }

            if(distance >= 20f) // 몬스터와 캐릭터 거리 차이가 20f 가 넘으면 
            {

                myanim.SetBool("IsRunnig", false); // 애니메이션 런 false
                nav.isStopped = true;  // 네비 스탑 
                characterManger.fixTarget =false; // 캐릭터매니저 타겟고정 false 
                ChangeState(State.IDLE); // idle 상태로 변경 
                
            }






            yield return null;
        }
    }

배틀 코루틴 부분에 코드에 distance >= 20f 구절 추가

 

 void ChangeState(State s) // State 변경 
    {

        if (myState == s) return; // 지금 내 state 가 입력받은 state 와 같다면 return 
        myState = s; // 아니라면 내 state 에 입력받은 s 대입 

        switch(myState)
        {
            case State.CREATE:
                break;
            case State.IDLE:
                StopAllCoroutines(); // 모든 코루틴을 멈추고 
                StartCoroutine(GoStartPos()); // 시작위치로 돌아가는 코루틴 시작 

              
                break;
            case State.ROAMING:
                speed = 2f;
               
                StopAllCoroutines(); // 모든 코루틴을 멈추고 
                StartCoroutine(Roaming()); // 로밍 코루틴 시작 

                break;
            case State.BATTLE:
                speed = 3f; // 몬스터 스피드 3 로조정 
                StopAllCoroutines();

                StartCoroutine(OnDamage()); // ondamage 코루틴 시작 
                StartCoroutine(Battle()); // 스타트 코루틴 배틀 
                break;
            case State.DIE: // die 상태로돌입하면 
               
                myanim.SetTrigger("Dead"); // Dead 트리거 작동으로 Dead 애니메이션 나오고 
                StartCoroutine(Disapearing()); // Disapearing 코루틴 시작
                CharacterManger characterManger = GameObject.Find("Archer").GetComponent<CharacterManger>();
                characterManger.fixTarget = false;// 만약 맞았는데 현재 hp 가 0보다작거나 같다면 타겟 세팅을 위해 스타트 코루틴 켜줄 bool 조정 
                break;

        }
        
    }

상태변경때 코드 추가

 

  IEnumerator GoStartPos() // 시작위치로 돌아가는 코루틴 
    {
        
        myCanvas.transform.gameObject.SetActive(false); // 내 캔버스 안보이게 설정 
        myTarget = null; // 내 타겟 null 
        targetIndistance=null; // 콜리더 null 
        speed = 5f;  //스피드 5 
        myanim.SetBool("IsWalking", true); // walk 애니메이션 true 
        while(true)
        {
            transform.LookAt(Startpos); // 시작포지션 바라보게 
            float dist = Vector3.Distance(transform.position, Startpos); // 시작포지션과 몬스터 distance
            
                this.transform.position = Vector3.MoveTowards(transform.position, Startpos, Time.deltaTime*speed); // 시작위치로이동 
          
            if(dist<=0.1f) // 시작 위치랑 몬스터의 거리가 0.1 f 보다 작다면 
            {
                myanim.SetBool("IsWalking", false);                // walk 애니메이션 false 
                ChangeState(State.ROAMING); // 로밍으로변경 
                
            }
            yield return null;
        }
       

    }

시작위치로 돌아가는  코루틴 추가

 

여기 까지 수많은 고민을했다 왜 시작위치로 안갈까

 

결과는 내가 좀더 다양한 함수를 써보고 싶어서 이동하는 함수를 다 다른거를 썼다 nav, movetohwards, 목적지 - 내위치 노말라이즈 해서 더해주는거까지 다양한 함수를 써보고 싶었기때문에 조금 오래 걸린거 같다 .

 

 

 이제는 캐릭터, 몬스터 구현을 끝내고 인벤토리 등을 구현할 예정이기때문에

 

먼저 캐릭터 스탯 구현을 하고 몬스터 정보 구현을 해서 몬스터 스크립트를 조금 정리해서 몬스터 코드를 수정할 일 없게 만들 예정이다. 

 

그리고 깃이 push 가 안되서 revert를 했는데 했떤작업이 다날라가서 지금 .. 14 처음 부터 다시해야한다 ..

 

하 

반응형