언리얼 엔진5 강의 요약 – 6. 창고부수기 게임 5편 (Actor/Components, Collision, 기초 컴공 지식들)

Actor와 Component?


이전의 강의 내용에 Actor와 Component, Object에 대해 다룬 바 있다.

모든 Actor와 Component는 Object이고, 그중에 Actor는 게임 내에서의 단일 Object 개념, Component는 Actor를 구성하는 Object 이다.

즉 Component들로 Actor가 만들어진다. 이를 하는 방법을 소개.

콘텐트 드로어에서 Rack Actor를 만들어볼 것임.

먼저 랙1을 맵에 놓는다. 그러면 이는 액터로서 맵에 나타난 것.

여기서 디테일에 랙1의 StaticMeshComponent에 랙2를 끌어다 놓는다.

그러면 이는 랙1 액터의 루트 컴포넌트의 자식 컴포넌트로서 들어가게 된다.

자식 컴포넌트는 루트 컴포넌트에 종속적으로 좌표가 설정 됨.

Collision 충돌

이렇게 물체를 배치하고 플레이 해보면, 물체가 가만히 있는 채로 시작하는게 아니라 지멋대로 튀는 걸 볼 수 있음.

이는 충돌 판정이 발생해서 그런 것임..

뷰포트를 플레이어 콜리전으로 놓고 보면,

배럴에 대한 충돌 판정 범위가 실제 물체보다 추상적임을 알 수 있다.

이래서 우리가 기대하는 충돌이 발생하지 않는 것.

이를 수정하기 위해서

콘텐트 드로어에서 배럴을 더블클릭해서 애셋 에디터를 켜준다.

여기서 콜리전 제거 후 10면체 Z 단순화 콜리전 ㄱㄱ

이렇게 위 아래 콜리전 판정이 평평해진 것을 볼 수 있고 플레이해보면 안넘어지는 걸 확인 가능함.

Variables 변수와 Branches 조건문

그냥 일반 컴공의 변수다. 내가 원하는 데이터를 저장하기 위한 변할 수 있는 어떠한 값.

레벨 블루프린트에서 왼쪽에서 변수 + 누르면 변수 만들기 가능.

컴파일 하면 기본값 조정 가능하고 이는 우측 패널 하단에 있다.

총알 변수를 만들어서 제한을 둬보자.

그리고 Branch와 조건식을 활용해서 총알 다 떨어지면 안나오게 ㄱㄱ

이건 걍 기초 컴공 지식이라 복잡하게 안쓰고 걍 완성된 블루 프린트만 남김.

Functions 함수 만들기

이거도 그냥 기초 컴공지식인데, 블루프린트 내에 있는 이벤트 플로우를 기능면으로 분류했을 때, 함수화 할 수 있는 부분들이 있을 것이다.

이를 한번에 그룹화 해서 우클릭하면 함수로 접기가 나옴.

이를 통해서 함수화 할 수 있다.

위의 복잡한 조건식들을 함수화하면 다음과 같이 깔끔하게 기능 별로 추상화 할 수 있다.

근데 뭐 이런 함수화를 어떤 범주로 얼마만큼 해야하는가는 정해져있는 것이 아니다. 주관적인 영역.

다만 한가지 대전제만 깔고 가면 된다. 모두가 이해하기 쉽고 활용하기 쉽게!

이번엔 좌측 패널 함수의 +를 눌러서 함수를 만들어보자.

총알이 있는지를 판단하는 함수 ㄱㄱ

우측 디테일 패널에서 이거저거 설정 가능하고 input/output도 설정 가능함.

이렇게 만듬.

강의는 함수 내에 아예 ammoCount 변수를 가져오던데, 극혐…

바깥 range 변수는 함부로 끌어다 놓는 거 아니다…

Pure Functions 순수 함수

언리얼은 side-effect라는 개념이 있음. 그래서 디폴트 함수는 모두 사이드 이펙트를 불러온다고 상정함.

사이드 이펙트는 관측 가능한 영향. 컴공의 destructive와 같다고 보면 됨.

정리해보면 일반 함수는 실행함으로써 프로젝트 전체(게임)에 되돌릴 수 없는 영향을 미치고,

순수 함수는 실행함으로써 게임에 미치는 영향이 없는 함수임. 가장 쉬운 예로 getter.

단순히 변수값만 받아오는 기능이 게임에 무슨 영향을 미칠까?

그 반대는 setter. setter는 변수를 설정하기 때문에 게임에 영향을 미친다.

만드는 법은 블루프린트 내에서 우측 디테일 탭에 퓨어 누르면 끝남.

이렇게 만든 함수는 초록색으로 표기되며 흰색 execution pin이 없음.

강의만의 컨벤션(코딩표준)이 있는데, 순수 함수에는 접두어에 동사를 붙이지 말 것.

이 순수함수 꽤나 Strict함. 단순 print 함수 퓨어로 만들었더니 화면에 노출 안 됨. 게임에 영향을 주는 건 무조건 일반 함수로 만들어야 함.

멤버함수

뭐 또 나오는 기초 컴공 지식. OOP 개념에서 Object에 할당 된 함수를 의미. 메소드라고도 불림.

결국 클래스가 지니는 함수다. 이는 클래스 함수랑은 다름. 클래스 함수는 그 개체의 표준 기능, 멤버 함수는 그 개체가 구체화 된 하나의 객체에 대한 기능임.

뭐 예를 들자면 이런 느낌임. 인간이 있다. 이 인간의 이름은 이현미다. 그러면 클래스 함수로는 나는 인간이다. 멤버 함수로는 나는 이현미다.

멤버 변수와 클래스 변수로 예를 드는 게 더 쉽겠다. 인간 클래스가 있다 치면, 총 인간 카운트를 클래스에 넣어서 만들어진 인간 수를 관리하게 할 수 있는 게 클래스 변수고,

만들어진 인간 하나 하나의 값을 설정하는 것이 멤버 변수다. 뭐 나이는 어떻고, 이름은 뭐고, 사는 곳은 뭐고…

느낌이 좀 옴?

그래서 멤버 함수는 하나의 클래스가 공통적으로 실체화 돼서 할 수 있는 기능이다.

만들어둔 클래스 중에 총알 클래스 있으니까 거기다가 멤버 함수 만들어 보자.

뭐 썩 좋은 예시인지는 모르겠으나…

총알의 오브젝트명을 리턴시키는 멤버 함수다.

보면 self 라는 게 나오는데 이거 이해 안가면 oop부터 다시… 간략히 설명하면 object 나 자신이라는 거다.

인간이라 치면 나이, 키, 이름 등 변수를 가져오거나 기능들을 가져올 수 있겠지?

이런 식으로 만들고 총알을 스폰할 때마다 이름을 출력하도록 해보자.

액터 스폰의 return은 해당 액터 Object의 reference이므로 발사 된 총알 object가 리턴됐을 것이고, 그 object의 printName 멤버 함수니까 그 총알의 이름이 출력될 것.

요로코롬 총알 객체의 이름들이 나오는 것을 볼 수 있다.

총알에 Impulse를 주는 일은 총알 object 자체의 기능으로 넣어보자.

이렇게 만들면 됨.

마치며…


이번 포스팅이 이해가 힘들다면 기초 컴공부터 공부하고 재도전 하는 것을 권장함. 초심자가 이걸 다 익히면서 가기에는 너무 빡셈 언리얼은 ㅇㅇ

이전글

다음글


Posted

in

, ,

by

Tags:

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다