Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

김쥬르에 개발일지

메이플스토리 월드 코딩 본문

메이플스토리 월드

메이플스토리 월드 코딩

김쥬르 2023. 12. 30. 08:11

오늘은 기본적인 코딩에 대해서 알아보겠습니다.

 

메이플스토리 월드 코딩을 알기 위해선

프로그래밍 언어인 Lua 와 메이플스토리 월드에서

제공해주는 API Reference를 아는것이 중요합니다.

 

하지만 저는 JAVA 개발자이기에 Lua라는 언어는 처음 접해봤는데요.

그래서 걱정이 많았지만 막상 공부해보니 문법만 다르고

틀 자체는 비슷해서 쉽게 이해할수 있었습니다.

 

API Reference 또한 메이플스토리 월드에서 가이드 라인을

제공해주는 덕분에 쉽게 찾고 이해할수 있었습니다.

 

실습예제를 통해서 자세히 알아보도록하겠습니다.

코딩을 한다는것은 엔티티에 내 입맛대로 특성을 부여한다는 것인데요.

 

플레이어 엔티티를 생성했던 DefaultPlayer에

새로운 컴포넌트를 만들어서 코딩을 통한 특성을 추가 해보겠습니다.

 

Workspace -> DefaultPlayer 오른쪽 마우스 -> Add New Component

그럼 컴포넌트 이름을 지정할수 있는데요

이름은 자유롭게 쓰셔도 됩니다.

저는 MyComponent로 하겠습니다.

 

 

그러면 코드를 작성할수 있는 에디터가 활성화되게됩니다.

그러고 DefaultPlayer에 Property를 보게 되시면

저희가 만든 MyComponent가  추가되었고 또한

Workspace에 MyDesk 하위 파일로 MyComponent가 생성된걸 확인할수 있습니다.

 

본래 코딩이라 하면 대부분을 키보드를 사용하여 작업하지만

메이플스토리 월드는 마우스를 사용하여 작업들을 할수있습니다.

물론 하단에 Plain text를 누르면 키보드를 사용하는 방식으로 변경이 가능하지만

아직 이 Lua라는 언어에 익숙하지 않기에 마우스를 사용하여 실습을 진행해보도록 하겠습니다.

 

Property 는 변수라고 생각하면 되는데요

오른쪽에 + 버튼을 눌러 추가를 할수있습니다.

또한 생성된 변수 오른쪽에 세로 ... (저희는 메뉴라고 부르겠습니다)를 클릭하여 여러가지 기능들을 수행할수있습니다.

 

만약 이 MyComponent라는 컴포넌트가 텔레포트 특성을 가진 컴포넌트로 만들고싶다면

이 컴퍼넌트에는 반드시 어느 정도 거리를 텔레포트 할지에 대한 값이 필요할겁니다.

이런 경우에 값을 어떻게 설정하면 될지 알아보겠습니다.

 

현재 Property 변수를 추가하여 아래 변수가 생성되었습니다.

number 는 값에 자료형을 나타냅니다. (문자 = String , 숫자 = Number)

NewValue1 은 변수에 이름을 나타냅니다.

뒤에 = 0 은 변수에 0이란 값을 넣는다는 얘기입니다.

코딩을 해보신 분이라면 딱 보고 알아채셨겠죠?

 

이름과 값은 클릭하여 타이핑을 통해 수정할수있고

자료형은 number를 클릭해보시면

 

 

여러가지 자료형이 나오며 사용하고싶은 자료형을 선택해서 사용할수 있습니다.

String을 클릭해보겠습니다.

 

그리고 변수명을 name

값을 "김쥬르" 라고 지정하겠습니다.

이렇게 지정된 변수를 출력을 해보도록하겠습니다.

 

출력이라는 것은 어떠한 동작에 해당하기에

함수를 만들어줘야합니다.

Function에서 함수를 만들수 있으며 Function 오른쪽에 +를

눌러 추가할수있습니다. 눌러보시면

만들수 있는 함수 이름이 나오게됩니다.

함수명 설명
OnInitialize 서버가 초기화 되었을때 실행
OnMapEnter 컴포넌트를 가진 엔티티가 맵에 들어왔을때 실행
OnBeginPlay 게임이 처음 실행됐을때 실행
OnUpdate 실시간으로 실행
OnEndPlay 게임이 끝날때 실행
OnMapLeave 맵에서 나갔을때 실행
OnDestroy 컴포넌트를 가진 엔티티가 없어질때 실행

 

OnBeginPlay를 선택하여

게임이 처음 실행됐을때 name 변수가 출력되도록 하겠습니다.

 

변수명만을 가지고 어떤값인지 알수 없으므로

slef 라는 명령어를 사용하여 나 자신 (MyComponent) 안에 name이라는 변수를 선택하겠다 라는 뜻이되겠습니다.

log는 출력을 하기 위한 명령어입니다.

