멋쟁이 사자처럼 X 넥슨 MSW Supporters Hackathon 2주차 회고록

이지현·2022년 7월 14일
0

MSW

목록 보기
3/5
post-thumbnail

✔️ To do List

일자내용확인
7/11(월)3. 기본 컴포넌트의 이해
 4. 지형과 레이어의 이해
7/12(화)5. 자주 사용하는 컴포넌트
7/13(수)6. 스크립트의 이해
7/14(목)실습 1. 공동 월드 만들기
7/15(금)실습 2. 공용 워크스페이스 이용해 협업하기

3. 기본 컴포넌트의 이해

✔️ Transform Component : 오브젝트의 위치 정보를 갖고 있음

Position : 엔티티 위치 조정
Scale : 엔티티 크기 조정
WorldPosition : Position의 값과 상호 교환
WorldZRotation : zRotation의 값과 상호 교환
ZRotation : 엔티티의 회전 조정

✔️ Transfer Component의 활용

∙ Translate 함수

TranslateFunction은 엔티티 위치를 이동시킬 때 사용

void OnBeginPlay()
{
self.Entity.TransformComponent:Translate(4,5)  -- 배치된 엔티티 위치를 기준으로 X 좌표를 4, Y 좌표를 5만큼 이동합니다.
log("move on")  --  이동이 되면 콘솔 창에 Move On을 출력합니다.
}
∙ Rotate 함수

Rotate Function은 엔티티를 반시계방향으로 회전시킬 때 사용

void OnBeginPlay()
{
self.Entity.TransformComponent:Rotate(6) -- 배치된 엔티티 위치를 기준으로 6만큼 반시계 방향으로 회전합니다.
log("Move On") -- 실행이 완료되면 콘솔 창에 Move On을 출력합니다.
}

✔️ 스프라이트 : 2D 이미지, 스프라이트마다 고유의 RUID를 갖고 있음(RUID : 스프라이트, 애니메이션, 사운드 등 다양한 리소스가 가진 고유한 아이디 값)

SpriteRendererComponent의 SpriteRUID 프로퍼티에 복사한 RUID를 입력하여 스프라이트 이용할 수 있음

∙ SpriteRederer Component : 어떤 이미지를 표시할 것인가를 의미, 사용하지 않는 경우도 있음

SpriteRUID : 오브젝트의 고유한 번호, 이미지를 id 형태로 관리하는 것FlipX / FlipY : X축과 Y축을 기준으로 뒤집음(좌우반전 / 상하반전)
Color : 오브젝트에 색깔을 입힐 수 있음(원본 이미지의 색에 혼합돼서 출력됨)
DrawMode
TiledSize : 배치할 타일(오브젝트 하나)의 개수
PlayRate : (Animate 속성을 갖고 있는 오브젝트의 경우) 속도 조절
StartFrameIndex : (Animate 속성을 갖고 있는 오브젝트의 경우) 시작 이미지 인덱스
EndFrameIndex : (Animate 속성을 갖고 있는 오브젝트의 경우) 종료 이미지 인덱스

∙ animation : 이미지 여러 개로 구성되어 있는 오브젝트를 의미, 움직이는 듯한 효과를 냄

4. 지형과 레이어의 이해

✔️ 발판 만들기 : 타일이 아닌 Foothold 모델 이용

∙ FootholdComponent : 맵 전체의 발판 정보 저장 및 제공
∙ CustomFootholdComponent : 발판 생성 및 조정

✔️ 발판 경로 그리기 : 엔티티가 지나갈 발판의 경로를 직접 설정

eggLists : 발판의 시작점
Size : 발판을 이루는 점의 개수
[숫자] : 발판의 연결점 개수

✔️ 발판의 속성

FootholdDrag : 엔티티에게 적용되는 마찰력, 값이 클수록 엔티티가 발판에서 미끄러지다 빠르게 감속해 정지
FootholdForce : 반대 방향으로 이동하려고 할 경우 저항으로 인해 방해받음
FootholdWalkSpeedFactor : 이동속도에 곱해지는 계수, 값이 클수록 이동속도가 빨라짐

✔️ 맵 레이어 : 맵 화면 위에 하나 또는 여러 개의 판

∙ 레이어 우선순위 적용 규칙
  1. Map Layer (SpriteRendererComponent의 SortingLayer)
  2. SpriteRenderer Component OrderInLayer 프로퍼티
  3. Transform Component의 Position Z값

OrderInLayer : 레이어의 배치 순서 결정


5. 자주 사용하는 컴포넌트의 이해

✔️ Tween component : 엔티티에 운동성 부여, 세부 설정 조정

