카테고리 없음

[멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon] 3주차 회고 <스크립트의 이해>

프로틴형님 2022. 7. 21. 23:34

스크립트 에디터 오리엔테이션


스크립트 컴포넌트 추가

  • Workspace -> MyDesk -> 마우스 오른 클릭 -> Create Scripts -> Create Component
  • 컴포넌트 생성
  • 스크립트 에디터 실행

스크립트 작성


스크립트 컴포넌트가 실행될 때, "Hellow World"를 콘솔창에 출력.


작성한 스크립트 컴포넌트를 추가

  • Workspace -> DefaultPlayer -> Property -> Add Component -> 컴포넌트 클릭
  • 콘솔 출력 결과

Lua 스크립트 문법


  • Lua 스크립트는 절차 지향(순차적인 구조)로 소스코드가 실행됨
  • log() : 콘솔창에 인자값을 출력
  • local : 변수 선언 키워드 ( local 변수명 = 초기화값 )
  • 반복문
    for count = 1, 10, 1 do 
      log(count) 
    end
    | (반복자, 조건, 증감값) do 키워드로 시작
    | 반복할 실행문이 끝나는 지점에서 end로 닫아준다
  • 조건문
    local sum = 0
    for cnt = 1, 10, 1 do
      if cnt % 2 == 0 then
              sum = sum + cnt
      end
    end
    | if (조건식) then (실행문) end 형식

함수


MOD의 함수는 함수의 호출 주체가 누구냐에 따라 기본 이벤트 함수와 사용자 지정 함수로 나눌 수 있다.

  • 기본 이벤트 함수 : 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때 호출되는 함수
  • 사용자 지정 함수 : 호출 시점이 정해져 있지 않음

함수의 선언과 삭제


함수의 삭제는 선언된 함수 우측의 메뉴 버튼을 눌러 메뉴 목록이 나타나면 Remove를 선택해 제거


함수 호출

  • 동일 컴포넌트의 함수를 호출할 때는 다음과 같이 self:함수명(파라미터) 형식으로 호출
  • 다른 컴포넌트의 함수를 호출할 때에는 컴포넌트객체:함수명() 형식으로 호출
  • 루아 스크립트에서 제공하는 일부 함수 또는 일부 타입에서 제공하는 Static 함수의 경우에는 :이 아닌 .으로 호출


MOD 기본 이벤트 함수


  • MOD에서는 몇 가지 기본 이벤트 함수를 제공하고 있으며, 기본적으로 Server 공간에서 호출되도록 설정되어있다.
  • 크리에이터의 설정에 따라 Server에서만 호출할지, 아니면 Client에서만 호출할지 또는 Server, Client 모두 호출할지를 설정 가능

OnInitialize

OnBeginPlay가 호출되기 전, 엔티티와 컴포넌트가 생성된 후 1회 호출되는 함수

void OnInitialize()
{
    local myEntity = self.Entity      --자기 자신이 적용된 엔티티 참조 가능.
    --콘솔 창에 myEntity의 이름과 "HelloMOD!" 출력
    log(myEntity.Name.."HelloMOD")

    --아래와 같이 OnInitialize 내부에서 다른 엔티티나 컴포넌트의 참조는 추천하지 않습니다.
    local otherComponent = myEntity.컴포넌트이름      --nil일 가능성 있음.
    local anotherEntity = _EntityService:GetEntityByPath("엔티티 경로")  --다른 엔티티 참조. nil일 가능성 있음.
}

OnBeginPlay

OnInitialize 이후 그리고 OnUpdate 직전, 본격적으로 로직이 스타트하는 시점에 1회 호출되는 함수

void OnBeginPlay()
{
    local myEntity = self.Entity    --자기 자신이 적용된 엔티티 참조 가능.
    log(myEntity.Name.."HelloMOD")    --콘솔 창에 myEntity의 이름과 "HelloMOD!" 출력

    --OnInitialize와는 달리 아래와 같이 다른 엔티티, 다른 컴포넌트의 참조가 보장됩니다.
    local otherComponent = myEntity.컴포넌트이름
    local otherEntity = _EntityService:GetEntityByPath("엔티티 경로")
    local otherEntityComponent = otherEntity :GetComponent("컴포넌트이름")
}

OnUpdate

OnBeginPlay 호출 이후, 프레임마다 호출되는 함수

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

OnDestroy와 함께 엔티티가 제거되는 시점에 1회 호출되는 함수

vold OnEndPlay()
{
    log("OnEndPlay!!")
    -- Console Result
    -- OnEndPlay!!
}

OnDestroy

OnEndPlay와 함께 엔티티가 제거되는 시점에 1회 호출되는 함수

void OnDestroy()
{
    log("OnDestroy!!")
    -- Console Result
    -- OnDestroy!!
}

OnMapEnter

엔티티가 맵에 입장하거나, 혹은 맵에 생성될 때마다 호출되는 함수

void OnMapEnter(any enteredMap)
{
    --map01에 입장할 때마다 Player의 크기가 커지도록 구현합니다.
    if enteredMap.Name == "map01" then
        local myPlayer = self.Entity
        local transform = myPlayer.TransformComponent
        local scale = transform.Scale
        scale.x = scale.x + 1
        scale.y = scale.y + 1
        transform.Scale = scale
    end
}

OnMapLeave

엔티티가 맵에서 퇴장할 때, 혹은 맵에 제거될 때마다 호출되는 함수

void OnMapLeave(any leftMap)
{
    --map01에서 퇴장할 때마다 Player의 크기가 작아지도록 구현합니다.
    if leftMap.Name == "map01" then
        local myPlayer = self.Entity
        local transform = myPlayer.TransformComponent
        local scale = transform.Scale
        scale.x = scale.x - 1
        scale.y = scale.y - 1
        transform.Scale = scale
    end
}