언리얼 기초 공부(3) 25.01.06

HyeonjungYun·2025년 1월 6일

언리얼 기초

목록 보기
3/23

액터의 이동

각 액터의 트랜스폼을 조정하여 액터의 위치를 변환하거나 액터의 위치 값을 가져올 수 있다.


블루프린트 그래프에서 우클릭 후 트랜스포메이션을 검색하면 각종 액터의 트랜스폼에 관한 노드들이 나온다.

Add : 현재 트랜스폼에서 위치, 회전 등을 더해주는 기능을 한다.
Get : 현재 액터의 정보를 가져오는 기능을 한다.
Set : 현재 액터의 정보를 새로운 정보로 바꾸는 기능을 한다

액터 트랜스폼의 Add, Get, Set


Add Actor Local Transform을 검색하여 노드를 생성한다.


Add Actor Local Transform노드의 New Transform에서 끌어와 Make Transform을 검색하여 노드를 생성한다.
새롭게 노드가 만들어지면 transform이 지정되는데 Add Actor Local Transform의 타겟이 self를 가리키므로 현재 액터의 위치를 조정하는 역할을 한다.
Make Transform에 적힌 좌표만큼 현재 액터의 좌표에 더한다.


블루프린트 그래프에서 우클릭 후 Get Actor Transform을 검색 후 노드를 생성한다.


Get Actor Transform노드는 액터의 위치값을 반환하는 역할을 하는데 타겟이 self이므로 현재 지정된 액터의 위치값을 반환한다.


Set Actor Local Transform을 검색하여 노드를 생성한다.


Set Actor Local Transform 노드는 현재 위치를 새로운 값으로 바꾼다.


New Transform에서 끌어와 Make Transform을 검색하여 노드를 생성한다.
Set Actor Local Transform의 타겟이 self이므로 새롭게 지정된 트랜스폼의 값으로 현재 액터의 위치를 완전히 바꾸는 것이다.

생성된 노드들의 모습이다.
Local Transform의 노드들을 보면 Sweep, Teleport항목이 보이는데 둘다 새로운 위치로 이동하면서 순간이동 하느냐, 이동 경로를 휩쓸고 가느냐에 차이점이 있다.

Sweep은 새로운 위치까지 이동하면서 중간 경로를 휩쓸고 지나가면서 경로에 있는 물체들에 대해서 오버랩 즉, 겹침 이벤트를 발생시킨다.

Teleport는 새로운 위치로 순간이동한다. 그렇기 때문에 오버랩 현상이 발생하지 않는다.

컴포넌트 노드

컴포넌트 창의 DefaultSceneRoot를 클릭 후 드래그 하여 이벤트 그래프로 드랍하면 변수처럼 사용이 가능하다.


생성된 노드에서 새로운 노드를 생성시키기 위해 트랜스포메이션을 검색하면 add, get, set이 나오는 것을 볼 수 있는데, 여기서 add, get, set은 액터가 아닌 컴포넌트에 관한 노드이다.

컴포넌트 활성화/비활성화

컴포넌트는 액터의 기능을 담당하기 때문에 원치않은 기능을 비활성화 시키거나 다시 활성화 시킬 수 있다.


이벤트 그래프에서 우클릭 후 활성화를 검색하면 Active, Deactive, Is Active가 나온다.

Active : 현재 컴포넌트를 활성화한다.
Deactive : 현재 컴포넌트를 비활성화한다.
Is Active : 현재 컴포넌트가 활성화 되어있는지 확인한다.

컴포넌트의 유효 여부


이벤트 그래프에서 Is Valid를 검색하면 두개의 노드가 나온다.


f표시가 된 Is Valid 노드는 현재 컴포넌트가 정상적인지 확인하는 기능을 한다.
예를 들어 컴포넌트가 삭제 되었거나, 상태가 불안정한 상태(삭제가 될 예정인 상태)라면 return 값에 false가 반환되고, 정상이라면 true가 반환된다.


? 표시가 된 Is Valid 노드는 Branch노드와 기능이 유사한데, 이 노드는 실행을 받아서 input object의 내용을 확인하고 정상이라면 is Valid쪽이 실행되고 정상이 아니라면 is Not Valid쪽이 실행된다.

라이트, 카메라 컴포넌트의 노드


컴포넌트 창에서 포인트 라이트 컴포넌트를 추가한다.


포인트 라이트 컴포넌트를 드래그 드롭하여 포인트 라이트를 변수로 불러와서 라이트라고 검색하면 여러가지 라이트의 세팅이 가능하다.

