본문 바로가기

Coding/멋쟁이사자처럼

[멋쟁이사자처럼 X 넥슨] MOD Supporters Hackathon 2주차 회고 (6. 스크립트의 이해)

[7월 15일]

 

[MOD 강좌 Chapter 6] 스크립트의 이해

 

● Script

 

- MOD에서는 대부분의 Lua 문법을 지원하면서 MOD 만의 문법이 결합된 형태를 쓰고 있다.

- 일반적으로 Lua 문법에 몇 가지 기능들이 더 추가된 것이라고 보면 될 것 같다.

- Workspace - MyDesk 하위에 나만의 Script를 만들어서 관리를 하면 된다.

 

 

- Create Component를 가장 보편적으로 사용하고, 종종 Logic을 사용하기도 한다.

- 기능이 단순하고, 지원하지 않는 것들이 많기 때문에 Script는 실제로 사용을 잘 하진 않는다.

 

간단하게 문법에 대해서 다루어 보겠다.

 

log("Hello World")

 

- 실행 결과

 

[Server][MyFirstScript]Hello,World
[Server][MyFirstScript]Hello,World

 

- 위와 같이 두 줄이 출력되는데, 다음 강의인 '네트워크의 이해'를 학습한다면 이해할 수 있겠다.

 

- 변수 : 임의의 값을 담는 공간

local number = 1
log(number)
number = 10
log(number)

 

 

- 실행 결과

 

1
10

 

* log 함수 : 출력을 담당한다.

 

○ 반복문 - for, while

 

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

 

- Script를 Component로 생성하여 몬스터에 해당 Component를 추가하고 게임을 실행했다.

 

- 실행 결과

 

 

- 1부터 10까지 1씩 증가하며 차례대로 증가하는 것을 확인할 수 있었다.

 

local sum = 0
for count = 1, 10, 1 do
	sum = sum + count
	log(count)
end
log(sum)

 

- 실행 결과

 

 

- 1부터 10까지 1씩 증가하며 차례대로 출력되는 것을 확인할 수 있었고, 1부터 10까지의 합인 55가 출력되는 것을 확인할 수 있었다.

 

● Logic

 

- Logic은 한 게임에 하나 밖에 없다.

- Component의 경우에는 Entity에 추가하여 사용해야 하지만, Logic은 어떠한 Entity에 추가할 필요 없이 항상 작동한다.

 

 

* server only : 네트워크 강의에서 학습할 수 있다.

 

- 실행 결과

 

- 아까와 다르게 한 줄만 출력된다. 이 또한 네트워크 강의에서 학습할 수 있다.

- 콘솔 화면을 잘 확인하는 것이 유용하다.

- 디버깅을 할 때 굉장히 유용하게 사용할 수 있다.

 

● Component

 

- Q. Component를 만들어 log를 출력하려 했는데 출력이 안 됐다. 왜 그럴까?

- A. Logic은 월드 상에 하나만 존재하기 때문에 기본적으로 월드 밑에 계속 돌아가고 있는 것이다. 하지만 Component는 이것을 임의의 Entity에 추가해야만 작동한다. Entity 별로 돌아가기 때문에, Entity가 두 개가 된다면, 두 번 출력된다.

 

○ Function : 함수 : 어떠한 기능들을 모아둔 것.

 

- 자주 사용하는 세 개의 함수

 

Function 설명
OnBeginPlay * 컴포넌트가 초기화가 될 때 (처음 시작할 때) 처리하는 로직
OnUpdate * 프레임마다 주기적으로 불리는 함수
여기에 출력함수를 작성한다면 끊임없이 출력되는 것을 확인할 수 있ㅅ다.
OnEndPlay * 끝날 때 처리하는 로직
* (OnDestroy와 함께 엔티티가 제거되는 시점에 1회 호출되는 함수입니다.)
끝날 때 처리할 작업을 넣어주면 된다.

 

- Property 영역에 변수를 선언하면 Property에 변수 값을 조작할 수 있는 칸이 생성된다.

 

 

 

- 자기자신 : self라는 키워드를 쓴다. 점을 찍고 변수를 쓰면 property에 접근하여 값을 변경할 수 있다.

- 변수는 점(.)을 통해서 불러올 수 있고, 함수는 콜론(:)을 통해서 불러올 수 있다.

 

- Script Component 내에서 다른 Entity의 Component에도 접근할 수 있다.

- self.Entity : self는 Entity를 참조하고 있기 때문

 

local myEntityPosition = self.Entity.TransformComponent.Position

 

- myEntityPosition

- 이 component가 속한 Entity에 있는 TransformComponentdml Position이라는 Property의 값을 가져오게 된다.

 - log(myEntityPosition)을 위치 출력 가능.

 

- 조작 또한 할 수 있다.

- wait(1) : 1초간 쉬어라.

 

Function:
	void OnBeginPlay()	:
	{
		local myEntityPosition = self.Entity.TransformComponent.Position
		log(myEntityPosition)
		-- 처음 Entity의 위치 출력

		for count = 1, 3, 1 do
			myEntityPosition.x = myEntityPosition.x + 0.5
			myEntityPosition.x = myEntityPosition.y + 0.5
			wait(1)
		end

		self.Entity.TransformComponent.x = 2
		self.Entity.TransformComponent.y = 2
		-- Entity를 x축으로, y축으로 2배 늘인다.
	}

 

- 실행 결과

 

 

 

 

 

- Entity의 위치를 출력하고, Entity의 크기를 증가시킨 것을 확인할 수 있다.

 

 

회고 : Script.Logic.Component.Funtion.Self에 대해서 확실히 익혀두면 도움이 될 것으로 보인다.

 

*해당 게시글은 Supporters Hackathon 참여자에게 제공되는 MOD 학습 강의와 기본 학습 교안의 내용을 기반으로 작성되었음을 알립니다.