-
(2D)Enemy 정해진 영역에서 반복 이동 시키기(+Blend Tree)Unity/제로부터 구현 2023. 12. 14. 15:49728x90
오늘의 구현
정해진 영역 내에서 랜덤한 위치로 반복 이동시키기 + Blend Tree 를 사용해 애니메이션 적용시키기
- 이동 영역을 Enemy기준으로 반지름 n 만큼의 원으로 정하고, 랜덤한 레디언 값으로 접선좌표를 구해 Enemy가 그 지점으로 이동했다가 다시 원래 위치로 돌아오게 만들것입니다.
- lerp 함수에 보간값으로 대칭함수를 사용해 목표지점에 도달했다가 원래위치로 돌아오게 만들 것 입니다.
- 목표 지점으로 이동할때의 이동 방향을 구해 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'Unity > 제로부터 구현' 카테고리의 다른 글
플레이어의 정보를 로컬 저장소에 저장하기 (PlayerPrebs) (0) 2023.12.24 Meteor 구현하기(Shader,Particle 활용) (0) 2023.12.14 플레이어를 기준으로 n크기의 반지름을 가진 원의 접선 그리기. (0) 2023.12.13 Electric Attack 구현하기 ( +Overlap) (0) 2023.12.11 A* 알고리즘을 사용한 길찾기 구현 (0) 2023.12.07 - 이동 영역을 Enemy기준으로 반지름 n 만큼의 원으로 정하고, 랜덤한 레디언 값으로 접선좌표를 구해 Enemy가 그 지점으로 이동했다가 다시 원래 위치로 돌아오게 만들것입니다.