상세 컨텐츠

본문 제목

Pond 프로젝트 03

Unreal Engine 4/Project

by hwano 2015. 3. 23. 15:31

본문

 

게임모드와 pawn을 다시 설정해보자

 

 

이전에 진행할때 도큐를 따라하면서 Shape_NarrowCapsule에서 우클릭

create blueprint using this... 를 이용하여 캡슐로 블루프린트를 만들고 그걸

reparent해서 부모 클래스를 캐릭터로 바꾸었다.

 

하지만 내 경우엔 카메라를 제어하려는게 가장 큰 목적이므로 그냥

컨텐츠 브라우져에서 우클릭/블루프린트에서 pawn을 선택하여 새로 만들었다.

 

이름은 cameraPawn으로 하였다.   컨텐츠브라우저에서 씬으로 드래그로

가져왔다. static mesh를 가지지 않은 pawn이기 때문에 오브젝트 없이

카메라만 보인다.

 

pond_gamemode에서 default pawn class를 cameraPawn을 설정한다음 컴파일 해보자.

실행을 해보면 카메라뷰로 보이는게 아니고 그냥 뷰포트의 뷰 그대로 실행이 된다.

어찌해야 될까. 여기서 player start 액터를 만들지 말고

 

cameraPawn으로 가서 pawn탭에 보면 auto possess player가 있다. player0으로 설정하면

실행시 cameraPawn의 카메라뷰로 실행된다. Flying 예제의 방식을 가져온건데

possess는 도큐에서 '빙의'로 번역이 되어있다. cameraPawn을 player0으로 설정한다는 거 같다.

 

 

 

 

cameraPawn의 회전 구성

 

 

다시 블루프린트로 회전설정을 해보자.

 

이런식으로 간단하게 구성을 해보면 print string은 마우스값이 문제 없이 출력이 된다.

하지만 add actor local rotation은 작동하지 않는다. 뭔가 add actor local rotation노드가 내가

생각한 그런 용도가 아닌가보다. 왜 작동하지 않을까.

 

 

중간에 add actor local offset을 한번 넣어봤다. 이건 적상적으로 작동을 한다..  아무래도

add actor local rotation노드가 아닌 다른 노드를 써야하는거 같다. 아님 add actor local rotation로

들어가는 delta rotation의 값이 잘못설정되었다던가..

 

 

다시 Flying 예제를 열어서 키보드 입력값이 변수를 거쳐 복잡하게 add actor local rotation로 들어가는걸

내 pond 연결처럼 간단하게 바꾸어보았다. 읭/\?   그러니 제대로 작동한다...    아놔 ㅁㄴ;ㅣ아럼ㄴ;ㅁ

어디 설정이 잘못된거냐 ㅜㅜ  아 짜쯩나 이따위껄로 벌써 며칠째야.

 

아이 씨부랄 버그인지 뭔지 알수가 없다. 그냥 전체 프로젝트를 삭제하고

깔끔하게 다시 만들기로 했다....

 

 

 

 

 

씬을 다시 만들고 cameraPawn의 회전을 구성

 

 

다시 처음부터 만들었더니 우선 작동은 잘 된다. 근데 또 어딘가 이상한건지 다운이 많이 잦다..

뭔가 불길하다..   얼마쓰지도 않았는데 벌써부터 이러면 만지기 싫어지는데..

 

암튼. 

 

우선 테스트 용으로 간단하게 다시 연결해 봤다.

블루프린트내에 카메라를 두개 만들어 계층 구조를 만들었다. 짐벌락 현상( 이것도 짐벌락인가? )

때문에 각각의 축을 달리 적용하기 위해 카메라를 두개 만들어

각각 1개의 축만 움직이도록 했다. ( 카메라를 두개를 넣어서 에러가 나는건지도 모르겠다 )

 

 

뷰포트에서 cameraPawn을 선택하면 오른쪽 아래에 작게 카메라뷰가 뜨는데

pawn안에 카메라가 두개있으니 좀 꼬이는거 같아. 그냥 rotCam은 springArm으로 교체했다.

 

이 프로젝트의 원래 의도는 거기까지 갈지 안갈지는 모르지만 어쨌든 leapMotion으로

제어하는데 있다. 현재 leapMotion과의 연결은 좀 나중으로 미룬다.

leapMotion으로 제어한다고 가정했을때 주위를 둘러보는것은 주먹을 쥐면 주먹을 인식하여

둘러보기 모드가 실행되어 손의 움직임에 따라 주위를 둘러보도록 할 계획이다.

 

