
사격 아키텍처총을 만들었으니 이제 총을 직접 사용하는 방법을 알아야 한다.일단은 마우스 버튼을 누르거나 트리거링을 하면 로그 메시지가 출력되도록 해보자 이를 위해서 우선 Gun 클래스에서 트리거 함수를 작성한다.트리거 함수에는 로그 메시지를 작성하는 내용을 넣어준다. 해당 함수는 인게임에서 마우스 좌클릭을 하면 동작해야 할 것이다.이를 위해 마우스 좌클릭에 대한 액션 매핑을 작성할 필요가 있다.또한 이에 대한 함수도 작성해야 할 것 이다. 우선 함수의 경우 캐릭터 클래스에 이미 Gun에 대한 포인터가 있으므로 해당 값을 통해 PullTriger 함수를 호출해준다. 이제 프로젝트 세팅으로 돌아가서 액션 매핑을 할당해주자. 이후 바인딩 작업도 예전과 같이 해주자. 이제 컴파일을 하고 플레이를 하면서 좌클릭을..
문제링크 : https://www.acmicpc.net/problem/2659 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int a, b, c, d;bool visited[9999];int func(int a, int b, int c, int d) //제일 작은 시계수 구하기{ int num1 = a*1000 + b*100 + c*10 + d; int num2 = b*1000 + c*100 + d*10 + a; int num3 = c*1000 + d*100 + a*10 + b; int num4 = d*1000 + a*100 + b*10 + c; return m..

소켓을 통해 메시에 부착하기만든 총을 부착하기 위해서는 기존에 있던 총을 제거하거나 안보이도록 감추는 작업을 해주어야 한다.우선 총이 스켈레톤 메시의 어느 부분에 해당하는지 체크해보자. 이제 해당 메시를 C++ 에서 잡아주는 작업을 해보자.GetMesh() 함수를 통해 해당 메시를 얻는 것이 가능하다. 이후 얻은 메시를 감춰주어야 하는데, 이는 HideBoneByName 함수로 가능하다.해당 함수는 감출 대상의 이름과, EphysBodyOp 이라는 변수를 받는다.PBO_None을 작성함으로서 디폴트값 표시가 가능하다. 기존 weapon_r의 위치를 사용하기 위해 해당 위치에 소켓을 생성해주자.해당 소켓은 끼워 넣을 수 있는 지점을 나타내게 된다. 이제 해당 메시를 생성한 소켓 위치에 붙여주는 작업을 해야..

런타임에 액터 스포닝하기(spawning)저번에 만든 총을 이제 캐릭터에 연동할 차례이다.이를 위해 우선 런타임 동안에 소총을 스포닝하는 방법을 알아보자. 액터 스폰에 대해서는 UWorld에 속한 SpawnActor 함수를 통해 스폰하게 된다.총은 게임이 시작되자마자 캐릭터가 가지고 있어야 하므로 BeginPlay에서 해당 함수를 작성하게 된다.해당 함수는 템플릿 함수이므로 우리가 사용할 총의 타입인 AGun을 넣어준다.다음으로 인수를 받는데, 인수는 클래스로 받는 것이 가능하다. (UClass 타입) 기본적으로 우리는 C++에서 스폰 작업을 하지만, 여기서 해당 Gun의 블루프린트 하위를 스폰하게 된다.이를 위해 블루프린트에 후킹할 방법을 알아야한다.C++에서 직접 후킹하는 것은 어려우므로 다른 방법을..

건(Gun) 액터해당 게임은 총을 사용한 슈터 게임이다.따라서 캐릭터는 총을 가지게 되므로 이번 강의에서는 총 액터를 생성해주는 작업을 해본다. 기존 캐릭터를 보면 총이 이미 존재하지만, 기본적으로 슈터 장르의 게임에서는 여러 총을 사용하기 위해 총이 교체 가능해야 한다.따라서 따로 총 액터를 생성하고, 이를 캐릭터의 하위로 할당하여 사용하게 된다.먼저 총을 생성하는데 총은 캐릭터나 폰의 기능이 필요없으므로 단순 Actor 클래스로 생성하게 된다. 그리고 해당 클래스에 대한 블루프린트도 미리 만들어두자. 다음으로 해당 총의 루트가 될 SceneComponent와 이에 어태치하여 사용할 Mesh를 선언해주자.이때 Mesh는 총이 어떤 이유에서인지 스켈레톤 메시로 작성되어있기 때문에 스켈레톤 메시로 선언해주..
문제링크 : https://www.acmicpc.net/problem/11536 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;string s;vectorv;vectorv1;vectorv2;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> s; v.push_back(s); v1.push_back(s); v2.push_back(s); } sort(v1.begin(), v1.end()); //오름차순 sort(v2.beg..

