ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (2D)Enemy 정해진 영역에서 반복 이동 시키기(+Blend Tree)
    Unity/제로부터 구현 2023. 12. 14. 15:49
    728x90

    오늘의 구현

    정해진 영역 내에서 랜덤한 위치로 반복 이동시키기 + Blend Tree 를 사용해 애니메이션 적용시키기

     

    1. 이동 영역을 Enemy기준으로 반지름 n 만큼의 원으로 정하고, 랜덤한 레디언 값으로 접선좌표를 구해 Enemy가 그 지점으로 이동했다가 다시 원래 위치로 돌아오게 만들것입니다.
      • lerp 함수에 보간값으로 대칭함수를 사용해 목표지점에 도달했다가 원래위치로 돌아오게 만들 것 입니다.
    2. 목표 지점으로 이동할때의 이동 방향을 구해  Blend Tree의 변수로 사용해 줍니다.

    1.

    • 적이 죽지 않았을경우 반복해서 이동 시킬것이며, 목표지점으로 갔다가 원래 위치로 복귀했을시 새로운 목표위치를 찾아 반복적으로 이동 시킬 것 입니다.
    • 보간 함수 lerp는 대칭 함수를 사용합니다. 보간 값은 0부터 1 사이의 값을 가지며, 0에 가까울수록 시작 지점에 가까워지고, 1에 가까울수록 목표 위치에 가까워집니다. 대칭 함수로서 y = (-x^2 + x) * 4를 사용하면 x가 0.5일 때 y가 최대값에 도달하고, x가 1이 되면 y는 0이 됩니다. 
    • 적이 목표위치에 도달하게되면 다시 원래 위치로 돌아올 것이기 때문에 애니메이션을 바꿔줍니다.
        IEnumerator RepetitionMoveCo()
        {
            Vector3 center = transform.position;
    
            while (!isDead)
            {
                bool isTurn = false;
                float percent = 0;
    
                float randomRadian = Random.Range(0f, 2f * Mathf.PI);
                float x = center.x + radius * Mathf.Cos(randomRadian);
                float y = center.y + radius * Mathf.Sin(randomRadian);
                Vector3 pointOnCircle = new Vector3(x, y);
    
                Vector2 dir = (center - pointOnCircle).normalized;
    
                botAnimator.SetFloat("Look X", dir.x);
                botAnimator.SetFloat("Look Y", dir.y);
                botAnimator.SetBool("isWalk", true);
    
                while (percent <= 1)
                {
                    percent += Time.deltaTime * 0.5f;
    
                    if (pointOnCircle.sqrMagnitude - transform.position.sqrMagnitude <0.1f && !isTurn)
                    {
                        isTurn = true;
                        botAnimator.SetBool("isWalk", false);
                        yield return new WaitForSeconds(1f);
                        botAnimator.SetFloat("Look X", dir.x * -1);
                        botAnimator.SetFloat("Look Y", dir.y * -1);
                        botAnimator.SetBool("isWalk", true);
                    }
    
                    float interporation = (-Mathf.Pow(percent, 2) + percent) * 4;
                    transform.position = Vector3.Lerp(center, pointOnCircle, interporation);
    
                    yield return null;
                }
                botAnimator.SetBool("isWalk", false);
                yield return new WaitForSeconds(1f);
    
            }
           
        }

     

    2.

    • Animator에 노드를 Blend Tree를 추가해줍니다.Inspector창에 Blend Type 을 바꿔주고, Parameters에 Animator에 만든 변수를 추가해 줍니다.
    • 애니메이션들을 추가해주고,  PosX,PosY를 설정해줍니다. 
    • 해당 오브젝트가 움직일때 위에 설정한 파라미터에 값을 넣어주면 그 값에 가까운 애니메이션을 재생해줍니다.

     

     

     

     

     

     

     

     

     

    완성

    728x90
Designed by Tistory.