728x90

이번에는 맞게되면 타겟을 설정하고 타겟을 따라오게끔 코드를 짯다 

 

 IEnumerator OnDamage() // ondamage코루틴 
    {
        targetIndistance = Physics.OverlapSphere(transform.position, 20f, targetmask); // 20f 안에 player 타겟마스크 콜라이더 받기 
        myTarget = targetIndistance[0].gameObject; // player 는 하나밖에없기때문에 0 번을 내타겟으로설정 
        if (myTarget != null) // 내타겟이 null 이 아니면 
        {
            ChangeState(State.BATTLE); // 배틀모드로 넘어가게 
            
        }
        myrenderer.material.color= Color.red; // 몬스터 색깔 빨강으로 변경 
        yield return new WaitForSeconds(0.2f); // 0.2 초 기다린뒤 
        if(curHp>0)// 현재 hp 가 0보다크다면 
        {
            myrenderer.material.color = new Color(1, 1, 1); //원래색깔로 
            CharacterManger characterManger = GameObject.Find("Archer").GetComponent<CharacterManger>();
            characterManger.fixTarget = true; //만약 맞았는데 현재 hp 가 0보다크면  타겟 고정을 위해 스탑 코루틴 켜줄 bool 조정 
        }
        if (curHp <= 0)//현재 hp 가 0보다 작다면
        {
            ChangeState(State.DIE);
        }

    }

 

몬스터에 Ondamge 코루틴쪽에 첫번째부터 4째줄 까지 추가해주고 

 

IEnumerator Battle()
    {
     
        myanim.SetBool("IsRunnig", true); // 뛰어오는 애니메이션 재생을위해 
        while (true)
        {
            myanim.SetBool("IsWalking", false); // walking 이 true 로 안바뀌기위해 
            if(myanim.GetBool("IsAttack")==false && myanim.GetBool("IsDamage") ==false ) // 공격애니메이션이 재생중이 아니거나 맞는 애니메이션이 재생중이아닐때만 따라가게
            {
                nav.SetDestination(myTarget.transform.position); // 따라가게 하기위한 코드 
            }
            

            float distance = Vector3.Distance(transform.position, myTarget.transform.position); // 플레이어와 몬스터사이 거리 재기위함
            if(distance<= Attackrange) // 거리가 어택사거리 보다 짧거나 같다면 
            {
                if(myanim.GetBool("IsAttack")==false) // 공격중이아니라면 
                {
                    myanim.SetTrigger("Attack"); //공격애니메이션 재생 
                }
                

            }
           
            yield return null;
        }
    }

 

 

새롭게 battle 을 만들어 이번에는 nav 로 나를 따라오게만들었다. 

 

 

 

 

맞는 애니메이션일때 안따라오길 바라고 코드를 짰는데 다시 수정해야할거같다.

 

그리고 로밍상태일때 마지막에 x값이 변경되면서 앞으로 고꾸라지는 현상도 고쳐야할거같다.

 

IEnumerator Battle()
    {
     
        myanim.SetBool("IsRunnig", true); // 뛰어오는 애니메이션 재생을위해 
        while (true)
        {
            myanim.SetBool("IsWalking", false); // walking 이 true 로 안바뀌기위해 

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

            

            float distance = Vector3.Distance(transform.position, myTarget.transform.position); // 플레이어와 몬스터사이 거리 재기위함
            if(distance<= Attackrange) // 거리가 어택사거리 보다 짧거나 같다면 
            {
                if(myanim.GetBool("IsAttack")==false) // 공격중이아니라면 
                {
                    myanim.SetTrigger("Attack"); //공격애니메이션 재생 
                }
                

            }
           
            yield return null;
        }
    }

 

 

이렇게해주니 멈추는거는 잘멈추는데

 

lookat 할때 y값이 0 이라 앞으로 고꾸라지나 싶어서 y값을 몬스터와 같게해줬는데도 고꾸라져서 y값을 조금씩 높혀줬더니 이제는 고꾸라지지 않는다 .

 

 

 

 

 

이제 공격을 구현해줄 차례이다.

 

 

일단은 플레이어 피격을 위해 플레이어에 코드를 넣어준다

 

public Renderer[] meshs;// 플레이어 mesh 배열 
    public bool isDamage; // 무적시간 재는용 
    private void OnTriggerEnter(Collider other)
    {
        if(other.tag == "EnemyAttack") // 닿은 콜리더 tag가 EnemyAttack 일때 
        {
            if (!isDamage) // 무적시간 이 끝났을때 
            {

                float dmage = other.GetComponentInParent<Monster>().Damage; // 몬스터 데미지 얻어와서 hp - 해줄려고
                Debug.Log("Hitplayer"); // 확인용 
                StartCoroutine(Ondamage()); // 코루틴시작 
               
            }
        }
    }

    IEnumerator Ondamage()
    {
        isDamage = true; // 무적시간 재는용 true 라면 무적 
       for(int i=0;i<meshs.Length;i++ ) // mesh 가 여러개있어서 배열로 받아놓고 for 문돌려준다 
        {
            meshs[i].material.color = Color.red; //모든 mseh 를 빨간색으로변경 
        }
         
        yield return new WaitForSeconds(1.0f); // 1초후 
        for (int i = 0; i < meshs.Length; i++)
        {
            meshs[i].material.color = Color.white; // 모든 mesh 흰색으로 변경
        }
        isDamage = false; // 무적시간 재는용 false 
    }

 

 

이런식으로 넣어주고 

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


            }


   IEnumerator Attack() 
    {
        AttackPoint.SetActive(true); // 어택 콜리더 활성화 
        

        yield return new WaitForSeconds(1f);// 1초후 
        AttackPoint.SetActive(false);// 어택콜리더 비활성화 


}

 

 

스타트 코루틴만 넣어줬고 

 

이런식으로 하게되면 

 

 

 

 

이런식으로 되게된다

 

나는 데미지 입는 애니메이션이 있는거보다는  색만 변경되는게 좋아서 이런식으로 하려고한다 .이제는 맵을 구하기위해서 에셋을 조금 찾아보고 터레인등으로맵을 제작하려한다 . 

반응형