본문 바로가기

Unity/Unity2D_TopDown

Unity2D_TopDown 십자이동 , 레이케스트(RayCast)

1.플레이어 십자이동 구현

 

 

2. 애니메이션

 

(1) - Asset에 Animation폴더 생성

(2) - 애니메이션 스프라이트를 끌어다가 Player에게 드로그앤 드랍

(3) - 아래와 같이 Make Transition 하고 각 트랜지션에

* 겹치는 구간 없게 -> Transition Duration = 0

 +Any state 에서 오른쪽 애니메이션인 player_right_walk state 로 가기위한 Transition 조건은 3번째 아래 스크린샷에 보이는 파라미터 HorizontalAnimation >0, isChanged true 일때 이다
나머지 방향도 같은원리

 

 

 

(4) - 플레이어 애니메이션 스크립트 작성

 

→입력

h=1 ,

HorizontalAnimation =0, h=1 따라서 isChanged = true,  
HorizontalAnimation = 1  
HorizontalAnimation > 0  
Any State(Down_idle) -----> right_walk : right_walk에서 머무르면서 반복재생

HorizontalAnimation =1 , h=1 따라서 isChanged = false 
 
↑ 입력하는 순간 
v=1

VerticalAnimation =0, v=1 따라서 isChanged = true 
VerticalAnimation = 1 
VerticalAnimation >0 
Any State(right_walk)------> Up_walk(Any State) -------->right_walk 실행

 

→키를 누른 상태에서 다른 방향키를 누르면 예를 들어 ↑ 키를 눌렀다가 땟다가 하면 
↑ 애니메이션은 실행이 안되는 것처럼 보이고 → 애니메이션만 재실행한다

(실은 ↑애니메이션이 실행되자마자 바로 → 애니메이션이 실행되버리는 것임)

이후 ↑를 쭉 누르고 있어도(→는 계속 누르고 있는 상황)  → 애니메이션만 반복실행

 

 

위 상태를 해결하기 위해서는

Any State에서 나오는 Transition에서 Can Transition To를 체크 해제 해주어야 함

 

 

추론 : Any state에서 넘어가는 애니메이션을 결정하는 Transition이 Can Transition To (self)가 체크
되어 있다면
만약 Any State의 Transition조건을 만족하여 어떠한 애니메이션이 진행중인 상태에서
그 조건을 계속 만족하면서 또 다른 새로운 조건도 계속 만족한다면 
이미 조건을 만족하여 실행하고 있었던 해당 애니메이션이 우선하여 반복실행된다
만약 Can Transition To(self)가 체크 해제 되어 있다면
같은 상황에서 후입력되어 조건을 만족한 애니메이션이 반복실행된다

 

 

 

 

3. RayCast 로 Palyer이 보고있는 방향 앞 부분 Scan하기

3-1 Debug.DrawRay로 먼저 RayCast를 그려보기

 (1) - 플레이어로부터 뻗어나올 레이케스트가 향할 방향을 결정하는 Vector2 playerDirect; 전역번수를 선언한다

 (2) - 플레이어의 수평속도h, 수직속도 v에 따라 정해질 playetDirect의 벡터 방향을 결정하는 함수를 생성

 

 

(3) - 수평, 수직버튼을 누르고 때면서 플레이어가 이동하는 방향에 맞추어 레이케스트의 방향이 올바르게 정해지도록

       함수를 이용하여 구현

 

 

(4) -

Debug.DrawRay(레이져가 시작하는 위치(Player), 레이저가 향하는 방향(playerDirect)*길이(기본1), 레이저 색(green) )

 

 

(5) - DrawRay로 RayCast가 그려진 모습

 

 

 

3-2 실제로 RayCast를 발사하기

(1) - RaycastHit2D rayHit = physics2D.Raycast(발사시작점, 발사방향, 길이, 스캔할 Layer의 이름)

(2) - 만약 레이져을 맞은 rayHit의 콜라이더가 있다면 "물체 스캔중" 콘솔 출력

(3) - 없다면 "물체가 스캔안됌" 콘솔출력

 

 

3-3 실제로 RayCast를 맞은 Layer가 "Object"인 게임오브젝트가 있다면 그 오브젝트를 미리 선언한 scanObject 변수에 할당하고 만약 스페이스바를 눌럿고 scanObject가 있다면

$"This is : {scanObject.name}"을 콘솔 출력하도록 구현