여기서 컴포넌트의 항목의 라이트 하위 항목에서 get light color, set bloom scale, set intensity등의 노드들을 불러와 라이트 컴포넌트의 세부설정을 조정할 수도 있다.


카메라 컴포넌트를 생성하여 이벤트 그래프로 드래그 드랍하여 변수로 불러온다.
(여기선 카메라 컴포넌트가 아닌 게임플레이 카메라 컴포넌트가 생성되었는데 카메라 컴포넌트를 우클릭해야 카메라 컴포넌트가 생성돼요 좌클릭하면 게임플레이 카메라 컴포넌트가 생성됩니다. 이유는 모르겠어요 ㅠㅠ)


이벤트 그래프에서 우클릭 후 카메라를 검색하면 카메라의 비율, 각도 등 여러 세부설정을 조정할 수 있다.

카메라 컴포넌트 빙의/활성화/비활성화

이 카메라를 플레이 화면으로 바꾸기 위해 부모 클래스를 폰(pawn)으로 바꾸어 빙의 기능을 활용해 보자.


우측 상단을 보면 부모 클래스가 액터인 것을 볼 수 있는데


좌측 상단에 파일을 눌러 블루프린트 부모 변경을 눌러보자.

그러면 블루프린트 부모로 변경하고자 하는 항목을 선택하는 창이 나오는데 여기서 폰(pawn)을 선택

그럼 우측 상단에 부모 클래스가 폰으로 바뀐다.


그 다음 이벤트 그래프에서 Get Player Controller를 생성한다.


Get Player Controller의 return value를 끌어와 possess를 검색하여 possess노드를 생성하는 것이 가능해지고 이 노드가 바로 빙의 기능을 담당한다.


in Pawn에서 끌어와 this 혹은 self를 검색하면 Get a reference to self라는게 드고 이는 자기 자신을 가져오겠다는 것을 의미한다.


노드들을 위의 사진과 같이 배치한 후 컴파일/저장한 후에 실행시켜 보면


카메라가 보는 풍경을 플레이 화면에 뿌리고 있다는 사실을 확인할 수 있다.


카메라 컴포넌트가 있는 블루프린트 클래스로 돌아가서 카메라를 y축 방향으로 90도 회전시켜 하늘을 바라보게 하자

실행을 시켜보면 하늘을 비추고 있는 모습이 보인다.

컴포넌트 창에서 카메라 컴포넌트를 하나 더 생성하고 새로운 카메라의 이름을 D라고 명명한 뒤에 카메라를 y축 방향으로 -90도 만큼 회전시킨다.


그 다음 Deactive 노드와 카메라 노드를 연결시키고 Active노드를 D카메라 노드와 연결시킨 뒤에 빙의 노드와 차례대로 연결시킨 뒤에 컴파일/저장을 하고 실행시켜보자


그러면 하늘을 비추던 카메라 컴포넌트가 비활성화되고 바닥을 보던 카메라가 활성화되어 플레이 화면이 바닥을 보고 있는 모습을 볼 수 있다.

액터의 회전/이동

선풍기 액터 만들기


먼저 액터를 블루프린트 클래스로 만들고 저장한다.


스태틱 메시 컴포넌트를 생성하고 이름을 Fan이라고 짓는다.


디테일 바의 스태틱 메시 항목에서 Fan을 선택한다.


마찬가지로 스태틱 메시 컴포넌트를 생성하고 이름을 Base로 짓는다.


디테일 바의 스태틱 메시 항목에서 Base를 선택한다.
이후 컴파일/ 저장을 한다.


컴파일/저장을 하면 디테일바의 스태틱 메시 항목 아래에 머티리얼 항목이 생긴다. 머티리얼에 원하는 머티리얼을 넣는다.


Fan에서도 반복한다.


그럼 뷰포트에서 내가 추가한 선풍기 컴포넌트들을 볼 수 있다.
머티리얼까지 깔끔하게 입혀져 있다.


선풍기 날개의 위치와 각도를 수정시켜주면


위와 같은 선풍기 모양이 완성된다.

선풍기 액터 회전


컴포넌트에서 Fan을 클릭 후 아래 내 블루프린트 창에서 이벤트 그래프를 눌러 이벤트 그래프 창을 연다.


선풍기 날개가 돌아가게 하기 위해선 매 화면마다 선풍기의 날개가 갱신되어야 하기 때문에 Event Tick노드를 활용해야 한다.
Delta Seconds는 이전 화면에서 지금 화면이 되기까지 걸린 시간이다.

속도 시간 = 거리 인 것처럼
회전 속도
시간 = 각도이다.
이를 이용해 선풍기 날개를 회전시켜주려고 한다.