이렇게 설정하면 게임이 처음 실행될때 Mycomponent에서 속한 name 변수에

저장되있는 "김쥬르" 라는 값이 출력될것입니다.

 

실행을 하여 확인해보도록 하겠습니다.

하단에 Console 창에

 

제대로 값이 출력된걸 확인 할수있네요.

 

만약 게임이 실행하고있는 동안 반복적으로 동작을 수행하고싶다면

OnUpdate라는 함수를 사용하면되는데

OnUpdate도 사용을 해보겠습니다.

 

이번에는 DefaultPlayer가 가지고있는 다른 컴포넌트에

값을 받아와 Player엔티티가 움직일때마다 위치를 콘솔에 출력해보도록하겠습니다.

 

플레이어 엔티티에 위치 특성을 가지고있는 컴포넌트는

TransformComponent이고 Position 이라는 변수를 통해 값을 설정하게됩니다.

 

그렇다면 작성을 어떻게해야할까요?

MyComponent를 가지고있는 엔티티를 지정해주고

지정해준 엔티티가 가지고 있는 다른 컴포넌트를 지정해줍니다.

다시 컴포넌트가 가지고 있는 변수 지정해주고 사용하고자 하는 값을 불러오는 형태로 진행됩니다.

 

쉽게 말하면 내가 속한(self) 엔티티(Entity)에 다른 컴포넌트(TransformComponent)에 변수(Postion)의 값(x=위치)

 

이상태로 출력해도 되겠지만 이 값 자체를 변수로 만들어.

MyComponent에 속한 변수가 아닌 지역변수로 만들어 사용해보겠습니다.

 

이제 콘솔창에 출력하기 위해 log 를 작성할텐데요

저희가 위치 값을 가지고 오는 식을 x라는 변수에 담았기 때문에

간편하게 log(x) 로 적으면 되겠습니다.

 

이제 실행을 통해 확인해보도록하겠습니다.

 

가만히 있으면 위치가 동일하기에 중첩되어 351개까지 쌓이는걸 볼수있고

움직이면 움직인 좌표대로 x값이 출력되는걸 확인할수 있었습니다.

 

이번엔 플레이어 엔티티가 아닌 다른 엔티티를 건들여

키보드에 특정키를 눌렀을때 몬스터에 크기가 커지게 만들어보겠습니다.

 

먼저 앞에서 작성한 예제문 앞에 -- 을 붙여 사용하지않게 주석처리를 하겠습니다.

 

아무 몬스터를 Scene으로 끌고와 엔티티를 생성해주고

크기에 관한 내용은 TransformComponent에 Scale에 해당하기에

직접적으로 값을 증가시켜 크기를 키워보겠습니다.

 

크기가 커진걸 확인했으니 다시 x.1 y.1로 수정하고

코드를 입력해보겠습니다.

 

지금까지는 서버를 실행하였을때 , 서버가 실행중일때 에 상태로 동작을 하였다면

이번에는 특정 키를 눌렀을때 , 특정 버튼을 눌렀을때 와 같이 이벤트(사건)이 벌어졌을때

실행되야 하기에 Entity Event Handle에 작성하도록합니다.

 

+를 눌러보면 많은 함수가 나오는데 마우스를 갖다대면 해당 함수에 설명이 나오니

각자 확인해보시면 좋겠습니다.

 

 

저희는 검색창에 key를 검색한후

keyDownEvent를 사용하겠습니다.

local key = event.key 라는 변수가 기본으로 생성이되는데

key 라는 변수명을 가진 변수 안에 동적으로 사용자가 누른 키보드에 값을 저장한다는 뜻입니다.

 

log(key)를 작성하여 확인해보도록 하겠습니다.

실행해주고 아무 키보드 키를 눌러보면

어떤 키가 눌렸는지 콘솔창에 찍히네요.

 

저희는 특정키를 눌렀을때를 감지해야하기 때문에

키보드키 라는 모듈을 사용하여 Z키가 눌렸을때만

로그가 출력이되도록 수정하겠습니다.

앞에서 사용한 log(key)를 삭제하고 콘솔창 우측 상단에 clear를 눌러 콘솔문을 지워주세요.

 

keyboardKey를 사용하고 . 을 붙여 특정키를 지정할수있습니다.

다른 언어들과 마찬가지로 if를 사용하여 조건문을 사용할수있습니다.

if(만약에)key(사용자가 누른 키) 가 KeyboardKey.Z(Z키)와 ==(동일하다)면

log("Z가 눌림")을 실행한다

라고 해석할수있습니다.

 

실행해서 로그를 확인해보겠습니다.

 

Z키를 눌렀을때만 로그가 찍히는게 확인이 되었습니다.

이제 Z키가 눌렸을때 몬스터가 커지는 로직을 만들어야합니다.

 

지금까지는 같은 컴포넌트안에서 변수의 값을 가져오거나

컴포넌트는 다르지만 같은 엔티티에서 다른 컴포넌트의 값을 가져오고 했는데