현재 마우스를 움직이는데로 카메라가 움직이는데 주먹대신 ctrl키를 누르면 주먹으로 인식하도록 해보자.

즉 ctrl키를 누르고 마우스를 움직여야만 주위를 둘러보도록 수정해보자.

 

 

 

CTRL키 설정

 

 

어찌어찌 해보다보니 작동이 되긴하는데 이 방식이 맞는지는 모르겠다.

ctrl + 특정키 같은 다중 키입력을 지원하는 방식이 기본적으로 있을거 같은데 찾아봐도 잘 모르겠음.

 

그래서 그냥 bool 변수를 하나 만들어서 진행했다. 작동은 되니 우선 이대로 넘어간다.

 

먼저 블루프린트 노드들 중 key event에 보면 각자의 키보드키에 대한 노드들이 있다.

우클릭에서 ctrl을 치면 left ctrl 노드가 나온다.

 

그 다음 bool변수를 하나 만든다. 용도는 컨트롤 키가 눌러져 있는 상황인지를

확인해줄 용도.

 

변수를 드래그로 가져와 set을 두개를 만들고 left ctrl에서 아래와 같이 연결한다.

presse되는 순간에 참이 되고 release되는 순간에 거짓이 된다.

 

이 bool 변수를 input들과 branch로 연결하여 2개가 참일 경우에만 add local rotation이 작동하도록

하였다. 음..  그냥 해본건데 다행히 작동이 잘 된다. 

 

 

 

 

CTRL키를 놓으면 제자리로 다시 돌아오도록 하자

 

이제 설정해줘야 할게 두가지이다.

 

첫번째,

ctrl키를 누르고 마우스로 주위를 둘러보다가 ctrl키를 누르면 다시 시점이

정중앙으로 돌아오게끔 만든다.

 

두번째,

마우스로 주위를 둘러볼때 시야가 너무 바깥까지는 벗어나지 않도록 제약을 건다.

cameraPawn의 회전속도도 최대시야에 가까워지면 점차 느려지도록 만든다.

 

먼저 첫번째부터 구현해보자.

가장 쉽게 떠오르는 방법이 카메라가 다시 원점으로 돌아오는 변수를 하나 설정한다.

toOriginSpeed.  이 변수와 카메라의 local 회전 각의 절대값을 곱한다.

많이 카메라가 벌어져 있을수록 절대값이 클것이니 toOriginSpeed값을 1 이하로 설정하면

점차 스피드가 죽으며 원점으로 돌아오게 된다.

쓸데없는 계산을 하지 않도록 0값일때 계산을 멈추는 것도 넣어주어야 한다.

 

---------------------------------------------------------------------------------------

 

component들인 springArm으로 만든 transform과 camera의 rotation값을 가져와야 되는데

어찌 가져와야 하나??

-> get Relative Transfom(컴포넌트 이름)과 break Transfom을 이용하여 가져올수있다.

 

 

 

 

 

 

 

SpringArm의 쓰임새

 

여기서 잠깐.  원래 docu를 따라서 만들다보니 springArm이 쓰임새도 정확히 모르는데

들어가 있다. 정확한 쓰임새를 찾아보고 필요없으면 지워버리자.

찾아보니 springArm은 tps게임을 만들때 카메라가 캐릭터와 일정거리 떨어져 있게 되는데

벽쪽으로 캐릭터가 접근하면(카메라가 벽과 collision되면) 카메라가 캐릭터 쪽으로 더

이동하도록 해준다.

 

(이블위딘이 이 설정이 엉망이어서 아주 개같았지...)

나는 이 기능이 필요 없으니 루트의 springArm은 삭제해 버리자.

 

//

삭제했더니 문제가 생긴다..  component들은 최상위 루트컴포넌트가 되면

트랜스폼중에 location(position)과 rotation이 사라진다. 아마 actor의 트랜스폼을

바로 다이렉트로 받기 때문일 것이다.

마야로 생각해보면 액터의 트랜스폼이 트랜스폼노드이고 component들은 쉐이프

노드들인것이니 location과 rotation이 없는것인듯..  그런데 그렇게 따지면

size는 왜 있어?    몰라 암튼 그래서 그냥 springArm은 그대로 두기로 했다.

 

 

//

또 하나 문제가 있다. cameraPawn액터를 씬의 적당한곳에 위치시켰다.

rotation값은 xyz가 0 , -60, 90이 되었다. 그런다음 액터의 블루프린트 안으로 들어와

최상위 루트에 있는 springArm의 rotation값을 print string해보자.

pitch,yaw,roll 순서로 -60, 90, 0이 출력되어 나온다. 

 