컴포넌트 창에서 Fan을 드래그 드랍하여 변수화 시켜주고 여기서 Add Local Rotation노드를 생성한다.


이 노드는 현재 컴포넌트의 각도에 원하는 각도만큼 더해주는 기능을 한다.


이제 회전할 양을 정해주어야 하는데, 뷰포트를 보면 날개가 x축으로 회전해야 선풍기가 돌아가는 모양으로 만들 수 있기 때문에 x축을 기준으로 Delta Rotation을 수정해주어야 한다.


하지만 Delta Rotation은 Rotation이라는 자료형으로만 받을 수 있기 때문에 Event Tick노드의 Delta Rotation항목에서 끌어와 Make Rotator노드를 생성하여 Rotator라는 자료형으로 바꿔준다.


그리고 Delta Seconds를 바로 넣어주면 선풍기의 회전속도가 지나치게 느릴 수 있기 때문에 Delta Seconds에 360을 곱해준 다음에 Make Rotator의 x에 연결해서 선풍기 날개가 초당 360의 속도로 회전할 수 있게 한다.


위의 그림과 같이 노드들을 연결시켜주고 컴파일/저장을 하고난 뒤에 뷰포트에 방금 만든 선풍기 액터를 드래그 해주고 실행시켜주면

위와 같이 선풍기가 돌아간다.

액터의 이동

액터를 이동시키기 위해 방금 만들었던 선풍기 액터를 더블 클릭하여 들어간다.


다음으로 선풍기 자체를 좌우로 왕복이동 시키려고 한다.
이를 위해서 먼저 Original Location이라는 변수를 추가 시키고 변수 타입을 벡터로 설정한다.


기존의 위치는 Event BeginPlay노드에서 지정해주어야 한다. Original Location을 그래프로 드래그 드랍하여 set으로 설정한다.
액터의 원래 위치로 설정해주어야 하기 때문에 set 노드의 Original Location에서 끌어와 Get Actor Location노드를 생성하여 원래 위치를 가져올 수 있다.

그 다음 선풍기를 이동시켜주어야 하는데 Event Tick노드에 이어서 위치 변환까지 시켜주려고 하니 노드가 너무 복잡해질 수 있어서 이전에 배웠던 Sequence노드를 사용해준다.


위와 같이 Sequence노드를 연결시켜준다.



then1에는 선풍기의 좌우 왕복 운동을 작동시키는 노드들이 연결되어야 한다.
좌우 왕복운동을 위해서 sin그래프의 특성을 이용하려고 한다.

Get Time Seconds 노드를 생성한 다음 Return Value에서 끌어와 sin을 검색해 Sin(degrees)를 선택하여 노드를 선택한다.
이렇게 해주면 1에서부터 -1까지 왕복운동을 하게 된다.


그 다음 Original Location변수에서 get노드를 가져오고 Make Vector노드를 생성한다.
그 다음 1에서 -1은 너무 짧기 때문에 곱하기 노드를 가져와 100을 곱하여 100부터 -100까지 왕복운동을 하도록 하고 Make Vector의 y에 연결한 다음 Original Location의 값을 가져와 서로 더해준다.


그 다음 Set Actor Location노드를 생성하여 Sequence노드의 Then1에 연결해준다.

앞에서 말했듯 Set Actor Location 노드는 타겟으로 지정된 물체의 좌표를 입력된 좌표값으로 변경시키는 기능을 한다.


그 다음 New Location에 더한 값을 연결해준 다음에 컴파일/저장을 하고 실행 시켜 주면

위와 같이 선풍기가 좌우 왕복운동을 하는 것을 볼 수 있다.
하지만 속도가 너무 느리다.
느리게 움직이는 이유는 시간이 각도로 들어가게 되면 1초에 1도 돌아가는 것이기 때문인데 요컨대 SINd에 대입되는 x축의 값이 지나치게 작게 움직인다는 뜻이다.


그래서 Get Time Seconds의 Return Value에 곱하기 360을 추가 SINd에 연결하고 컴파일/저장 후에 실행시켜 보면

위와 같이 빠르게 좌우 왕복운동을 하는 걸 볼 수 있다.

액터 직접 움직이기

스켈레탈 에셋 : 이 3D 모델이 가지고 있는 뼈대의 구조를 나타내는 에셋
피직스 에셋 : 스켈레탈 메시의 충돌체들을 의미한다. 예를 들어 주먹, 팔, 몸통, 머리 등의 충돌 범위를 전부 지정해주는 에셋

캐릭터 액터 생성