이번에는 아예 다른 엔티티에서 찾아내야합니다.

 

그러기 위해선 메이플스토리 월드에서 제공하는 EntityService API를 사용해야합니다.

help -> API Reference -> 좌측 카테고리 Service -> EntityService

을 보시게되면

 

Entity와 관련된 기능들을 제공해준다고 합니다.

그중 저희는 GetEntityByPath를 사용할 예정입니다.

해당하는 worldPath의 Entity를 반환한다고 써있는데요.

어떠한 Path에 있는 엔티티를 사용한다라고 생각하면 되겠습니다.

 

Path를 확인하기 위해서는

Hierarchy -> world -> maps -> map01 -> monster-(몬스터 번호) 우클릭 -> copy Entity Path

을 하시면 해당 엔티티에 Path를 복사할수있고

복사된 값을 보면 /maps/map01/monster-5 인걸 보아

Path는 해당 엔티티에 경로라고 해석할수 있겠네요

 

다시 에디터로 돌아와 수정을 하겠습니다.

복사된 값을 path 라는 변수에 저장합니다.

변수는 . 을통해서 값에 접근한다면 함수는 : 을 통해 접근할수있습니다.

이 몬스터 엔티티에 접근하는 식도 monster라는 변수에 저장합니다.

Vector3란 3차원 배열을 뜻하며 Scale에 속성을 나타내고 Scale에 마우스를 갖다대면 확인할수 있습니다.

인자값은 x,y,z를 순서대로 2배가 커져야하기에 2,2,1(사용하지않는값) 를 입력합니다.

 

이제 실행한후 Z를 눌러보겠습니다.

 

 

Z키를 누르면 몬스터가 커지는걸 알수 있는데

뭔가 이상한점이 있습니다.

몬스터가 뒤를 돌면 다시 원래 크기로 돌아오는데요

 

이러한 이유는

 

메이플스토리 월드가 온라인 게임이기 때문에

멀티플레이를 위해서 중앙서버인 서버와 내컴퓨터인 클라이언트로 구분되있습니다.

기능별로 실행되는 위치가 다르게되어있습니다.

몬스터를 다루는것은 주로 서버에서 다뤄지게 되며

내컴퓨터에서 정보전달을 통해 화면에 보이게됩니다.

 

하지만 Z키를 누르는 행위는 클라이언트(내 컴퓨터)에서 다뤄지게됩니다.

즉 Z키를 눌러 커진 몬스터에 크기는 서버로 전달되지 않기에

내 화면에서만 크게 보이는것이죠

 

그후 몬스터가 반대로 돌때 서버에서 다시 클라이언트로 정보 전달을 하기 때문에

다시 크기가 돌아오는것입니다.

 

이 문제를 해결하기 위해선 몬스터 크기가 커지는 함수를 서버에서 실행되도록 바꾸면됩니다.

다시 에디터로 돌아와서 코드를 수정해보겠습니다.

 

먼저 새로운 함수를 만들어야하기에

Function 에 +를 누른후 -> new 를 눌러 아무 기능이 없는 함수를 만들겠습니다.

함수명을 Bigger로 지정해준후 if 문 안에있던

내용들을 Bigger로 가져오고 Bigger 를 식이 있던 자리에

self:Bigger(Bigger는 함수 자체이기에 : 를 붙입니다) 를 사용해줍니다.

이렇게만하면 함수로 묶어주기만 하고 기능은 전과 다를게없습니다.

 

이제 Bigger 함수를 서버에서 실행할수있도록 강제로 설정해줍니다.

Bigger 오른쪽 메뉴 클릭 -> Execution space Setting 을 클릭하면

이러한 창이 나오는데

이 함수가 어디서 시작할지 설정하는 기능이기에

Server를 선택해줍니다. 그러면 함수 위에

서버에서 실행한다 라고 표시를 해주네요.

다시 게임을 실행하여 확인해보면

몬스터에 크기가 작아지지않는걸 확인할수있습니다.

이게 정말 서버에서 실행된건지 확인하기 위해서는

우측 상단에

 

사람 모양을 클릭해줍니다.

 

그럼 가상에 플레이어가 추가가 되어

저의 복제품이 생성되어 김쥬르1 에 케릭터로 플레이할수있게 됩니다.

김쥬르 와 김쥬르1은 별개에 클라이언트에서 실행되었기 때문에

김쥬르1에서도 몬스터가 커진걸 확인하여 서버에서 실행되었음을 알수있습니다.

 

아직 많은 기능이 있지만 이걸 다 말하기에는 너무 많은 기능이 있기에

다른 실전예제들을 해보며 차근차근 알아보도록하겠습니다.

 

다음 포스팅은 이미지 불러오기를 해보겠습니다.

'메이플스토리 월드' 카테고리의 다른 글

메이플스토리 월드 기본구성  (0) 2023.12.27
메이플스토리 월드  (0) 2023.12.25