문제는 소수점 뒷자리들이 저런식으로 조금씩 오차가 생긴다. 왜 그럴까.

이게 쌓이고 쌓이면 나중에는 큰오차가 된텐데 이유가 뭔지. 카메라를 마우스로 움직여 보며

mainCam의 rotation값을 출력해봐도 저런식의 오차가 생긴다.

 

메인 캠은 마우스X 변이값에따라 yaw만 움직이도록 설정해 놓았기 때문에

(다른것은 아래와 같이 0으로 고정해 놓았다) 저 오차값이 왜 나오는지를 모르겠다.

 

 

하나 생각해볼수있는건 최상위 actor값부터 조금씩 어긋나있기 때문에 하위 component들에도

영향을 미치지 않나 싶어 actor의 트랜스폼 값부터 정확하게 고정시켜보자.

(구조상 상위 객체가 움직인다 하여 하위 local의 값이 변할리는 만무하지만 한번 해보자..)

아래와 같은 방법으로 actor의 위치를 수치상으로 다시 한번 입력 시켰다.

하지만 그래도 프린트 해보면 최상위 컴포넌트인 springArm은 조금 삐뚤어져 있다. 왜일까.....

 

 

 

 

 

카메라 중앙으로 되돌아가게 하기

 

위의 오차는 이것저것 찾아봐도 정확한 이유를 모르겠다. 우선 그냥 진행하지 별 수 없잖아.

위에서 썼던 데로 toOriginSpeed변수를 하나 만들었고 디폴트값은 0.5로 설정하였다.

if문은 branch와 >=노드 등을 이용해서 구현할 수 있다.

 

//

구성해보니 잘 작동한다. toOriginSpeed는 0.2정도로 수정하였다.

 

 

 

 

 

exe실행 파일로 만들어보자

 

중간중간 만들어 진거를 webgl로 만들어서 올리면 좋겠지만 webgl을 언리얼에서 다룰려면

webgl관련 api를 깔고 또 언리얼이 업데이트 될때마다 다시 리빌드하고 뭐하고 너무

머리가 아프다.  그래서 그냥 exe파일로라도 올렸으면 좋겠다. exe로 간단하게 빌드 될까?

해보자.

 

file / package project / window 에서 64비트 32비트로 바로 패키징 시킬수 있다.

눌러봤는데 이 졸라 간단한 프로젝트가 시간이 엄청걸린다..;

 

...  아이 뭐야 왜케 오래걸려.

 

패키지가 끝나서 실행해봤더니 starterContent에 있는 엄한 level이 열린다.

설정을 다시하자. project setting에서 gamedefault map을 내가 작업하던걸로 설정해주자.

그리고 starterContent의 내용까지 모두 package가 되어서 시간도 오래걸리고 용량도

늘어날텐데 원하는 프로젝트만 packaging하려면 어떻게 해야하지??

 

근데 실행파일로 만드는 행위의 명칭이 package인지 build인지 compile인지 모르겠다.

( 용어들이 혼재되어 있다.. )

 

--------------------------------

project settings에 보면 packaging 탭이 있다.

build configuration이 있는데  development는 release에 해당하는 거고

shipping이 최상의 퍼포먼스를 내는 게임 출하용 환경설정이라고 한다.

build 환경설정은 visual studio 툴바를 통해 설정할 수 있다. 이부분은 전문 프로그래머 영역이라

잘 모르겠다.

 

--------------------------------

 

아까 development 설정으로 했을때는 잘 됐었는데 shipping 모드로 해보니 중간에 에러가 난다.

Missing UE4Game binary.
You may have to build the UE4 project with your IDE. Alternatively, build using UnrealBuildTool with the commandline:
UE4Game <Platform> <Configuration>

 

shipping으로 뽑아보고 싶은데 모르겠다.  우선 넘어가자.

 

 

 

 

시야각에 제한을 걸어보자.

 

중앙으로 돌아 올때와 비슷하다. 시야각의 절대값이 어느 값 이상 커지면

반비례 그래프로 점차 cameraTurnSpeed가 줄어들도록 하면 된다.

정확하게 설정한 지점에서 딱 멈추도록 range mapper값은 노드들이 있을거 같은데

아직 모르니까 그냥 합시다.

 

아니다. 생각해보니까 시야가 어느정도 벗어나야지만 속도가 줄어드는게 아니고

중앙에서 멀어지는 순간부터 속도가 줄도록 하는게 맞겠다.

 

 

 

 

collapse의 종류

 

blueprint로 노드들을 작성을 하다보니 노드들이 한도끝도 없이 길어진다.