먼저 캐릭터 액터를 생성한다.


생성한 캐릭터 액터를 블루프린트 클래스로 변환하고 이름을 BP_Character로 짓는다. 경로는 콘텐츠 폴더에 블루프린트 폴더에 저장한다.

캐릭터 액터 외형 설정


그 다음 BP_Character의 컴포넌트 창에서 스켈레탈 메시 컴포넌트를 클릭


디테일 바에서 스켈레탈 메시 에셋에서 사용할 에셋을 선택한다.


에셋을 추가하고 보니 크기가 너무 작다.


디테일바의 트랜스폼에서 스케일 항목을 조절해 크기를 조절한다.


그 다음 사용할 머티리얼을 적용하여 캐릭터 외형을 완성시킨다.

캐릭터 점프시키기


캐릭터가 움직이게 하기 위해 컨트롤러가 필요하므로 이벤트 그래프에서 우클릭 후 Get Player Controller노드를 생성 Player Index가 0인 경우 직접 조작하는 내 자신을 뜻 함


이 노드의 Return Value를 끌어와 Possess 노드를 생성하고 In Pawn을 끌어와 self노드를 생성한다.


어떤 입력을 받는 지 정할 에셋 2가지가 필요한데 인풋 액션 에셋과 인풋 매핑 컨텍스트 에셋이다.


컨텐츠 브라우저에서 우클릭 -> 입력에서 인풋 액션 에셋과 인풋 매핑 컨텍스트 에셋을 생성하고 저장한다.


생성한 IMC_MAIN을 클릭하여 매핑을 추가하고 IA_Jump를 추가하고 저장해준다.


IA_Jump를 클릭하여 값 타입을 bool로 설정해준다.

bool : 키가 눌렸는지 안 눌렸는지 true/false
Axis1D : 가속 후진으로 나뉘었을 때 가속은 1 후진 -1로 처리
Axis2D : 2가지 축이 사용될 때 예를 들어 wasd, a는 (-1,0) d는 (1,0), w는 (1,0), s는 (-1,0)
Axis3D : 3가지 축이 사용될 때 필요함

트리거에서 +를 눌러서 어떤 상황에서 값을 true로 할지 결정한다. 점프키를 한 번 발동하기 때문에 "눌림"옵션 선택


이벤트 그래프에서 우클릭 하여 IA_Jump 노드를 생성한다. 트리거가 발생하면 이벤트를 실행시키는 기능을 하는 노드다.


캐릭터 액터에 기본적으로 점프를 하는 기능을 하는 노드인 jump노드가 이미 있기 때문에 IA_Jump노드와 연결해준다.


그런데 아직 어떤 컨트롤러에서 어떤 입력을 받아와야 하는지 정해두지 않았으므로 다시 Get Player Controller에서 끌어와서 Get EnhancedInputLocalPlayerSubsystem 노드를 선택하여 생성 -> 입력한 걸 처리하는 처리기

이 노드의 우변에서 끌어와 Add Mapping Context를 검색하여 생성하고 Mapping Context에서 방금 만든 매핑 컨텍스트 에셋을 선택


그 다음 possess노드의 우변을 Add Mapping Context노드에 연결하고 나면 빙의하고 점프하는 매핑컨텍스트에 연결이 됐고, 점프를 하면 캐릭터가 그에 맞게 움직이는 기능까지 구현됨

하지만 실행하기엔 아직 카메라를 추가하지 않았기 때문에 카메라를 추가해줘야 한다.


카메라를 추가 하기 전에 캐릭터 액터의 기본 화살표와 캐릭터의 에셋이 보는 방향이 일치하지 않아서 회전 항목의 z축을 회전시켜 에셋이 바라보는 방향과 캐릭터 액터의 화살표 컴포넌트의 방향을 일치시킨다.


그 다음 스프링암 컴포넌트를 추가 시키고 타깃 암 길이를 원하는 길이로 조정해준다.


스프링암에 카메라 컴포넌트를 추가 시킨다. 스프링암 끄트머리에 카메라가 추가된다.


이제 카메라를 활성화시켜서 실행시켰을 때 카메라의 시선으로 게임을 볼 수 있게 해주어야 한다.
이벤트 그래프로 다시 이동하여 아래 변수 항목에서 camera를 선택해 드래그 드랍하고 get을 선택한다.
여기서 Set Active를 선택
Set Active는 현재 이 카메라를 활성화 하는 기능을 한다. 이 노드에 New Active항목을 체크해주고 Add Mapping Context의 우변에 연결해준다.

