카테고리 없음

[멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon] 4주차 회고 <알아두면 유용할 것들>

프로틴형님 2022. 7. 31. 22:37

알아두면 유용할 것들


Model

  • 모델 : 엔티티에 컴포넌트를 추가해 모델화 할 수 있습니다.
  • Original Model : 빈 엔터티에서 컴포넌트들을 추가해 새로운 무언가를 만든 것입니다.
  • Child Model : 기존 엔터티에서 상세 컴포넌트만 바뀐 것으로, 기존 엔티티에서 파생된 모델.
  • 부모 모델과 자식 모델의 관계자식 모델에서는 자신보다 상위 모델인 부모 모델에서 추가한 컴포넌트를 삭제할 수 없습니다. 반대로 부모 모델에 새로운 어떤 컴포넌트 추가시 자식 모델에도 추가됩니다.
  • 자식 모델의 기존 엔터티를 부모 모델이라 생각하시면 됩니다. 부모 모델이 자식 모델의 상위 개념입니다.

[모델과 관련된 기능들]
아래의 기능들은 해당 엔티티의 Property 창에서 엔티티의 모델에 해당하는 컴포넌트에서 설정할 수 있습니다.

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

동적 spawn 구현 예시

동적 spawn이란?

메이플 스토리의 필드를 보면 몬스터를 아무리 잡아도 특정 마릿수 내에서 몬스터가 지속적으로 등장하고, 일정 구역을 계속 돌아다니는 것을 알 수 있습니다. 이는 각 필드 단위 별로 스폰할 몬스터와 스폰할 몬스터의 수를 설정하면, 해당 조건에 맞춰 몬스터가 생성되는 스폰 시스템이 있기 때문입니다.

동적 spawn 구현시 SpawnByModelId 함수를 사용합니다. 자세한 파라미터의 형태는 개발자 센터 API 페이지를 참고하시기 바랍니다.

  • SpawnByModelId 함수 더 알아보기_SpawnService:SpawnByModelId를 사용하기 위해서는 엔티티로 생성할 모델이 WorkSpace에 추가되어 있어야 하며, 추가된 Model ID를 파라미터로 넘겨주어야 합니다.
  • spawn을 클라이언트에서 구현시 나에게만 보입니다. 반대로 서버에서 구현하면 유저 모두에게 보입니다.
  • SpawnByModelId_SpawnService가 제공하는 스폰 관련 함수 중 하나입니다.

실행제어 주의 사항


CallFunction1의 경우 서버에서만 돌아가는 함수로 value값 출력시 서버에서 함수 결과값을 받아와 정상적으로 값이 출력됩니다.

CallFuctionFromClient의 경우 클라이언트에서만 돌아가는 함수(function setting을 해주지 않음)로 value값 출력시 서버에서 값을 받아오지 못합니다. 따라서 정상적으로 값이 출력되지 않습니다.

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


엔티티 동적 생성

동적 생성이란?

개발자가 모든 설정을 수동으로 작업해 엔티티를 생성하는 것이 아니라, 알아서 엔티티가 자동으로 생성되도록 하는 것입니다. 주로 같은 모델의 엔티티를 여러개 생성할 때 사용합니다.

[ball 엔티티의 동적 생성 예시 코드]

 

TweenLineComponent 설정

 

BallComponent 코드


Start() : TweenLineComponent에서 설정한 Duration을 로컬 변수 duration에 받아 엔티티의 움직임이 시작되고 duration만큼 기다렸다 사라지게 합니다.

 

MoveComponent 코드

*CallBack : 주기적으로 실행하는 것으로 함수의 경우 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 영역을 처리해줍니다. 그러나 컴포넌트에서 추가하면 수동으로 사이즈를 입력해줘야합니다. 이렇게 되면 엔티티를 동적 생성하는 경우 하나하나에 충돌 설정을 자동으로 해줄 수 없게 됩니다.

따라서 동적 생성된 엔티티의 경우, 함수에 다음과 같이 AddComponent 함수를 사용해 RigidBodyComponent를 추가해주면 됩니다.

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

*BTNodeType

패키지형 컴포넌트로 여러가지 기능이 유기적으로 연결되어 있는 것입니다. Action 노드 타입으로 활용할 수 있으며 손쉽게 사용할 수 있고, 구성을 확장시킬 수 있습니다.

엔트리 추가 메뉴에서 CreateScripts - Create BTNodeType을 선택하면 BT 노드 타입이 생성됩니다.