애니메이션 속도 계산하기현재 애니메이션의 속도와 캐릭터의 속도가 같지 않아서 마치 발이 미끄러지는 듯한 현상이 관측되는 것을 볼 수 있다.이를 개선하기 위하여 애니메이션의 속도를 계산해보자.이를 위해 우선 앞으로 달리는 애니메이션 모습을 체크해보자. 우리가 앞으로 달리는 애니메이션에서 체크해야할 것은 발의 움직임이다.발이 지면에 붙은 순간의 시간과 발이 지면에서 떨어진 순간의 시간을 이용하여 해당 움직임의 속도를 구할 수 있다.아래 표시한 마커의 소수점이 해당 시간을 나타낸다. (0.26) 그리고 추가로 속도를 구하기 위해 해당 발 움직임의 위치가 필요하다.우측 상단을 보면 Location을 확인할 수 있는데 로컬 좌표계로 보면 위치가 그대로인 상태에서 회전만 하는 것이기에 위치의 움직임을 구하는 것이 ..

벡터의 역방향 트랜스폼이번엔 애니메이션의 회전을 적용시킬 차례이다.이를 위해서 트랜스폼에 대한 이해도를 높힐 필요가 있다. 먼저 월드 좌표계와 로컬 좌표계가 존재하며, 월드 좌표계는 베이스가 월드의 중앙이고 로컬은 해당 액터가 중심이 된다.따라서 위치는 상대적이게 되며 월드 좌표계를 기준으로 두면 월드의 중심에서 액터가 움직인 것이고, 로컬 좌표계를 기준으로 두면 액터가 중심으로 월드의 베이스 위치가 달라지게 되는 것이다.이러한 것이 글로벌 공간과 로컬 공간 간의 트랜스폼이 된다. 우리가 필요로 하는 것은 현재 플레이어의 각도이므로 로컬 좌표계의 각도가 필요한 것이다.이는 기존의 Get Velocity 함수를 통해 얻은 속도를 이용하여 방향을 얻는 것이 가능하다.해당 속도를 통해 어떤 방향으로 가는지, ..

애니메이션을 게임플레이에 연결하기이제 블렌드 스페이스를 이용하여 만든 애니메이션을 직접 연결해볼 차례이다.이를 위해 애니메이션 블루프린트의 AnimGraph 화면으로 돌아가보자.기존의 내용은 쓸모가 없으니 전부 지우고, Asset Brower에서 블렌드 스페이스를 통해 만든 애니메이션인 BS_Locomotion을 가져올 수 있다. 이제 각도와 스피드에 대한 변수가 필요하다 이를 각각 생성하여 할당해주고, 출력 값도 연결해주자. 캐릭터의 각도와 스피드를 얻어야 하는데, 이는 해당 애니메이션 블루프린트의 Event Graph에서 가능하다.기본으로 있는 Try Get Pawn Owner 함수를 통해 캐릭터를 얻을 수 있고, Event Blueprint Update Animation 함수를 통해 Tick 함수와..
문제링크 : https://www.acmicpc.net/problem/14729 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;vectorv;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> n; v.push_back(n); } sort(v.begin(), v.end()); cout 언뜻보면 간단한 정렬문제이지만, 출력 형식을 고려해야하는 문제이다.입력받는 수가 소수점 단위이므로 double 형으로 입력을 받도록 하였다. 이후 출력하기에 앞..