∙ TwinFloatingComponent : 원점을 기준으로 부유 운동, 엔티티가 제자리에서 떠다니는 듯한 움직임 연출
∙ TweenLineComponent : 원점에서 목적지까지의 선형운동, 목적지까지 편도/왕복 운동 및 가/감속, 도달 시 튕김의 운동 방식 설정
∙ TweenCircularComponent : 원점을 중심으로 원운동

✔️ RigidBodyComponent : 강체의 물리적인 속성을 컨트롤 할 수 있는 컴포넌트

gravity : gravity 프로퍼티의 값 조정을 통해 공중에 떠 있거나 지면에 떨어지도록 할 수 있음
IsBlockVerticalLine : 세로 방향의 foothold를 설정할 수 있음
IsQuaterViewMove : 프로퍼티의 값 조정을 통해 컴포넌트가 지형에 떨어지지 않고 자유롭게 움직일 수 있도록 설정할 수 있음

✔️ MovementComponent : InputSpeed 프로퍼티의 조정을 통해 이동 속도를 설정하고 JumpForce 프로퍼티의 조정을 통해 점프의 정도를 설정함

✔️ TriggerComponent : 엔티티의 충돌을 감지하는 컴포넌트

∙ TriggerComponent : 충돌 범위 설정
∙ HitComponent : 피격 범위 설정
∙ 충돌체 크기 / 위치 편집

Collider : 프로퍼티 에디터의 Edit 버튼을 누를 경우 엔티티에 충돌체가 나타남, 드래그 or 핸들러 조절을 통해 충돌체 크기 설정 가능
BoxOffset & ColliderOffset : 충돌체의 위치 설정
BoxSize : ColliderType이 Box일 경우 충돌체의 크기 설정
CircleRadius : ColliderType이 Circle일 경우 충돌체의 크기를 설정
ColliderType : 충돌체의 형태 선택, Box의 경우 충돌체를 사각형으로, Circle의 경우 원형으로 변경
IsLegacy : TransformComponent에 영향을 받을지 여부를 설정

∙ Trigger EventHandler

TriggerEnterEvent : 엔티티 간 처음 충돌이 발생했을 때 1회 발생
TriggerStayEvent : 엔티티가 충돌 중이면, 프레임마다 발생
TriggerLeaveEvent : 엔티티가 충돌되었다가 충돌이 끝났을 때 1회 발생

∙ 충돌 Event Sender 설정

리액터 컴포넌트가 추가된 엔티티의 충돌 이벤트를 받는 경우 : 값을 self로 설정
외부 엔티티의 충돌 이벤트를 받는 경우 : Entity로 설정

∙ 로직의 순서

1. TriggerComponent 확장
2. 함수 오버라이드
OnEnterTriggerBody : 엔티티 간 충돌이 처음 발생했을 때 1회 호출
OnStayTriggerBody : 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐있는 동안 프레임마다 호출
OnLeaveTriggerBody : 엔티티 간 충돌이 종료될 때 1회 호출
3. 파라미터 : 충돌 이벤트가 들어옴

✔️ PlayerComponent

∙ 장애물과의 충돌이 들어올 경우 hp를 100씩 감소시키는 스크립트 예제

✔️ PlayerControllerComponent

∙ 플레이어 컨트롤 예제

LookDirectionX : 현재 X축을 기준으로 캐릭터가 바라보고 있는 방향을 의미
양수 : 오른쪽
음수 : 왼쪽
FixedLookAt : 캐릭터가 바라보고 있는 방향을 고정시키는 것
1 : 오른쪽
-1 : 왼쪽


6. Lua 스크립트의 이해

✔️ 기본적인 문법

∙ log() : () 안에 콘솔창에 출력할 값 넣어주면 됨
∙ 변수 선언 키워드 local : 지역 변수 선언 시 사용
∙ 조건문 : 끝나는 지점에서 end로 닫아줌
local sum = 0
for cnt = 1, 10, 1 do
	if cnt % 2 == 0 then
    	sum = sum + cnt
    end
end
∙ 반복문 : 끝나는 지점에서 end로 닫아줌
for count = 1, 10, 1 do -- 1부터 10까지 1씩 증가
	log(count)
end

✔️ Hello Maple World 출력하기

void onBeginPlay() {
	log("Hello Maple World")
}

출력결과:

✔️ 주로 사용하는 스크립트

∙ Create Component

특정 객체에 추가해주어야 함, 함수에서 내가 속한 컴포넌트의 프로퍼티 또는 함수를 가져다 쓸 때 self.컴포넌트명으로 컴포넌트를 불러와 사용할 수 있음

∙ Create Logic

프로그램 상에 하나만 존재

✔️ 자주 사용하는 함수