노드들을 위와 같이 배치해주고 컴파일/저장한뒤에 실행시켜보자.

캐릭터 움직이기(앞뒤좌우)


먼저 IA_Move를 인풋 액션 에셋을 생성한다.


값 타입을 Axis2D로 설정하고 트리거를 다운으로 설정한다. 누르고 있을 때 값이 true가 된다.


그리고 다시 아까 만든 매핑 컨텍스트를 클릭하여 wasd를 추가하고 모디파이어를 수정해주어야 한다.

스위즐 입력 측 값 : x축 값을 y축 값을 바꾼다.
부정 : 입력 값을 +에서 -로 바꾼다.

w키를 누르면 x축 값을 증가시킨다.
s키를 누르면 x축 값을 감소시킨다.
a키를 누르면 y축 값을 감소시킨다.
d키를 누르면 y축 값을 증가시킨다.
IA_Move를 저장해준다.


이벤트 그래프로 돌아와서 IA_Move 노드를 생성한다.


왼쪽 컴포넌트 창에서 캐릭터 무브먼트를 드래그 드랍한 다음에 끌어와서 Add Input Vector를 검색하여 생성한다.


이제 IA_Move를 설정해주어야 한다. Action Value에서 끌어와서 Break Value 2D를 검색하여 생성한다. 이 노드는 벡터를 x와 y로 나눠주는 기능을 한다.


그 다음 Make Vector노드를 검색하여 생성하고 Break Vector 2D와 연결시켜주고 Return Value를 Add Input Vector의 World Vector에 연결시켜준다.
그 다음 IA_Move를 Add Input Vector와 연결시킨다.

컴파일/저장 후 실행시켜보자

마우스를 움직여서 시점 바꾸기


IA_Look 인풋 액션 에셋을 생성한다.


트리거를 Axis2D를 선택한다. (마우스로 인한 시점 이동이 2D좌표를 통해 이동하기 때문에)


그 다음 IMC_MAIN 매핑을 추가하고 IA_Look를 선택한 다음 키 할당에서 마우스 XY 2D축을 선택한다.
IA_Look와 IMC_MAIN을 저장한 다음 이벤트 그래프로 돌아간다.


IA_Look노드를 생성한다.


IA_Look노드의 Triggered에서 끌어와 Add Controller Yaw Input를 검색하여 생성한다.
Action Value에서 끌어와 Break Vector 2D를 검색하여 생성한다.

Yaw : z축을 의미


그 다음 Break Vector 2D에서 x값을 Add Controller Yaw Input의 val에 연결해주고 y값은 Add Controller Pitch Input의 val에 연결시켜줘야 하는데 이대로 연결하면 마우스를 위로 드래그할 때 시점이 아래로 내려가기 때문에 먼저 -1을 곱해주고 나서 연결시켜줘야 한다.


컴파일/저장 전에 스프링암 컴포넌트 디테일 바에서 폰 제어 회전 사용을 활성화 시켜주어야 하는데 이 항목이 비활성화되면 입력을 받은 수치를 전달해줘도 그것에 따라가지 않고 캡슐 컴포넌트 즉, 부모의 각도를 따라가게 된다. 이렇게 되면 우리가 조종을 하더라도 우리가 조종한대로 따라가지 않기 때문에 꼭 활성화 시켜야 한다.


위의 사진처럼 노드들을 배치한 후에 컴파일/저장하고 실행시켜 보자.

업로드중..

위 영상엔 하나의 문제점이 있는데, 캐릭터가 뒤를 돌고 w키를 누르면 뒤로 가는 현상이 발생한다. 이는 캐릭터가 월드 방향을 기준으로 움직이기 때문이다.


이벤트 그래프로 돌아와 Get Actor Forward Vector와 Get Actor Right Vector를 검색하여 생성한다.

이 때 IA_Move에서 앞과 뒤를 조종하는 키인 w s는 x값을 기준으로 움직이기 때문에
get actor forward vector노드와 IA_Move와 연결된 break vector 2D의 x값을 연결해주어서 add input vector에 연결해주어야 앞방향을 볼 때 앞으로 갈 수 있다.

break vector 2D의 x방향과 get actor forward vector의 값을 서로 곱해준 뒤에
좌우 방향을 정확하게 하기 위해선 get actor right vector노드를 생성하여 y값과 곱해준다.
그리고 서로의 값을 더한 뒤에 add input vector의 world vector에 연결해준다.
컴파일/ 저장 후에 실행시켜보면 의도한대로 움직이고 있는 것을 확인할 수 있다.

업로드중..

profile
게임 프로그래머 공부

0개의 댓글