본문 바로가기

Unity/제로부터 구현

(2D)Enemy 정해진 영역에서 반복 이동 시키기(+Blend Tree)

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