2D 블렌드 스페이스저번 강의에서 Blend 함수를 통해 애니메이션을 블렌딩 해줬지만, 블렌드 스페이스라는 더 좋은 방법이 존재한다.우선 이를 생성해보자. 블렌드 스페이스를 생성할 때도 기본이 될 스켈레톤 메시를 선택해주어야한다. 생성하고 나면 다음과 같은 화면이 존재하며, 뷰포트 바로 아래 공간이 우리가 작업할 공간이다. 우선 해당 공간에 상하좌우 이동을 할당해보자.할당할 애니메이션은 우측 하단의 에셋 브라우저에서 가져오면 된다.할당한 후에는 컨트롤을 누르면 아래와 같이 초록색 X 표가 보이는데, 이를 통해 해당 X가 위치한 곳의 애니메이션이 재생된다.그리고 블렌드 스페이스 내에 좌측 상단 3가지 중 가운데 표시를 누르면 할당한 내용의 이름을 볼 수 있다. 현재 블렌드 스페이스 좌측과 하단에 None으..

애니메이션 블루프린트의 기초저번에 잠깐 다뤘던 애니메이션에 대해서 이번엔 애니메이션 블루프린트를 통해 다뤄보자.이를 위해 우선 애니메이션 블루프린트를 생성해주자.생성시에 우리가 사용할 스켈레톤 메시를 선택해주어야 한다. 그러면 이제 다음과 같은 화면을 볼 수 있다.좌측에는 미리보기와 함수 및 변수 작성 칸이, 중앙에는 이벤트 그래프 칸이, 우측에는 디테일 패널 및 프리뷰 에디터와 에셋 브라우저가 존재한다. 기본적으로 에셋 브라우저에서 원하는 애니메이션을 골라서 Output Pose에 넣고 컴파일을 해주면 해당 애니메이션이 출력된다. 우리는 중앙에서 Animgraph를 통해 여러 변수들을 사용하여 애니메이션들을 블렌딩하게 된다.블렌딩하기 위해 사용하는 함수는 Blend 함수이다.해당 함수는 이유는 모르겠으..

충돌 메시 편집캐릭터 스포닝 포인트의 바로 오른쪽 통로로 가보면 화면이 이상해지는 부분이 존재한다.이는 콜리전에 문제가 있는 것으로 화면을 플레이어 콜리전으로 바꾸면 해당 콜리전을 볼 수 있다. 위 사진의 튀어나온 콜리전을 선택하여 해당 콜리전의 스태틱 메시를 확인해보자. 해당 스태틱 메시에서 단순 콜리전을 선택하여 설정된 콜리전 세팅을 살펴보면 다음과 같이 콜리전에 대한 에셋팩 오류를 볼 수 있다. 이를 고치기 위해서는 모든 콜리전을 삭제하고 다시 할당해주는 방법도 있지만, 간단하게 튀어나온 콜리전만 선택하여 삭제해주면 다른 부분에는 영향없이 깔끔하게 문제있는 부분만 삭제가 가능하다. 이제 다시 원래 화면의 플레이어 콜리전을 살펴보면 전과 같이 이상하게 튀어나온 콜리전이 없는 것을 볼 수 있다.
문제링크 : https://www.acmicpc.net/problem/5648#include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;string s;vectorv;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; while(N--) { cin >> s; reverse(s.begin(), s.end()); v.push_back(stol(s)); //뒤집은 값 저장 } sort(v.begin(), v.end()); //뒤집은 값 정렬 for(int i=..

스켈레탈 애니메이션의 기초현재 캐릭터가 움직일 때 현재 고정된 상태 모양 그대로 움직이기 때문에 매우 부자연스럽다.이를 해결하기 위해 애니메이션을 설정하게 되며, 이번 강의에서는 이 애니메이션의 기초적인 부분을 다루게 된다.이를 위해 다운받았던 에셋팩에서 애니메이션 시퀸스 파일을 찾아 열어보자.열어보면 다음과 같은 화면을 볼 수 있다. 해당 화면을 통해 애니메이션이 동작하는 모습을 볼 수 있고, 우측 하단의 에셋 브라우저를 통해 다른 애니메이션들도 체크하는 것이 가능하다. 우측 상단의 해골 캐릭터 모양을 누르면 스켈레톤 메시를 확인할 수 있다. 해당 화면에서는 스켈레톤 메시를 체크가 가능하며, 해당 스켈레톤 메시를 구성하는 스켈레톤을 일일히 체크하는 것이 가능하다.만약 척추부위 스켈레톤을 좌측 패널에서 ..