좀 더 공부한 후에 중간중간 노드들을 c++ 코드로 대체할 수 있는 부분은 대체하는

방식을 써야겠지만 지금은 방법을 모르니 collapse 기능을 좀더 유용하게 사용해보자.

 

노드들을 여러개 잡고 우클릭 해보면 collapse 기능이 뜨는데 nodes, function, macro 세가지가 있다.

 

nodes

nodes는 단지 비쥬얼적으로만 접는 기능이다. nodes로 하나의 노드로 만든다음에

input, output도 지정할 수 있다.

 

function

함수로 접으면 장점이 다른 블루프린트에서 불러올수 있다. 예를 들면 다른 블루프린트에 가서

우클릭 call function 부분에 앞서 만들었던 함수 이름이 뜨는것을 볼 수 있다.

c++함수이기 때문에 protected public등 다양한 요소들이 있지만 자세한건 다음에..

 

macro

nodes랑 다른점이 뭐냐?...  읽어봐도 당췌 다른점을 알수가 없다..

대충 눈치까기에 nodes는 재활용이 안되는거고 macro는 재활용이 되는거 같다.

컨트롤 c, v로 붙여넣어보면 nodes는 별개의 nodes그룹으로 복사된다. 즉 내부의

연결을 바꾸면 하나만 적용된다.

하지만 macro는 함수처럼 하나의 객체가 되므로 모두 instance된다.

...는거 같엉.

 

//나중에 추가

macro는 c++ 에서 #define해서 만들었던 전처리기와 비슷하다.

UE4에서는 함수와 매크로가 가장 다른점은 함수로 만들면 실행이 만들어지지만

매크로로 만들면 실행인풋이 따로 없다. 꼭 execute를 연결할 필요가 없을때

간단하게 매크로로 만들면 좋다.

( 예를 들어 moveSpeed를 변수가 있다. 여기에 delta time값을 항상 곱해주고 100배쯤 다시

곱해줘야 한다. delta time값이 매우작으므로 적당한 속력을 얻기 위해서는

moveSpeed를 10000단위로 엄청 큰수를 써야하니까..  암튼 이러 여러가지 속도 변수에

항상 곱해줘야 하는 애들을 함수로 만들면 한상 실행 노드를 연결해 줘야하니 피곤해진다.

그럴때 매크로로 만들면 편해진다 )

위에서 deltaTime 매크로가 그런역할이다.

 

 

 

 

 

 

시야각에 제한 진행

 

다시 알고리즘을 생각해보자. 단순히 카메라 각이 멀어짐을 x

카메라의 움직임속도를 y라고 해버리면 안된다.

시야외각으로 마우스를 옮겼다가 중앙으로 드래그로 돌아오려고 하면

돌아올때도 엄청 느리게 돌아오게 되니까.

따라서 중앙에서 멀어지는 방향쪽으로 움직일때만 저 그래프대로의

수치변환이 일어나도록 해야한다.

 

그러면 x가 0일때 y가 원래 속도이게 하면될텐데 y가 원래 속도가 되려면

x에 기본적으로 1을 더해줘야 한다. 그래야 x가 0일때 y가

원래 속도를 유지하게되겠지용

 

시야각 제어가 완료되었다.

조금만 코드가 길어져도 오히려 실제 코딩보다 알아보기도 어렵고 관리하기도 어렵다.

코딩도 어찌보면 if, while, loop 등으로 계층구조로 이루어지는데

비주얼 스크립트도 무턱대고 저런 선 연결이 아닌 계층을 바탕으로한 구조를 구현해줬으면 좋겠다.

 

물론 그런식으로 정리하라고 collapse기능들을 제공하긴 하지만 정리하는데 영 불편하고 정신없다.

outliner같은 딱딱딱 열고 닫아 한번에 정리하기 쉬운 방식의 비주얼 스크립트 구조는 없을까.

 

 

 

 

FPS 출력

 

여기까지만 진행했는데 (물론 그럴리 없겠지만) 벌써 느려진 느낌이 든다.. 비주얼 스크립트 방식은

보고만 있어도 뭔가 느린거 같엉.

그래서 fps를 화면에 출력 해보려고 한다.

https://answers.unrealengine.com/questions/16654/how-to-show-fps-ingame.html

이 문서를 참고 하였다.

해보니 45프레임 정도로 고정된다.

 

 

음..   할때마다 다르네. cameraSpawn의 블루프린트 창을 열어놓고 있으면 20대까지 떨어지기도 하고

그런다. 뷰포트에 따라 달라지니 필요없는거 다 끄고 테스트 해봐야 하는거 같다.

 

 

 

 

관련글 더보기