∙ OnBeginPlay : 컴포넌트 초기화될 때 처리하는 로직
void OnBeginPlay()
{
    local myEntity = self.Entity    --자기 자신이 적용된 엔티티 참조 가능.
    log(myEntity.Name.."HelloMOD")    --콘솔 창에 myEntity의 이름과 "HelloMOD!" 출력
     
    --OnInitialize와는 달리 아래와 같이 다른 엔티티, 다른 컴포넌트의 참조가 보장됩니다.
    local otherComponent = myEntity.컴포넌트이름
    local otherEntity = _EntityService:GetEntityByPath("엔티티 경로")
    local otherEntityComponent = otherEntity :GetComponent("컴포넌트이름")
}

▶︎ 주의할 점
호출 순서 보장되지 않음, 다른 컴포넌트의 OnBeginPlay에서 컴포넌트 A의 프로퍼티 참조해야 한다면 컴포넌트 A에서 OnInitialize를 활용해 프로퍼티 값을 설정하는 것이 좋음

∙ OnUpdate : 프레임마다 주기적으로 불리는 함수
void OnUpdate(number delta)
{
    if self._T.Time == nil then self._T.Time = 0 end
    self._T.Time = self._T.Time + delta
     
    --3초마다 Console 창에 HelloMOD를 출력
    if self._T.Time >= 3 then
        self._T.Time = 0
        log("HelloMOD")
    end
}
∙ OnEndPlay : 끝날 때 처리하는 로직, 1회 호출됨
vold OnEndPlay()
{
    log("OnEndPlay!!")
    -- Console Result
    -- OnEndPlay!!
}

✔️ 스크립트 디버그

Breakpoints
Debug
Watch Expression : 프로퍼티/함수 내부에 선언된 변수를 Watch Expression에 등록해 코드가 실행될 때마다 값이 어떻게 변경되는지 추적
Call Stack : 현재 디버깅 중인 함수가 어디서부터 호출되었는지 확인

✔️ 함수의 세부사항

다른 언어들처럼 함수 리턴 타입 설정, 함수 호출, 파라미터 등 사용 가능

✔️ 엔티티와 컴포넌트 참조

self.Entity : 컴포넌트 자신을 포함하고 엔티티로의 접근

void OnBeginPlay()
{
    local myEntity = self.Entity
    log(myEntity.Name)  -- 엔티티 이름 출력
}

Entity.Parent : 엔티티의 상위 엔티티 참조

void OnBeginPlay()
{
    local myEntity = self.Entity
    log(myEntity.Name)  -- Entity C의 이름 출력
    local parentEntity = myEntity.Parent
    log(parentEntity.Name) -- Entity A의 이름 출력
}

Entity.Children : 엔티티의 하위 엔티티 참조

void OnBeginPlay()
{
    local myEntity = self.Entity
    log(myEntity.Name)    -- Entity C의 이름 출력
    local parentEntity = myEntity.Parent
    log(parentEntity .Name)   -- Entity A의 이름 출력
    local children = parentEntity.Children  --Entity A의 하위 엔티티인 Entity CEntity D를 테이블 형태로 받아옵니다.
    local childrenEntity = nil
    for index, child in pairs(children) do
        if child.Name == "EntityD" then
            childrenEntity = child
            break
        end
    end
    if childrenEntity == nil then
        log("EmptyEntityD")
        return 
    end
    local childrenEntity = nil
    log(childrenEntity.Name)      --Entity D의 이름 출력
}

번외. Lua 스크립트만의 특징

  1. null이 아닌 nil
  2. 기본적인 자료형은 nil, boolean, number, string, function, table, userdata, thread
  3. !=가 아닌 ~=
  4. !, &&, || 등이 아닌 not, and, or
  5. ^은 pow, 즉 거듭제곱
  6. A+=B 같은 할당 연산자는 지원x
  7. 문자열 합치기는 A .. B
  8. 삼항 조건 연산자 지원x
    ex) condition ? exprIfTrue : exprIfFalse
    → condition and exprIfTrue or exprIfFalse

실습 1. 공동 월드 만들기

공동 월드 만들기는 생각보다 간단하다!

아직 팀원분들을 추가하지 않아서 개인 월드 불러오기를 통해 그룹 월드를 만들었다.


실습 2. 공동 월드 만들고 협업하기

  • Ctrl+Alt+2를 이용하여 메이플 맵을 불러올 수 있다.

  • 공동 작업 시 Ctrl+S를 이용하여 Check-In(저장)을 해야 다른 팀원이 편집하는 것이 가능하다!

매우 신기함😮 얼른 공동 작업 해보고싶다!!!

profile
2023.09 ~ 티스토리 이전 / 2024.04 ~ 깃허브 블로그 이전

0개의 댓글