MSW 기본 학습 교안 6. 스크립트의 이해

bi_sz·2022년 9월 27일
0

MSW

목록 보기
6/11
post-thumbnail
post-custom-banner

MyDesk -> 마우스 우클랙 -> Create Script -> Create Script

console test

log("Hello World!")

-- 변수 선언
local number = 1
local sum = 0

log(sum)

-- 함수
void Sum()
{
--반복문 선언
	for count = 1, 10, 1 do  -- 1부터 10까지 1씩 증가
    -- 조건문 
    	if count%2 == 0 then
        	sum = sum + count
        end
    end
}

log()

  • console 창에 로그를 찍기 위해서는 log() 내부에 출력할 값을 넣어주면 된다.

변수 선언 키워드 local

  • 변수를 선언하는 키워드로 local을 사용한다. 변수 선언 방식은 local number = 1 과 같이 loal 자료형 = 초기화 값 의 형태로 이루어진다.
  • 변수를 local키워드 없이 사용하여 명시적으로 지역으로 정의하지 않으면 glocal(전역)변수로 취급하게 된다. 이에 local(지역)으로 사용하길 원한다면 명시해야 한다.

순차 구조

  • 대부분의 스크립트 언어와 마찬가지로 Lua Script는 순차적인 구조로 소스 코드가 실행된다.

반복문

for count = 1, 10, 1 do
	log(count)
end

for 이후에 반복자 = 초기값, 조건, 증감값 do 로 시작한 후, 반복할 실행문이 끝나는 지점에서는 end로 닫아준다.

조건문

local sum = 0
for cnt = 1, 10, 1 do
	if cnt % 2 == 0 then
    	sum = sum + cnt
    end
end

조건문의 경우 if 조건식 then 으로 시작하여 end 사이 조건을 만족하였을 때의 수행문을 입력해주면 된다.

Create Component

  • MyDesk -> 마우스 우클릭 -> Create Scripts -> Create Component

  • 컴포넌트 스크립트는 특정 객체에 추가해야 스크립트가 돌아간다. 또, 콘솔창에 로그를 찍게 되면 스크립트를 추가한 객체의 수만큼 로그가 찍힌다.
  • Property를 설정할 수 있는데, 이때 설정한 Property는 Property창에 노출된다. 함수에서 내가 속한 Component의 Property 또는 함수를 가져다 쓸 때 Self. 컴포넌트명으로 컴포넌트를 불러와 사용할 수 있다.

Create Logic

  • 로직은 따로 어떤 객체에 추가를 해주지않아도 프로그램 상에 하나만 존재하기 때문에 콘솔창에 결과가 뜬다.

Funtion은 쉽게 말해 기능을 모아둔 것을 의미한다.

위와 같이 함수를 추가할 경우 다양한 함수들이 있고, 본인이 원하는 함수를 새롭게 만들어 사용할 수도 있다.

OnBeginPlay

컴포넌트가 초기화가 될 때 (처음 시작할 때) 처리하는 로직이다.

viod OnbeginPlay()
{
	local myEntity = self.Entity  -- 자기 자신이 적용된 엔티티 참조 가능.
    log(myEntity.Name.."HelloMSW") -- 콘솔 창에 myEntity의 이름과 "HelloMSW" 출력
    --OnInitialize와는 달리 아래와 같이 다른 엔티티, 다른 컴포넌트의 참조가 보장된다.
    local otherComponent = myEntity.컴포넌트이름
    local otherEntity = _EntityService:GetEntityByPath("엔티티 경로")
    local otherEntityComponent = otherEntity:GetComponent("컴포넌트 이름")
}
OnBeginPlay 함수 주의할 점!

각 컴포넌트 내 OnBeginPlay의 호출 순서는 보장되지않기 때문에, 특정 컴포넌트의 OnBeginPlay로 설정이 완료된 값을 받아오게 되면 오작동 할 가능성이 있다.

예를들어, 컴포넌트 A의 OnBeginPlay에서 컴포넌트의 A의 프로퍼티 B를 ""에서 "Hello"로 설정한다 했을 때, 컴포넌트 C의 OnBeginPlay에서 프로퍼티 B를 참조하면 값이 "Hello"가 아닌 ""로 받아올 가능성이 있다.

ComponentA{
	Property :
    	[Sync]
    	string B = ""
        
    Function :
    	[Server Only]
        void OnbeginPlay() -- 바뀌어야하는 부분
        {
        	self.B = "Hello"
            log(self.B)
        }
}

ComponentC{
	Property : 
    
    Function :
    	[Server Only]
        void OnBeginPlay()
        {
        	local myEntity = self.Entity
            local componentA = myEntity.componentA
            log(componentA.B) -- ComponentA와 ComponentC의 OnBeginPlay중 어떤게 먼저 호출될지 모르므로, 콘솔 창에 ""이 출력될 수 있다.
        }
}

따라서 다른 컴포넌트의 OnBeginPlay에서 컴포넌트 A의 프로퍼티를 참조해야 한다면, 컴포넌트 A에서는 다음과 같이 OnInitialize를 활용해 프로퍼티 값을 설정하는 것이 좋다.

ComponentA{
	Property :
    	[Sync]
  		stirng B = ""
    
    Function :
    	[Server Only]
        void OnInitialize() --바뀐 부분
        {
        	self.B = "Hello"
            log(self.B)
        }
}

ComponentC{
	Property : 
    
    Function :
    	[Server Only]
        void OnBeginPlay()
        {
        	local myEntity = self.Entity
            local componentA = myEntity.componentA
            log(componentA.B) -- ComponentA에서 OnInitialize를 통해 값을 할당했으므로 콘솔 창에 "Hello"가 출력된다..
        }
}

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 창에 HelloMSW를 출력
    if self._T.Time >= 3 then
    	self._T.Time = 0
  		log("HelloMSW")
    end
}

OnEndPlay

끝날 때 처리하는 로직이며, OnDestroy와 함께 엔티티가 제거되는 시점에 1회 호출되는 함수이다.

void OnEndPlay()
{
    log("OnEndPlay!!")
    --console Result
    --OnEndPlay!!
} 

본문 : https://maplestoryworlds-developers.nexon.com/ko

profile
https://li-yo.tistory.com/ 티스토리 블로그 이전 하였습니다.
post-custom-banner

0개의 댓글