멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 6주차 회고

ssunn·2022년 6월 26일
0

저번주가 시험기간이라 바빠서 이번주에 6, 7주차를 전부 듣고 회고록을 올리게 되었다.
6주차에서는 UI 에디터의 전반적인 부분에 대해서, 그리고 알아두면 유용할 것들에 대해 복습하는 시간이었다.

UI 에디터의 이해

UI : 유저와 클라이언트가 소통할 수 있는 매개체(화면의 버튼, 텍스트, 이미지 등)

게임에서는 UI → GUI (Graphic User Interface)
어떤 행동의 입출력을 주로 담당한다.
화면에 고정되어 있는 UI → maps의 하위 ui가 아닌 ui의 하위 ui
mod에서는 ui가 바로 가상의 좌표계를 의미함.

UI 에디터

이미지 → 이미지 또는 버튼들이 배치됨
ui 프리셋 → 자주 사용하는 ui들. 스크립트까지 포함되어있음.

UITransformComponent

ui 위치 좌표 : PosX, PosY - 일반적인 좌표 위치

좌표 기준을 중앙 또는 상하좌우로 마음대로 설정 할 수 있음.
쉽게 생각해 constraint를 지정할 수 있음.
stretch를 지정하면 부모 도형 밖으로 나가지 않음.
stretch의 left & right는 왼쪽과 오른쪽이 얼마나 떨어져있는가를 의미함.

SpriteGUIRendererComponent

imageRUID : 이미지 설정

button 구현 설정

이미지를 넣고 button 컴포넌트를 설정.
텍스트 넣고 이미지 넣어도 됨.
텍스트 버튼 → 같은 버튼 객체에 textComponent를 추가해 텍스트 버튼을 만들어도 됨

팝업 구현 설정

레이어 다르게 해서 화면 구성. enable 조절하면 안 보이다 보이게 됨.

UiGroupComponent

DefaultShow - 이 ui가 기본으로 보일지말지. DefaultShow를 활성화하지 않으면 enable로 설정됨.
ui 경우 map과 달리 클라이언트 전용임.

map 객체는 서버에도 존재하지만 ui 객체는 각 클라이언트에만 생성되어 있음. 서버에는 존재하지 않음.

로컬 엔티티 즉, 클라이언트 전용 객체는 Sync를 활성화 할 수 없음. Sync는 서버와 클라이언트의 동기화를 하는 것인데 클라이언트 전용이기 때문에 동기화 할 필요가 없기 때문이다.

[스크립트를 이용해 토스트 메시지 띄우기 예시]

[버튼 클릭시 텍스트 바뀜 이벤트 예시]

map 객체와 Ui 객체의 차이점

[시간에 따라 텍스트가 바뀌도록 이벤트 예시]

공간 활성화로 Server Only로 서버에서 시간을 가져오면 클라이언트끼리 시간이 다르게 나옴. (클라이언트에서만 실행되기 때문에 발생하는 오차)

공간을 비활성화 한 후 이것은 클라이언트에서만 실행한다는 조건을 주어야 서버에 있는 시간을 제대로 갖고 옴. 이렇게 하면 클라이언트끼리 같은 서버 시간을 가져옴.

서버상의 데이터를 가져오려면 서버와 동기화 가능한 컴포넌트를 map의 엔티티에 적용시키는 방법을 사용해야함.

[hp bar ui 이미지 만들기 예시]

HP바의 fillAmount로 채움 정도를 조절할 수 있음.

[fill type]

fillAmount는 type이 fill일 때만 적용 가능.

[scale type]

type을 scale로 했을 때 hp바 적용하려면 피벗을 사용하면 됨.

인벤토리 제작

ScrollLayoutGroupComponent : 같은 엔티티가 일정 간격으로 계속해서 생성되도록 함.

celSize도 일괄로 조절 가능.
스크롤 방향도 조절 가능.

[아이템 ui 동적 생성]

동적 이벤트 연결 connect를 이용하면 됨.
npc ui를 map이 아닌 ui 상에서 생성 또한 가능함.
단 UITransformComponent와 SpriteGUIRendererComponent를 이용해 이벤트를 설정해주어야함.

ui는 규격화 되어 있는 사이즈에 따라 텍스처가 배치되기 때문에 크기가 변경되면 살짝 찌그러지는 현상이 발생함 → PreserveSprite의 모드를 None이 아닌 AspectOnly로 바꿔주면 원본의 이미지가 정상적으로 셋팅됨.

NativeSize : 원본 사이즈대로 출력됨.
NameTagComponent : npc나 유저들의 이름을 보여줌

알아두면 유용할 것들

모델 : 엔티티에 컴포넌트를 추가해 모델화 할 수 있음.
Original Model : 빈 엔터티에서 컴포넌트들을 추가해 새로운 무언가를 만든 것.
Child Model : 기존 엔터티에서 상세 컴포넌트만 바뀐 것. 자식 모델에서는 부모 모델에서 추가한 컴포넌트를 삭제할 수 없음. 부모 모델에 새로운 어떤 컴포넌트 추가시 자식 모델에도 추가됨.

revert : 어떤 기능을 모델 전체에 추가시 사용
apply : 부모 모델에서 추가된 기능을 현재 모델에 추가시 사용

[동적 spawn 구현 예시]

spawn을 클라이언트에서 구현시 나한테만 보임
서버에서 구현하면 유저 모두에게 보임

스크립트

실행제어 주의 사항

CallFunction 1의 경우 서버에서만 돌아가는 함수로 value 값 출력시 서버에서 함수 결과값을 받아와 정상적으로 값 출력됨.

CallFuctionFromClient의 경우 클라이언트에서만 돌아가는 함수로 value값 출력시 서버에서 값을 받아오지 못하므로 정상적으로 값이 출력되지 않음.

내부 임시 변수 생성 : self._T.변수명

엔티티 동적 생성


콜백 : 주기적으로 실행할 것. 함수의 경우 self.으로 호출(보통 self:로 호출)
조금 기다렸다가 실행하거나 db에 저장하는 경우 등에 사용.

void OnBeginPlay():
{
		_TimerService:SetTimer(self, self.Spawn, 0.5, true)
}

--local 함수를 가져다 쓰는 경우 self가 필요하지 않음
void OnBeginPlay():
{
		local function a()
				log("TTTT")
		end 

		_TimerService:SetTimer(self, a, 0.5, true)
}

충돌

메이커에서 TriggerComponent 추가시 자동으로 offset 영역을 처리해줌. 그러나 컴포넌트에서 추가하면 수동으로 사이즈를 입력해줘야함.

self.Entity:AddComponent("RigidBodyComponent", true)

BTNodeType : 패키지형 컴포넌트. 여러가지 기능이 유기적으로 연결되어 있는 것. 손쉽게 사용할 수 있도록 만들어둔 것. 구성 확장시킬 수 있음.

profile
BackEnd Developer

0개의 댓글