# Punkland 소개

#### "게임을 사랑한다면, 직접 만들어보고 싶은 순간이 분명 있었을 테죠"

펑크랜드는 게임에 대한 열정을 현실로 구현할 기회를 제공합니다. 복잡한 코딩 과정 없이, 당신의 아이디어와 상상력만으로 게임을 만들어 볼 수 있습니다. 내가 직접만든 게임을 다른 유저들과 함께 즐기는 묘미, 게임으로 얻는 수익까지! 펑크랜드에서 당신만의 게임 세계를 펼쳐보세요!

펑크랜드는 '네코랜드'라는 모바일 RPG 개발툴에서 출발하여 현대적인 Web3 기술과 PC, 웹, 모바일 크로스플레이를 통합하여, 다년간의 경험을 바탕으로 세상에서 가장 사용자 친화적인 게임 개발툴&플랫폼으로 진화했습니다.

<figure><img src="/files/BHt1RZa347mlDUbrooqt" alt=""><figcaption></figcaption></figure>

#### "온라인게임 개발의 꿈, 펑크랜드에서 현실로!"

펑크랜드는 복잡한 코딩 과정 없이도 게임 개발의 전 과정을 지원하는 플랫폼입니다. 슈퍼캣의 히트작인 '바람의나라: 연'과 '돌키우기 온라인'에서 얻은 MMORPG 전문 노하우를 바탕으로, 클리커부터 온라인 MMORPG까지 다양한 장르의 게임을 쉽게 만들 수 있습니다. 펑크랜드의 목표는 게임에 관심 있는 누구든지 손쉽게 자신만의 온라인 게임을 창작하는 것입니다.

<figure><img src="/files/awsR1CcMgZ6CGa8xGxOl" alt=""><figcaption></figcaption></figure>

## Punkland의 성과

2018년 첫 발을 내딛은 펑크랜드는 그 후로 꾸준한 성장세를 보여주고 있습니다. 처음에는 게임을 사랑하는 취업 준비생이나 직장인들이 취미로 게임 제작을 시작했지만, 그들의 게임이 주목받으면서 수익이 발생하게 되었습니다. 이로 인해 많은 이들이 펑크랜드 개발자로 전향하기 시작했고, 심지어 일부는 연 1억 이상의 수익을 기록하는 게임 운영자가 되었습니다. 더 놀라운 것은 초, 중학생 개발자들도 펑크랜드를 통해 게임을 제작하고 수익을 창출하며, 미래의 개발자로 성장하고 있다는 사실입니다.

* **TOP10 게임의 성과** : 2022년 기준 연평균 매출 1.1억원
* **누적 매출 기록** : 서비스 시작 5년만에 60억 이상 돌파
* **앱 인기도** : 누적 다운로드 55만회 초과
* **다양한 게임** : 총 10만개 이상의 게임 업로드
* **활발한 개발자 커뮤니티** : 라이브 개발자 4700명 이상

<figure><img src="/files/dLege8zmHGcfInQrv32M" alt=""><figcaption></figcaption></figure>

## Punkland Studio는 무엇인가요?

‘펑크랜드 스튜디오’는 여러분의 게임을 개발하기 위한 툴로 무료이며 누구나 다운로드 받을 수 있습니다. PC에서 펑크랜드 스튜디오 활용해 게임을 제작하고, 이를 펑크랜드 APP, 공식 홈페이지 WEB 혹은 두 플랫폼 모두에서 즐길 수 있는 크로스플레이 게임으로 손쉽게 출시할 수 있습니다.

* 펑크랜드 PC 스튜디오는 현재 윈도우 버전만 지원합니다.
* 펑크랜드 스튜디오 내부에 있는 \[출시] 메뉴에서, 버튼만 누르면 자동으로 게임이 업로드되어 펑크랜드 앱을 통해 서비스 됩니다. 펑크랜드 스튜디오는 최신 .Net framework 를 필요로 합니다. 펑크랜드 스튜디오 실행시 오류가 뜬다면, [**닷넷 프레임워크**](https://www.microsoft.com/ko-kr/download/details.aspx?id=49982)를 설치하신 후 재부팅 해주세요. 보다 자세한 내용은 펑크랜드 [**개발자 위키**](http://developer.nekoland.net/ko/start)를 참고하세요.&#x20;

[**펑크랜드 스튜디오 다운로드 받기 (PC 윈도우 버전)**](https://get.nekoland.net/)


# 업데이트 내역

업데이트 내역을 확인할 수 있습니다.

***

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>스튜디오 업데이트</td><td><a href="/pages/o8tnuDZ183OThWEaYowO#studio-app-v-2.277-v2.312">/pages/o8tnuDZ183OThWEaYowO#studio-app-v-2.277-v2.312</a></td></tr><tr><td>앱 업데이트</td><td><a href="/pages/1eNfO8p4OpPc5YCccKcT#studio-app-v-2.239-v2.275">/pages/1eNfO8p4OpPc5YCccKcT#studio-app-v-2.239-v2.275</a></td></tr><tr><td>서버 업데이트</td><td><a href="/pages/lJuHjukVx8yLd4lHS7pp#2.3.1-23.07.05">/pages/lJuHjukVx8yLd4lHS7pp#2.3.1-23.07.05</a></td></tr></tbody></table>

***


# 스튜디오 업데이트 내역

## **2.456 (26.03.10)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* Utility.GetItemTraits 메소드 추가
  * Utility.GetItemTraits(int gameItemID): 아이템의 특성을 스크립트로 접근할 수 있는 함수
* 기타 수정
  * 펫 공격 버그 수정: 펫이 더 이상 주인을 공격하지 않습니다.
  * 유닛 크기 조절 개선: 유닛 scale 변경 시 다른 유닛에 영향을 주지 않고 해당 유닛만 변경됩니다.

## **2.454 (26.03.05)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* ScriptDynamicUnit 클래스 추가

## **2.446 (26.03.04)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* CustomAnimation 클래스 추가
  * 클라이언트 전용 커스텀 애니메이션 기능이 추가됩니다.
  * Unit 클래스에 ShowCustomAnimation(animationId, pos, shootDir) 메소드가 추가됩니다.
* 우편함 기능 추가
  * 테스트 플레이어(스튜디오)에서도 우편함 기능을 사용할 수 있습니다.
  * ScriptMailBox 클래스 추가
* ScriptMail 클래스 추가
* ScriptRoomPlayer 클래스에 mailbox 프로퍼티 추가
* Server 클래스에 우편 관련 메소드 추가
  * SendMail(playerID, text, item): 플레이어에게 우편을 발송
  * SendMailFrom(playerID, senderID, text, item): 특정 발신자로 우편을 발송
  * GetMails(playerID): 플레이어의 미읽은 우편 목록을 가져옴
  * HasUnreadMail(playerID): 플레이어에게 미읽은 우편이 있는지 확인
* 클랜 기능 개선
  * 테스트 플레이어(스튜디오)에서 클랜 기능을 사용할 수 있도록 개선되었습니다.

## **2.443 (26.02.23)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* Fonts 폴더 추가 및 TextPro 클래스 추가
  * Fonts 폴더에 폰트 파일을 넣고, 스크립트를 통해 폰트가 적용된 텍스트 객체를 생성할 수 있습니다.
* AI 스크립팅 에러 핸들링 개선
  * AI 스크립트에서 발생하는 오류도 에러 로깅이 되도록 개선하였습니다.
* 기타 업데이트
  * ScriptRoomPlayer.GetJoinRequestClanIDs 메소드 추가: 해당 RoomPlayer의 가입 신청한 클랜 ID 리스트를 반환
  * ScriptServer.SetRanking 함수에 type 인자 추가
  * ScriptClan.Kick 함수에 ScriptRoomPlayer 인자를 전달하지 않아도 동작하도록 개선
  * ScriptClient.ShowProfile(bool show, int playerID): 특정 플레이어의 프로필 팝업을 열어서 표시
  * ScriptClient.IsShowProfile(): 프로필창이 열려있는지 확인

## **2.440 (25.11.20)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 스튜디오 - 시스템 인벤토리 최대 크기를 설정 추가
* 메인 화면, 데이터베이스에서 흰색 바탕이 보이지 않도록 개선
* 이벤트가 더욱 잘 보이도록 흰색에서 하늘색으로 변경
* 콘솔 코드 입력기 다크모드가 추가
* 콘솔 코드 입력기의 줄 수가 4자리 이상도 출력되도록 개선
* Game.Scripts.UI 네임스페이스에 SpineSkeleton 클래스 추가
* Game.Scripts.Scripts.Unit 클래스에 UpdateSpineSlot(string slotName, int dataID) 메소드 추가
* Utility 클래스에 GetGameItemOptions(TGameItem titem) 메소드 추가
* TGameItemOption 클래스 추가
* Client.myPlayerUnit 클래스 gameMoeny 프로퍼티 추가
* StartChat 클래스 ShowInput 메소드 추가
* Control.InputField 클래스 onEndEdit 이벤트 추가
* Client 클래스 GetNotification(int type) 메소드 추가
* Server 클래스 isRemote 프로퍼티 추가
* ScriptUnit 클래스 itemCapacity 프로퍼티 추가
* Server 클래스 addItemCallback 콜백이 추가
* ScriptUnit 클래스 AddItem 메소드가 bool 타입 반환

## **2.434 (25.03.07)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* \[데이터베이스] 탭 클릭 밀리는 현상 수정
* 다른 프로젝트 로딩 시 타이틀 갱신 안되는 현상 수정
* \[이벤트커맨드]-\[변수설정]-\[이벤트]-\[타일셋 태그] 적용 안되는 현상 수정

## **2.432 (25.03.05)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 해당 유닛의 이벤트 커맨드를 실행시켜주는Game.Scripts.Unit.RunEventCommmand 함수 추가
* 내부 함수가 노출되는 현상 수정

## **2.426 (25.02.27)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 이벤트커맨드-변수 설정 UI 리뉴얼
  * 변수 범위 설정 제거(이전에 설정한 커맨드는 적용 됩니다.)
  * 최대 변수 4096개로 확장
  * 문자열 변수 설정 커맨드 추가
  * 클랜 변수 설정 기능 추가
* 클랜 관련 기능 추가
  * ScriptServer.createClanCallback: 클랜 생성 콜백
  * ScriptServer.onJoinClan: 클랜 가입시 콜백
  * ScriptServer.onLeaveClan: 클랜 탈퇴시 콜백
  * ScriptServer.CreateClan: 클랜 생성
  * ScriptServer.DestroyClan: 클랜 파괴
  * ScriptClan.GetSubMaster: 부 마스터 Get
  * ScriptClan.SetSubMaster: 부 마스터 Set
  * ScriptClan.GetJoinRequestNames: 가입 신청한 플레이어 이름목록
  * ScriptClan.GetJoinRequestIDs: 가입 신청한 플레이어 아이디 목록
  * ScriptClan.RejectJoinRequest: 가입 신청에서 플레이어 제외
  * ScriptClan.Kick: 클랜 추방
* 클랜 관련 기능 변경
  * ScriptClan.Join(long id, ScriptRoomPlayer player, bool isForced) isForced 파라미터 추가

## **2.423 (25.02.12)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* JSON 파일을 파싱하는 Utility.JSONParseFromFile 함수 추가(.json파일은 Datas폴더 내에 있어야 합니다)
* 유닛을 제거하는 ScriptRoomPlayer.Destroy 함수 추가(클라 접속도 끊김)
* 포그 설정후 맵 이동시 유지되는 현상 수정

## **2.422 (25.02.04)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 플레이어의 유효성을 검사하는ScriptRoomPlayer.IsValid() 함수 추가
* Server.onRemoveItem 작동 안되는 버그 수정
* ScriptUnit.RemoveItem 21억 이상 지울수 있도록 수정
* ScriptUnit.CountItem 21억 이상 카운팅 되도록 수정

## **2.419 (25.01.02)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 다른 게임의 아이템 갯수를가져오는ScriptRoomPlayer.GetOtherGameItemCount(long targetGameId, int targetItemId, int targetItemLevel) 추가
* 업데이트 히스토리 url 변경

## **2.417 (24.12.24)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* Client.paltform에 텔레그램 플랫폼 추가
* Telegram Star를 소모 시킬 수 있는 Client.UseTelegramStar 메소드 추가

## **2.413 (24.12.09)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 영어샘플게임이 추가됩니다. (CatCat Clicker, punkland sample game)
* AI 이미지 생성기(Beta) > 이미지 업로드 기능 추가 및 성능 개선하였습니다.
* \[데이터베이스 > 아이템] AI 자동완성시 아이콘 이미지도 함께 생성이 되도록 했습니다.

## **2.407 (24.12.04)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 다크모드 추가 \[도구]-\[옵션] 에서 색상모드 선택이 가능합니다.

## **2.399 (24.11.07)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 대화창을 관리하는 ChatBox 클래스 추가
* 아이템 포인트 거래 가능 체크박스 제거

## **2.398 (24.10.28)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 아이템 툴팁 비교기능 버그 수정
* \[데이터베이스>시스템] 클랜 최대 인원수 제어 기능 추가

## **2.393 (24.10.17)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 맵 데이터xml, json 내보내기 기능 추가(기존 맵 내보내기 기능에 확장자 선택시 사용 가능)

## **2.385 (24.08.21)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 장착 아이템 툴팁 비교 기능 추가(가로 해상도만 지원)

## **2.382 (24.08.16)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 업로드 실패 메세지 제대로 출력 안되는 현상 수정
* \[데이터베이스 - 시스템] NavMesh 이동 시스템 사용 체크박스추가
* 맵 로딩시, 페이드 이펙트의 유무를 설정하는 Camera.useFadeEffectOnTeleport 추가

## **2.379 (24.08.08)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 랭킹, 클랜랭킹 최대치 200으로 증가

## **2.378 (24.08.07)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 개발자 스크립트 도움말 문자열 수정
* 레이아웃 매니저 사이즈 조정, 툴박스 제거

## **2.377 (24.07.31)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 상점 커맨드 붙혀넣기시 선택된 인덱스에 추가
* 메인폼 네비게이션바 정렬
* 스프라이트 매니저 이미지 시트 사이즈 저장되도록 수정
* 출시 실패 에러 메세지 출력
* 맵 이동 수정시 좌표 저장하도록 수정

## **2.363 (24.05.20)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 데이터베이스 - 시스템 - GUI설정 - 스킬 사용 가능 여부 추가
* 테스트 플레이 콘솔간헐적으로 에러나는 현상 수정

## **2.362 (24.05.13)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* AI 이미지 생성기  Item, Skill 출력 안되는 현상 수정
* Commons.Server.Scripts.ScriptField가 사라질 때 메모리 해제 안되는 현상 수정
* 필드의 유효성을 검사하는 Commons.Server.Scripts.ScriptField.IsValid() 함수 추가.
* 리소스 브라우저 \[설정 복사-설정 붙혀넣기] 추가
* 드랍 아이템 추가창 디자인 변경

## **2.360 (24.03.20)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 이제 아이템의 설명에 {{tag}}로 TItem.tag를 불러올 수 있게 됩니다.
* 레이아웃 매니저의 Control에 visible 기능이 추가 됩니다.
* 상점에서 수량이 1인 아이템은 개수 설정 불가능하게 수정
* Control.Clone시 컴포넌트가 누락되는 현상 수정.

## **2.359 (24.03.11)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 스크립트 실행 시 에러가 나도 throw하지 않도록 수정.
* Camera.ScreenToWorldPoint, Camera.WorldToScreenPoint 해상도 변경 시 대응 안되는 현상 수정
* 구 버전 개발자 센터 url 변경

## **2.356 (24.03.08)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* Game.Scripts.UI.Control 의 Clone함수 사용 시 children이 제대로 복사 안되는 현상 수정.

## **2.351 (24.03.07)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 레이아웃 매니저에서 하위 경로 이미지 선택되지 않는 현상 수정
* Game.Scripts.UI.Control 의 Clone함수 사용 시 name 이 바뀌는 현상 수정
* Game.Scripts.UI.Button 클론 시 컨트롤의 리스너가 누락되는 현상 수정
* Game.Scripts.EventSystems 네임스페이스 추가
* Game.Scripts.EventSystems.PointerEventData 클래스 추가
* 이제 onClick 이벤트의 매개변수가 테이블에서 Game.Scripts.EventSystems.PointerEventData로 변경됩니다.

## **2.347 (24.02.29)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 클라이언트 콜백 함수에서 에러 발생 시 에러 로그가 출력 되지 않는 현상 수정.
* 탑 메뉴 설정에서 에러 발생 시 에러 로그가 출력 되지 않는 현상 수정.
* 스튜디오가 열려 있을 때 .nekox 파일 접근 안되는 현상 수정

## **2.346 (24.02.26)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 독스 업데이트

## **2.345 (24.02.21)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* Game.Scripts.Unit.SetSturn(float time, bool allowUseSkill) 추가
* Commons.Server.Scripts.MakeSturn 적용 안되는 현상 수정

## **2.343 (24.02.16)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* Game.Scripts.Unit.PlayOneShotAction(string name, int delay) 추가.
* 스튜디오 ogg 파일 실행 오류 수정

## **2.340 (24.02.08)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* Client.damageCallback 에서 튜플 리턴이 가능하도록 수정됩니다.

```lua
Client.damageCallback = function(...)
    --
    -- some damage handling
    --
    return tostring(damage), -- damage 
           true, -- critical
           true -- visible
end
```

## **2.338 (24.02.07)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 알림창의 UI 스케일을 설정하는 Client.alertScale { get; set; } 추가
* 다른 맵에 있으면 onChat 이벤트가 호출  안되는 현상 수정
* Server.GetClans 시작 인덱스의 기본 값을 0으로 설정

## **2.337 (24.01.24)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 아이템 툴팁 위치 개선
* 거래 등록된 아이템 툴팁 내 버튼 제거
* 거래창 열렸을때 가방에서 거래불가인 아이템 비활성화 처리
* 상대방이 거래 취소 버튼 눌렀을때 Alert창 열기
* 둘다 아무 아이템도 등록하지 않았을때 거래완료 버튼 안눌러지도록 수정
* 가방에서 탭 선택시 스크롤 최상단으로 이동하도록 수정

## **2.334 (24.01.11)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* ScriptClient.damagaCallback 크리티컬 인자 추가
* 스프라이트 편집기액션 생성 숏컷 추가
* 스프라이트 편집기 최초 오픈시 그리드 전체 스프라이트 정보가 나오도록 수정
* 리소스 탐색기에서 다른 프로젝트 경로에 접속하지 못하도록 수정
* ~~Live 상태 게임의 버전을 0으로 내릴 수 없도록 수정~~

## **2.333 (23.12.06)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 플레이어의 채팅 금지 상태를 확인하는 ScriptRoomPlayer.isChatBanned 프로퍼티 추가
* Server.Chatban 함수notify 파라미터 추가
* Server.Ban 함수 notify 파라미터 추가
* Server.Unban 함수 notify 파라미터 추가

## **2.332 (23.11.22)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 아이템 툴팁창 옵션 타입이 없을때 공백이 생기는 현상 수정
* 타일셋 테두리 벗어 났을 때 클릭 및 드래그 못하도록 수정

## **2.330 (23.11.08)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* ScriptClient.UseCube(int amount, string itemID) 추가
* ScriptServer.playerUseCubeCallback( Func\<ScriptRoomPlayer, int, string, boolean> callback) 추가
* Game.Scripts.Diagnostics 네임스페이스 추가
* Game.Scripts.Diagnostics.StatMonitor 클래스 추가
* \[데이터베이스]-\[시스템]-\[용어] 제대로 표기되지 않던 현상 수정
* 레이아웃매니저 Text 컴포넌트 borderColor 기본값 수정
* 테스트  플레이에서 우편함 작동시 게임이 멈추는 현상 수정.

## **2.327 (23.10.25)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 기본 키 설정 사용 여부를 설정하는 Client.defaultKeySettingsEnabled { get; set; } 추가
* ScriptUnit.MakeSturn 메소드의 스킬 사용 여부를 허용하도록 설정하는 bool allowSkill 파라미터 추가.
* ScriptClan.Join(long id, ScriptRoomPlayer player) 추가
* ScriptClan.Kick(long id) 추가
* ScriptClan.SetClanMaster(long id) 추가
* ScriptClan.SetClanSubmaster(long id) 추가
* ScriptClan.GetMembersName() 추가
* ScriptServer.SetClanRanking(long clanId, long value) 추가
* ScriptServer.GetClans(int start, int count) 추가
* ScriptServer.GetClan(string name) 추가
* ScriptServer.GetClan(long id) 추가
* DropItem 접근 시, 간헐적으로 참조 오류 나는 현상 수정.
* \[이벤트 커맨드] - \[상태 설정] 기능 추가

## **2.325 (23.10.13)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 채팅 타입을 변경하는 <mark style="color:blue;">Game.Scripts.StartChat.SetChatType</mark>(<mark style="color:red;">int</mark> chatTarget, <mark style="color:red;">string</mark> whisperTo, <mark style="color:red;">long</mark> whisperToID) 추가
* 유닛의 HPBar 활성화 여부를 설정하는 <mark style="color:blue;">Game.Scripts.Unit.HPBarVisible</mark> { <mark style="color:green;">get; set;</mark> } 추가
* 스프라이트 액션을 나타내는 <mark style="color:blue;">Game.Scripts.Graphics.SpriteAction</mark> 추가
* <mark style="color:blue;">Game.Scripts.ScriptClient.GetSpriteAction</mark>(<mark style="color:red;">string</mark> path) 추가
* <mark style="color:blue;">Game.Scripts.ScriptClient.GetSpriteActions</mark>() 추가
* <mark style="color:blue;">Commons.Server.Scripts.ScriptUnit.IsStun</mark> { <mark style="color:green;">get;</mark> } 추가
* 플레이어 가방의 아이템을 정리하는<mark style="color:blue;">Commons.Server.Scripts.ScriptRoomPlayer.SortBagItems</mark>(<mark style="color:red;">func</mark><<mark style="color:green;">TItem, TItem, boolean</mark>> callback) 추가
* 새로 들어오는 스턴의 시간이 현재 설정된 시간보다 짧을 경우 스턴이 해제되는 현상 수정.

## **2.323 (23.10.11)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* Game.Scripts.Field.SetFog(string path, int transparency, int speedX, int speedY) 추가
* Game.Scripts.Field.SetPanorama(string path) 추가
* Game.Scripts.Field.DOAmbientLight(Color color, float duration) 추가
* Game.Scripts.Field.DOColor(Color color, float duration) 추가
* Camera.DOColor, Camera.DOShake 버그 수정
* Server.Scripts.ScriptServer.GetMaps() 추가
* \[리소스 관리자] - 이미지 파일 우 클릭시 이미지 uuid 복사하는 기능 추가
* \[스튜디오 도움말] - \[개발자 센터] 버튼 추가

## **2.320 (23.09.27)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* VSCode 익스텐션 파라미터의 기본 값이 존재한다면 표시되도록 변경.
* VSCode 익스텐션 메소드 가변 인자 표시되지  않던 현상 수정.

## **2.318 (23.09.22)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* VSCode 문법 교정 익스텐션 최신화.

## **2.317 (23.09.22)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* network.TItem string 타입의 프로퍼티 tag 추가
* Commons.Server.Scripts.Proxy.TItem 타입 추가
* Utility.TranslateText(string text, Closure callback, string sourceLanguage) 추가
* Client.autotranslateEnabled { get; } 추가
* Game.Scripts.UI.Control.style 내부 개선
* Game.Scripts.UI.Control.style 예외시 에러를 출력하지 않는 현상 수정.

## **2.314 (23.09.15)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* TDropItem ownerUnitID 추가
* Scripts.UI.InputField.Focus() 함수 추가
* Scripts.UI.InputField.isFocused 함수 추가
* Scripts.UI.Button.raycastTarget 추가
* Scripts.UI.Text.raycastTarget 추가
* 테스트 플레이시, 첫번째 플레이창을 끄면 모든 테스트창이 닫히는 현상이 수정됩니다.

## **2.290 (23.08.02)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 스킬에 유도 발사체 기능 추가.
  * myPlayerUnit.UseGuidedProjectileSkill(int, Unit, int, Point, Point, bool)
* 클라이언트가 거래중인지 확인하는 Client.isTrading 프로퍼티 추가.

## **2.289 (23.07.26)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* AI 이미지생성기가 업데이트 되었습니다.
  * 한글 단어, 문장으로 프롬프트를 작성하면 적합한 프롬프트, 네거티브 프롬프트를 완성해줌
  * '고급 설정' 버튼으로 생성된 프롬프트 확인, 수정 가능
  * 생성된 이미지 저장하지 않았을때 알림 추가

## **2.287 (23.07.21)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

**<핫픽스>**

* **\[리소스 관리자]**\
  창이 최소화 되어 열리지 않던 현상이 수정되었습니다.
* **\[이벤트 설정 - 우선 순위]**\
  이벤트 생성 시의 우선순위 기본 값이 조정되었습니다. `-1 → 0`\
  플레이어 유닛과 부자연스럽게 랜더링되던 현상을 수정하였습니다.

## **2.284 (23.07.20)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

**<기능 개선>**

* **\[AI 이미지 생성기]**\
  이미지 생성 시의 스텝이 100으로 제한되었습니다.
* **\[이벤트 생성]**\
  스프라이트 그리기 우선순위를 설정하는 우선순위 기능이 추가되었습니다.
* **\[사운드 설정]**\
  3D 사운드를 설정할때 loop(반복 여부)를 설정하는 기능이 추가되었습니다.
* **\[애니메이션 설정]**\
  커맨드 속성에 데미지를 주는지 여부를 설정하는 기능이 추가되었습니다.

## **2.279 (23.07.05)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

* 오디오 설정 기능이 개선되었습니다.
  * 입체 효과를 설정할 수 있는 기능이 추가되었습니다.
  * 최대 거리 기능을 설정 할 수 있는 기능이추가되었습니다.
* AI 이미지 생성 도구가 개선되었습니다.
  * 원하지 않는 내용을 `Negative Prompt`에 입력하여 제외 시킬  수 있습니다.
* 새로운 이동 시스템 기능이 개선되었습니다.
  * 360도 방향으로 이동할 수 있는 기능이 추가되었습니다.\
    `> 데이터베이스 - 시스템 - 컨트롤 설정 - 썸스틱 선택`
  * 마우스로 클릭한 좌표로 캐릭터를 이동 시킬 수 있는 기능이 추가되었습니다.\
    `> 데이터베이스 - 시스템 - 마우스 클릭 이동 시스템 사용 체크`
* 체인지 슬롯에 단축키를 설정할 수 있는 기능이 추가 되었습니다.
* 이벤트 유닛의 스프라이트 우선순위를 지정하는 기능이 추가 되었습니다.

## **2.277 (23.06.21)** <a href="#studio-app-v-2.277-v2.312" id="studio-app-v-2.277-v2.312"></a>

> AI 이미지 생성 도구가 추가 되었습니다.\
> 카테고리와 프롬프트를 입력하여 원하는 이미지를 출력할 수 있습니다.

* **카테고리 (Category)**\
  Item, Skill, Portrait
* **프롬프트 (Prompt)**\
  다양하게 입력 가능 (NSFW 등 유해 카테고리 입력 불가)

## 2.275 (23.06.07)

**<기능 개선>**

* 도구 - 데이터 내보내기 기능에 충돌 영역(이동불가지역) 이미지를 내보내는 기능이 추가되었습니다.

**<버그 픽스>**

* 이미지를 선택할 때, 해당 그리드 값이 스프라이트 관리자에서 설정된 값에 따라\
  로드되도록 수정되었습니다.
* 리소스 매니저의 파일 확장자명이 대문자 형식일 때 인식이 되지 않던 현상이 수정되었습니다.
* 버프의 특성 스텟이 적용되지 않던 현상이 수정되었습니다.

## 2.269 (23.05.24)

* 스튜디오가 로드될 때 사이즈가 0, 0으로 설정되어 보이지 않던 현상이 수정되었습니다.

## 2.263 (23.05.10)

* 테스트 플레이 실행시 마다 자동으로 리소스가 최신화 되도록 수정되었습니다.
* 맵에서의 오토타일의 통행불가 표시가 제대로 되지 않던 현상이 수정되었습니다.
* 게임 출시 시 스크립트 변경 사항이 적용되지 않는 현상이 수정되었습니다.

## 2.256 (23.04.26)

**<기능 개선>**

* 성인 게임을 출시하는 기능이 추가 되었습니다. <mark style="color:yellow;">**(출시 시 최초 1회의 성인 인증이 필요합니다!)**</mark>

**<버그 픽스>**

* 레이아웃 매니저에서 설정 해상도가 타이틀에 표시되도록 수정되었습니다.
* 레이아웃 매니저에서 컨트롤의 퍼센트 사이즈가 커스텀 해상도에서도 적용되도록 수정되었습니다.

## 2.251 (23.04.12)

**<기능 개선>**

* **\[선택지]**

  선택지 최대 갯수가 `4 → 10` 으로 증가 되었습니다.\
  표시 형태를 설정할 수 있는 옵션이 추가되었습니다.
* **\[날씨 설정]**\
  날씨의 이미지, 크기, 속도 및 각도 설정을 할 수 있는 옵션이 추가되었습니다.
* **\[레이아웃 관리자]**\
  퀵슬롯 아이콘의 기본 이미지 속성이 추가되었습니다.<br>

**<버그 픽스>**

* 빈(내용 없는) lua 파일이 존재 시 게임 출시가 되지 않던 현상이 수정됩니다.
* \[날씨 설정]\
  강도(세기) 설정이 적용되지 않던 현상이 수정됩니다.\
  기본 UI보다 위에 출력 되던 현상, 부자연스럽게(화면 일부에만 노출되는 현상) \
  출력 되던 현상이 수정됩니다.
* \[레이아웃 관리자]\
  폼을 종료할 때 저장이 되지 않던 현상이 수정됩니다.\
  탑 메뉴 4개 Active 속성이 적용되지 않던 현상이 수정됩니다.

## 2.248(23.03.29)

* 스튜디오 폼 세팅(폼 크기, 위치)을 저장하는 기능이 추가되었습니다.\
  `> 스튜디오를 종료할 때 해당 정보가 저장됩니다.`
* **\[아이템 선택]**\
  아이템 리스트를 조건식(서버스크립트)으로 필터링 할 수 있는 기능이 추가되었습니다.

## 2.244(23.03.15)

* 리소스 관리자가 새롭게 리뉴얼 되었습니다. 윈도우 탐색기 형태로 변경되었습니다.
* 스튜디오에서 게임을 출시 시 이름을 설정할 때 줄 바꿈이 되지 않도록 수정되었습니다.
* 스튜디오에서 테스트 플레이가 실행 되지 않던 현상을 수정하였습니다.

## 2.239(23.02.28)

**<버그 픽스>**

* 이벤트 매니저 아이템 셀 속성 누락 현상이 수정되었습니다.
* `스프라이트 관리자`에서 동일한 액션 클릭 시 갱신되지 않는 현상을 수정하였습니다.
* `스프라이트 관리자`에서 RangeException, OverflowException 오류가 나타나는 현상을 수정하였습니다.
* `스프라이트 관리자`에서 셀이 하나만 남았을 때 Delete로 삭제하면 나타나는 오류 현상을 수정하였습니다.
* `맵 타일창`에 커서 타일셋 크기 이상으로 벗어 나지 않도록 수정하였습니다.
* 맵의 실제 이미지보타 더 많이 스크롤이 되는 현상을 수정하였습니다.
* `데이터베이스 창`에서 플랫포머 모드를 선택할 시 선택 버그가 생기는 현상을 수정하였습니다.


# 앱 업데이트 내역

## &#x20;<a href="#studio-app-v-2.239-v2.275" id="studio-app-v-2.239-v2.275"></a>

## 2.374 (24.02.07) <a href="#studio-app-v-2.239-v2.275" id="studio-app-v-2.239-v2.275"></a>

* 게임 리스트 팝업 중복으로 호출되는 현상 수정
* 로비, 캐시상점 스크롤 버그 수정
* 아이템 툴팁 가시성 개선
* 가방 및 교환창 사용성 개선

## 2.368 (24.01.11) <a href="#studio-app-v-2.239-v2.275" id="studio-app-v-2.239-v2.275"></a>

* 로비 화면 팝업들의 애니메이션 변경.
* 32번 이후 커스텀 스탯 이름이 StringValue\_Custom{n} 으로 표기되는 문제 수정
* 캐릭터 창 하단 버튼 문제 수정

## 2.342 (**23.09.15)** <a href="#studio-app-v-2.239-v2.275" id="studio-app-v-2.239-v2.275"></a>

* 이제 어플리케이션에서 [AI 자동번역 기능](https://cafe.naver.com/nekolandgames/26635)이 추가됩니다.
* 이제 게임 리스트의 기준 언어가 모든 언어로 재설정 됩니다.
* 내가 만든 게임리스트의 기준이 역순으로 재정렬 됩니다.
* 거래시 확인 UX가 좀 더 원활하게 수정됩니다.
* 거래 완료 후 간헐적으로 거래실패 되었다고 출력되는 메세지가 수정됩니다.
* 거래 아이템 확정 상태에서 아이템을 더 올리지 못하도록 수정됩니다.
* ScreenUI.gameMoney 프로퍼티가 세로모드에서 적용되지 않던 현상이 수정됩니다.<br>
* \[WebGL] 소리가 나오지 않던 현상이 수정됩니다.
* \[WebGL] InputField에 한글 및 특수기호가 입력되지 않던 현상이 수정됩니다.
* \[WebGL] 스크립트 파일에서 대문자 확장자가 인식되지 않던 현상이 수정됩니다.

## 2.331 (**23.08.02)** <a href="#studio-app-v-2.239-v2.275" id="studio-app-v-2.239-v2.275"></a>

* **창고 및 아이템 툴팁 열어도 이동이 멈추지 않도록 변경.**
* 로비씬 타겟 프레임 고정 해제
* 개발자 지원센터 url 깃북으로 변경

## 2.329 (**23.07.20)** <a href="#studio-app-v-2.239-v2.275" id="studio-app-v-2.239-v2.275"></a>

**<기능 개선>**

* **MyPlayerUnit.SetSturn(float time)**
* **MyPlayerUnit.SetKnockback(Point distance, float time)**\
  플레이어 유닛을 스턴/넉백 시키는 메소드가 추가되었습니다.

**<버그 픽스>**

* \[스프라이트 매니저]에서 설정된 loop, pivotY 값이 정상적으로 적용되도록 수정되었습니다.&#x20;
* 프로젝트를 열었을 때 메인 창이 뜨지 않고 최소화되던 현상이 수정되었습니다.&#x20;

## **2.323 (23.07.05)** <a href="#studio-app-v-2.239-v2.275" id="studio-app-v-2.239-v2.275"></a>

* **int ScriptSlider.direction**\
  `0: 왼쪽에서 오른쪽`\
  `1: 오른쪽에서 왼쪽`\
  `2: 아래쪽에서 위쪽`\
  `3: 위쪽에서 아래쪽`\
  슬라이더의 방향을 설정하는 프로퍼티가 추가되었습니다.
* **int ScriptUnit.collisionWidth**\
  유닛 충돌 가로 크기를 설정하는 프로퍼티가 추가되었습니다.
* **int ScriptUnit.collisionHeight**\
  유닛 충돌 세로 크기를 설정하는 프로퍼티가 추가되었습니다.
* **bool Client.useAttachAudioToMyPlayer**\
  `오디오 리스너를 MyPlayerUnit에 연결(true)/해제(false)`\
  오디오 리스너를 MyPlayerUnit에 연결할지 여부를 설정하는 프로퍼티가 추가되었습니다.
* **Client.onStartMoveWithIUserInput(bool mouseClicked)**\
  `[1] mouseClicked: 마우스 클릭으로 이동했는지 여부`\
  플레이어의 마지막 이동이 유저의 입력에 의해 시작되었을 때 호출되는 이벤트가 추가되었습니다.
* **Camera.ScreenToWorldPoint(float x, float y)** \
  `[1] x: x좌표`\
  `[2] y: y좌표`\
  카메라의 좌표 기준을 화면(Screen)에서 월드(World)로 변환하는 함수가 추가되었습니다.
* *<mark style="color:red;">**(Client.onUnitclicked 이벤트 삭제)**</mark>*\
  **Client.unitClickCallback(Point pt, ScriptUnit\[] clickedUnits)** \
  `[1] pt: 클릭한 좌표`\
  `[2] clickedUnits: 클릭한 유닛들`\
  유닛을 클릭할 때 발동되는 콜백이 추가 되었습니다.

## 2.277

* **ScriptClient.onDragPointerEvent(string event, int itemID)**\
  `[1] event: 이벤트`\
  `[2] unit: 아이템 데이터ID`\
  드래그 아이템 포인터 이벤트가 추가되었습니다.
* **ScriptClient.onUnitDead(scriptUnit unit)**\
  `[1] unit: 해당 유닛`\
  유닛이 죽을 때 호출되는 이벤트가 추가되었습니다.
* **ScriptClient.damageCallback(scriptUnit target, long damage, int skillDataID, scriptUnit from)**\
  `[1] target: 공격당한 유닛`\
  `[2] damage: 데미지`\
  `[3] skillDataID: 해당 유닛`\
  `[4] from: 공격한 유닛`\
  damageCallback에 공격한 유닛의 정보가 추가되었습니다.
* **ScriptClient.onUnitClicked(scriptUnit unit)**\
  `[1] unit: 해당 유닛`\
  모든 유닛을 클릭할 때 발생하는 이벤트가 추가되었습니다.
* **ScriptClient.onFieldJoined()**\
  새로운 필드에 들어갔을 때 발동되는 콜백이 추가되었습니다.
* **ScriptClient.onUnitCreated(scriptUnit unit)**\
  `[1] unit: 해당 유닛`\
  유닛이 생성되었을 때 호출되는 이벤트가 추가되었습니다.
* **ScriptClient.onUnitDestroyed(scriptUnit unit)**\
  `[1] unit: 해당 유닛`\
  유닛이 삭제되었을 때 호출되는 이벤트가 추가되었습니다.

## **2.275** <a href="#studio-app-v-2.239-v2.275" id="studio-app-v-2.239-v2.275"></a>

**<기능 개선>**

* **bool StartChat.isChatInputEnabled**\
  채팅 입력 창의 활성 상태를 알려주는 프로퍼티가 추가되었습니다.
* **Control.masked**\
  Control에 masked 프로퍼티가 추가되었습니다.
* **ScriptUnit.ShowAnimation(int animationID, Point position, Point direction)**\
  `[1] animation: 재생할 애니메이션의 ID (번호)`\
  `[2] position: 애니메이션을 재생할 위치`\
  `[3] direction: 애니메이션을 재생할 방향`\
  애니메이션을 재생하는 메소드가 추가되었습니다.
* **ScriptUnit.StopAnimation(int animationID)**\
  `[1] animation: 종료할 애니메이션의 ID (번호)`\
  애니메이션을 종료하는 메소드가 추가되었습니다.

**<버그 픽스>**

* 상단의 메뉴가 이미지 누락 시에 기본 이미지가 아닌, 흰 이미지로 표시되던 현상이 수정됩니다.
* 광고 기능이 정상적으로 동작하지 않던 문제가 수정되었습니다.

## 2.270

**<기능 개선>**

* **ScriptClient.onJoinDropItem**에 즉시 드랍되었는지 확인하는 파라미터가 추가되었습니다.
* 채팅 대상에 따른 색상 분류가 세분화 되었습니다.

> 전체, 근처 : 흰색 (운영자 : 하늘색)\
> 파티 : 노란색\
> 클랜 : 연두색\
> 귓속말 : 연분홍색

#### **<버그 픽스>** <a href="#less-than-greater-than.1" id="less-than-greater-than.1"></a>

* "/script" 키워드를 입력할 때, 메시지의 제한 없이 자유롭게 입력할 수 있도록 수정되었습니다.
* 게임 상세 필터에 좀 더 세분화된 장르가 노출 되도록 수정되었습니다.

## 2.266

**<기능 개선>**

* **MyPlayerUnit**이 생성될때 호출되는 **onMyPlayerUnitCreated** 콜백이 추가되었습니다.
* **ScriptClient**에 드랍 아이템이 사라질 때 호출되는 **onLeaveDropItem** 콜백이 추가되었습니다.
* **DropItem**에 스케일을 설정하는 **SetScale** 메소드가 추가되었습니다.
* **DropItem**에 아이템의 습득 신호를 전송하는 **Acquire** 메소드가 추가되었습니다.

**<버그 픽스>**

* **UseSkill** 메소드가 제대로 작동되지 않는 현상을 수정하였습니다.
* **Control**의 **ShowOnTop** 프로퍼티가 적용되지 않는 현상이 수정되었습니다.
* 창고, 대사 팝업이 동시에 열리지 않도록 수정되었습니다.

## 2.263

**<기능 개선>**

* **UI.Panel** 에 **raycastTarget** 프로퍼티가 추가되었습니다.

**<버그 픽스>**

* 게임 업데이트 및 설치 시 로딩 진행상황이 정상적으로 반영되도록 수정되었습니다.

## 2.256

**<기능 개선>**

* 스탯 모니터링 기능이 추가 되었습니다.

**<버그 픽스>**

* **Client.onChat**에 귓속말, 클랜 채팅의 경우도 **Chat** 정보를 받아올 수 있도록 수정되었습니다.
* **Client.onChat**에 **visible** 프로퍼티가 **Set**이 가능하도록 수정되었습니다.

## 2.251

* 프로필에서 경험치(EXP) 정보가 표시되지 않는 현상이 수정됩니다.

## 2.248

* 관심 게임, 게임 목록 뷰 상단에 있는 배너가 삭제되었습니다.

## 2.244

**<기능 개선>**

* UI.Button에 sliceBorder, horizontalOverflow, verticalOverflow 프로퍼티가 추가되었습니다.
* 펑크랜드 앱 인트로 화면에 사운드가 추가되었습니다.

**<버그 픽스>**

* 로비의 계정 내 내 설정에서 '펑크랜드란?' 버튼 주소가 정상적으로 접근이 되도록 수정되었습니다.
* 게임 실행 시 나오는 로딩 UI의 게이지 바가 정상적으로 연출이 되도록 수정되었습니다.
* Client.RequestTrade에서 유저를 참조하지 못하는 현상을 수정하였습니다.

## 2.239

**<기능 개선>**

* UI.Button에 imageType, lineSpacing, fontStyle 프로퍼티가 추가되었습니다.
* UI.Image에 color 프로퍼티가 추가되었습니다.
* Client.MyPlayerUnit에 큐브 보유량을 보여주는 cashMoney 프로퍼티가 추가되었습니다.

**<버그 픽스>**

* 앱 회원 가입 또는 이메일 변경 시 정해진 도메인만 형식으로 설정 가능하도록 수정되었습니다.


# 서버 업데이트 내역

## 2.4.2 (23.09.15)

* 큐레이션/피처드 게임 조회 시 유저 UI 언어 적용되도록 수정
* 웹게임서버 비정상 종료되는 문제 수정

## 2.3.4 (23.07.20)

* **Unit.MakeKnockbackWithDir(float distance, float time float dirX, float dirY)**

  해당 유닛을 지정한 방향으로 넉백시키는 메소드가 추가되었습니다.

## 2.3.1 (23.07.05)

* **ScriptServer.onAddField(scriptField field)**\
  `[1] field: 해당 필드`\
  필드가 추가되었을 때 호출되는 이벤트가 추가되었습니다.
* **ScriptServer.onRemoveField(scriptField field)**\
  `[1] field: 해당 필드`\
  필드가 삭제되었을 때 호출되는 이벤트가 추가되었습니다.
* **ScriptServer.calculateStatsCallback(ScriptUnit unit, float\[] stats)**\
  `[1] unit: 해당 유닛`\
  `[2] stats: 스탯 리스트`\
  유닛의 스텟이 계산 될 때 발생하는 콜백이 추가되었습니다.

## 2.2.3

* **ScriptUnit.SetJob**\
  장착 아이템 유지 여부를 설정하는 파라미터가 추가되었습니다.

## 2.1.3

* **bool ScriptRoomPlayer.isGuest**\
  해당 플레이어가 게스트 계정인지 확인할 수 있는 프로퍼티가 추가되었습니다.

## 1.0.14

* **Server.sayCallback**\
  채팅 타입, 대상 ID 파라미터가 추가 되었습니다.


# 업데이트 아카이브

#### **v 2.238** <a href="#v-2.238" id="v-2.238"></a>

#### <클라이언트> <a href="#less-than-greater-than.1" id="less-than-greater-than.1"></a>

* UI.Button에 imageType, lineSpacing, fontStyle 프로퍼티가 추가되었습니다.
* UI.Image에 color 프로퍼티가 추가되었습니다.
* Client.MyPlayerUnit에 큐브 보유량을 보여주는 cashMoney 프로퍼티가 추가되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.4" id="less-than-greater-than.4"></a>

* 이벤트 매니저 아이템 셀 속성 누락 현상이 수정되었습니다.
* 스프라이트 창에서 동일한 액션 클릭 시 갱신되지 않는 현상을 수정하였습니다.
* 스프라이트 창에서 RangeException, OverflowException 오류가 나타나는 현상을 수정하였습니다.
* 스프라이트 매니저에서 셀이 하나만 남았을 때 Delete로 삭제하면 나타나는 오류 현상을 수정하였습니다.
* 맵 타일창에 커서 타일셋 크기 이상으로 벗어 나지 않도록 수정하였습니다.
* 맵의 실제 이미지보타 더 많이 스크롤이 되는 현상을 수정하였습니다.
* 데이터베이스 창에서 플랫포머 모드를 선택할 시 선택 버그가 생기는 현상을 수정하였습니다.
* 탑 메뉴 (커스텀 메뉴 포함) 이미지 스프라이트가 누락 시에 흰색 형태로 표시되는 현상을 수정하였습니다.
* 앱 회원 가입 또는 이메일 변경 시 정해진 도메인만 형식으로 설정 가능하도록 수정되었습니다.

***

#### **v 2.237** <a href="#v-2.237" id="v-2.237"></a>

#### <스튜디오> <a href="#less-than-greater-than.3" id="less-than-greater-than.3"></a>

* 이미지 설정 다이얼로그(이벤트 이미지 설정 시 나오는 폼)에 검색하는 기능이 추가되었습니다.

#### <클라이언트> <a href="#less-than-greater-than.2" id="less-than-greater-than.2"></a>

* UI.Image의 스프라이트 테두리값을 조절하는 sliceBorder 프로퍼티가 추가되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local a = Image("Pictures/supercat.png", Rect(0,0,50,50))
a.sliceBorder = RectOff(20,20,20,20) -- 상하 좌우 테두리 20 설정
```

{% endcode %}

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.5" id="less-than-greater-than.5"></a>

* Universal 형식 게임이 리스트에 표시되지 않던 현상이 수정되었습니다.
* IOS 경우 다운로드 후 첫 접속 시 나오는 게임 실행 화면이 세로 모드로 출력되도록 수정되었습니다.
* 게임 업로드 실패 시 해당 사유가 알림 창에 표시되도록 수정되었습니다.
* 타겟팅 스킬 시전 시에 표시되는 타겟팅 마크가 스케일이 적용되지 않던 현상이 수정되었습니다.
* 프로필 팝업이 중복으로 호출되는 현상이 수정되었습니다.

***

#### **v 2.236** <a href="#v-2.236" id="v-2.236"></a>

#### <스튜디오> <a href="#less-than-greater-than.4" id="less-than-greater-than.4"></a>

* 다중 플랫폼을 지원하는 Universal 모드가 추가되었습니다.

#### <클라이언트> <a href="#less-than-greater-than.3" id="less-than-greater-than.3"></a>

* Input 에 마우스 스크롤의 위치를 확인하는 MouseScrollPosition 프로퍼티가 추가 되었습니다.
* Button 에 패스로 이미지의 스프라이트를 지정할 수 있는 SetSpriteByPath 메소드가 추가되었습니다.
* Button, Image, Text 에 Rect만을 인자로 하는 생성자가 추가되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.6" id="less-than-greater-than.6"></a>

* 레이아웃 매니저에서 골드패널, 파티패널의 텍스트 크기, 정렬 기능이 적용되도록 수정되었습니다.
* myPlayerUnit.UseSkill을 사용 시에도 사용 타입(일반, 타겟 지정, 끌어서 사용)을 확인하도록 수정되었습니다.
* 스프라이트 매니저의 이름 오프셋 스케일 부분에서 소수점 단위가 기입이 되도록 수정되었습니다.
* \[몬스터 소환] 이벤트에서 소환할 마릿수가 기본값 0으로 지정되던 현상을 수정하였습니다.
* 탑메뉴 메니저에서 기본 아이콘도 이미지가 변경이 가능하도록 수정되었습니다.
* 레이아웃 매니저에서 프로퍼티 입력 값이 정상적으로 입력되도록 수정되었습니다.
* **이제 \[오픈 베타] 이상 버전부터는 아이콘, 대표 이미지를 설정해야 출시가 가능해지도록 수정되었습니다.**

***

#### **v 2.235**  <버그픽스 및 수정사항> <a href="#v-2.235-hardbreak-hardbreak-less-than-greater-than" id="v-2.235-hardbreak-hardbreak-less-than-greater-than"></a>

* 스프라이트 매니저 - 액션 추가 및 복사/붙여넣기 실행 시 해당 액션을 선택하도록 수정되었습니다.
* 스프라이트 매니저 - 빈 액션도 추가 및 복사/붙여넣기가 가능하도록 수정되었습니다.

***

#### **v 2.234**  <스튜디오> <a href="#v-2.234-hardbreak-hardbreak-less-than-greater-than" id="v-2.234-hardbreak-hardbreak-less-than-greater-than"></a>

* \[몬스터 소환] 이벤트에 **소환할 마릿수**를 조절하는 기능이 추가되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.7" id="less-than-greater-than.7"></a>

* 스프라이트 매니저 - 그리드 선택 시 벗어난 범위도 프레임에 추가되는 현상이 수정되었습니다.
* 스프라이트 매니저 - 자동완성 이후에 스프라이트 창이 선택되도록 수정하였습니다.
* 스프라이트 매니저 - 액션 삭제 시 발생하는 오류를 수정하였습니다.

***

#### **v 2.232**  <스튜디오> <a href="#v-2.232-hardbreak-hardbreak-less-than-greater-than" id="v-2.232-hardbreak-hardbreak-less-than-greater-than"></a>

> **레이아웃 매니저가 개선되었습니다.**

* 디자인 및 폼 배치 형태를 개선하였습니다.
* 버튼 형태의 기능들을 중앙 상단에 아이콘으로 통합 수정하였습니다.

> **스프라이트 매니저가 개선되었습니다.**

* 디자인 및 폼 배치 형태를 개선하였습니다.
* 액션 별로 스케일 및 반전을 설정할 수 있는 기능이 추가되었습니다.
* 속성에 관련된 부분들을 우측 하단 속성 창으로 통합하였습니다.
* 속성은 분류된 각 부분을 탭하여 활성화 시킬 수 있습니다. (리소스 / 액션 / 액션 별 프레임)
* 우측 상단 미리보기 뷰의 상단에 있는 아이콘을 클릭하여 미리보기 재생, 반복 재생, 충돌 표시, 주변광 표시 상태를 조작 할 수 있습니다.
* 액션을 조작하는 로직이 개선되었습니다.
* 마우스 우클릭 후 메뉴 컨트롤에서 추가, 삭제(Delete), 복사(Ctrl+C), 붙여넣기(Ctrl+V)

***

#### **v 2.231**  <버그픽스 및 수정사항> <a href="#v-2.231-hardbreak-hardbreak-less-than-greater-than" id="v-2.231-hardbreak-hardbreak-less-than-greater-than"></a>

* 채팅창 크기가 적용되지 않던 현상을 수정하였습니다.

***

#### v 2.230  <스튜디오> <a href="#v-2.230-hardbreak-hardbreak-less-than-greater-than" id="v-2.230-hardbreak-hardbreak-less-than-greater-than"></a>

> **레이아웃 매니저가 개선되었습니다.**

* \[레이아웃] - \[퀵슬롯] 컨트롤 속성에서 인게임에서 상호작용될 단축키를 설정할 수 있습니다.
* 컨트롤 생성 버튼들의 디자인이 개선되었습니다.
* \[텍스트] 컨트롤의 속성에 외곽선 여부, 색상 설정이 추가 되었습니다.
* 레이아웃 작업내역 저장, 초기화 버튼이 추가되었습니다.

> **맵 편집 기능이 개선 되었습니다.**

* 시작 위치를 드래그로 이동 할 수 있는 기능이 추가 되었습니다.
* 펜 브러쉬 편집 실행 되돌리기, 취소 분기가 마우스가 다운에서 업된 시점으로 변경됩니다.

#### <서버> <a href="#less-than-greater-than" id="less-than-greater-than"></a>

* unit.dropItem에서 드랍 불가 아이템도 드랍시킬 수 있는 forced 옵션이 추가되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.8" id="less-than-greater-than.8"></a>

* 맵 편집에서 선택 모드일 때 이벤트 레이어를 눌러도 적용되는 현상이 수정됩니다.

***

#### v 2.229  <스튜디오> <a href="#v-2.229-hardbreak-hardbreak-less-than-greater-than" id="v-2.229-hardbreak-hardbreak-less-than-greater-than"></a>

> **이벤트 커맨드 기능이 개선되었습니다.**

* \[상점 표시] 이벤트 커맨드 레이아웃이 리뉴얼 되었습니다.

> **맵 편집 기능이 개선 되었습니다.**

* Ctrl 키 + 마우스 휠을 조정 위아래로 조작하여 맵 화면을 확대/축소 하는 기능이 추가되었습니다.
  * (0.25 - 8 배율)
* Shift 키 + 마우스 드래그를 이용하여 맵 화면을 이동하는 기능이 추가되었습니다.
* 스튜디오 하단 우측부에 맵 화면 스케일 퍼센트가 표시됩니다.
* 잘라내기 기능 작업에도 Undo(실행 취소), Redo(다시 실행)되는 기능이 추가되었습니다.

> **스프라이트 설정 기능이 개선되었습니다.**

* 미리보기 탭에서 설정한 셀 배열에 맞게 스프라이트 셀 번호가 표시됩니다.

#### <서버> <a href="#less-than-greater-than.1" id="less-than-greater-than.1"></a>

* 서버 스크립트에도 require 함수가 추가되었습니다.
  * 이제 서버스크립트 에서도 폴더링이 가능합니다.
* 서버 스크립트 nameSpace 정리 (Lua, Graphics)

#### <클라이언트> <a href="#less-than-greater-than.4" id="less-than-greater-than.4"></a>

* Client.damageCallback 리턴 값을 문자열 형식으로 출력 가능하게 수정되었습니다.
  * (ex. return dmg..”데미지”)
* 가방의 아이템을 TItem 형식으로 가져오는 Client.GetItems 메소드가 추가되었습니다.
* 숫자 입력 팝업 ui가 수정되었습니다.
* 랭킹 팝업 ui 가 수정되었습니다.
* Image 클래스에 레이캐스트 타겟 여부를 설정하는 raycastTarget 프로퍼티가 추가되었습니다.
* Client 클래스에 현재 기기의 플랫폼 이름을 가져오는 platform 프로퍼티가 추가되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.9" id="less-than-greater-than.9"></a>

* 레이아웃 설정에 따른 채팅창의 크기가 적용되지 않던 현상이 수정되었습니다.
* 애니메이션이 회전 각도 설정에 따라 각도가 정상적으로 출력되도록 변경됩니다.

***

#### v 2.225  <스튜디오> <a href="#v-2.225-hardbreak-hardbreak-less-than-greater-than" id="v-2.225-hardbreak-hardbreak-less-than-greater-than"></a>

* \[상점 표시] 이벤트 커맨드에 구매/판매 표시 및 아이템 재화로 구매 가능한 리스트가 추가되었습니다.
* 애니메이션이 회전 각도에 맞춰서 각도 전환이 되도록 수정되었습니다.
* UI가 리뉴얼 되었습니다.
* \[시스템] → \[GUI 설정]에 버프 남은시간, 툴팁 아이템 판매가격 표시 여부 설정 옵션이 추가되었습니다.
* 채팅창을 on/off 할 수 있는 토글 기능이 추가되었습니다.

#### <서버> <a href="#less-than-greater-than.2" id="less-than-greater-than.2"></a>

* TItem에 Exp 프로퍼티가 추가되었습니다.
* onAddItem(unit, item, itemCount) 매개변수로 아이템 얻은 갯수가 추가되었습니다.
* 몬스터 스탯이 새로고침 될때 호출되는 onRefreshMonsterStats(monsterUnit) 이 추가되었습니다.
* 드랍 아이템 획득 가능한지 체크하는 acquireCallback(unit, dropItem) 이 추가되었습니다.

#### <클라이언트> <a href="#less-than-greater-than.5" id="less-than-greater-than.5"></a>

* AttachToUnit 오버로드 추가 AttachToUnit(int unitID) / AttachToUnit(Unit unit)
* BaseControl에 name 프로퍼티 추가
* ShowCenterLabel 오버로드 추가 ShowCenterLabel(string) / ShowCenterLabel(string, color)
* 데미지가 발생할 때 호출되는 Client.damageCallback 가 추가되었습니다.
* 거래를 요청하는 Client.RequestTrade 메소드가 추가되었습니다.
* 창고를 호출하는 Client.ShowStorage 메소드가 추가되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.10" id="less-than-greater-than.10"></a>

* Server.tradeCallback이 송신자/수신자가 모두 거래 준비 완료 시에 호출되도록 수정되었습니다.
* 파티 초대 기능 작동하지 않던 현상이 수정되었습니다.
* 이벤트 검색 인풋 필드 글자가 잘리던 현상이 수정되었습니다.

***

#### v 2.223  <스튜디오> <a href="#v-2.223-hardbreak-hardbreak-less-than-greater-than" id="v-2.223-hardbreak-hardbreak-less-than-greater-than"></a>

* \[시스템] - \[GUI설정] - \[플레이어 입장 시 시스템 메시지 출력] 에서 플레이어 게임 접속 시 채팅창에 출력 여부를 설정하는 기능이 추가되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.11" id="less-than-greater-than.11"></a>

* 퀵슬롯의 위치가 비정상적으로 출력 되던 현상이 수정되었습니다.
* 퀵슬롯에 슬롯 등록 시 정상 작동하지 않던 현상이 수정되었습니다.

***

#### v 2.222  <스튜디오> <a href="#v-2.222-hardbreak-hardbreak-less-than-greater-than" id="v-2.222-hardbreak-hardbreak-less-than-greater-than"></a>

> **자동 업데이터가 추가 되었습니다.**

* 프로젝트가 오픈 될 시에 업데이트 변경 사항이 있으면 해당 내역을 볼 수 있습니다.

#### <서버> <a href="#less-than-greater-than.3" id="less-than-greater-than.3"></a>

* tradeCallback에서 false를 Return시에 거래 창이 즉시 종료되도록 수정되었습니다.

> **퀵슬롯 커스텀 기능이 추가 되었습니다.**

* 기존 퀵슬롯 최대 8개 → 20개 까지 추가 생성이 가능합니다.
* \[레이아웃] - \[상단 도구상자] - \[퀵슬롯] 을 클릭하여 추가 퀵슬롯을 생성할 수 있습니다.

#### <스튜디오> <a href="#less-than-greater-than.5" id="less-than-greater-than.5"></a>

* 탑 메뉴 배경이미지를 설정할 수 있는 기능이 추가됩니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.12" id="less-than-greater-than.12"></a>

* IOS에서 라이트 모드로 인하여 주변광이 비정상적으로 출력되던 현상이 수정되었습니다.

***

#### v 2.220  <스튜디오> <a href="#v-2.220-hardbreak-hardbreak-less-than-greater-than" id="v-2.220-hardbreak-hardbreak-less-than-greater-than"></a>

* 리소스 마켓이 내장 브라우저 → 기본 브라우저로 오픈 되도록 수정되었습니다.

***

#### v 2.219  <스튜디오> <a href="#v-2.219-hardbreak-hardbreak-less-than-greater-than" id="v-2.219-hardbreak-hardbreak-less-than-greater-than"></a>

* 테스트 플레이 시 이벤트 커맨드의 에러 로그가 콘솔에 표시되도록 수정되었습니다.

***

#### v 2.217  <스튜디오> <a href="#v-2.217-hardbreak-hardbreak-less-than-greater-than" id="v-2.217-hardbreak-hardbreak-less-than-greater-than"></a>

> **테스트 플레이 콘솔 리뉴얼**

* 오류 로그 필터링 : C# => MoonSharp InterpreterException 으로 통일 되었습니다.
* 에러 메시지는 빨간색으로 출력됩니다.
* 로그인 ID 리스팅 기능이 추가되었습니다.
* ctrl + enter 입력 시 콘솔 창에 기입한 스크립트의 내용을 실행할 수 있습니다.
* esc 입력 시 콘솔 창에 기입한 스크립트의 내용을 제거할 수 있습니다.

***

#### v 2.216  <버그픽스 및 수정사항> <a href="#v-2.216-hardbreak-hardbreak-less-than-greater-than" id="v-2.216-hardbreak-hardbreak-less-than-greater-than"></a>

* 스튜디오에서 세로 모드 설정 시 오류 메시지가 출력 되는 현상이 수정되었습니다.
* 해상도 설정에서 방향이 추가되었습니다.
* \[레이아웃] - \[메뉴설정] 에서 비활성화 시킨 커스텀 메뉴가 활성화 되는 현상이 수정되었습니다.

***

#### v 2.212  <버그픽스 및 수정사항> <a href="#v-2.212-hardbreak-hardbreak-less-than-greater-than" id="v-2.212-hardbreak-hardbreak-less-than-greater-than"></a>

* 데미지가 출력되지 않는 현상이 수정되었습니다.

***

#### v 2.210  <버그픽스 및 수정사항> <a href="#v-2.210-hardbreak-hardbreak-less-than-greater-than" id="v-2.210-hardbreak-hardbreak-less-than-greater-than"></a>

* 채팅 패널의 정렬이 정상적으로 되지 않던 현상이 수정되었습니다.

#### v 2.206  <스튜디오> <a href="#v-2.206-hardbreak-hardbreak-less-than-greater-than" id="v-2.206-hardbreak-hardbreak-less-than-greater-than"></a>

* 탑 메뉴 배경이미지를 설정할 수 있는 기능이 추가됩니다.

#### <클라이언트> <a href="#less-than-greater-than.6" id="less-than-greater-than.6"></a>

* 스크립트 namespace가 분리 됩니다. -> (UI / Graphics / Lua / System)

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.13" id="less-than-greater-than.13"></a>

* 스튜디오의 초기 설치 시 아이콘이 기존 네코랜드에서 펑크랜드 스타일로 변경됩니다. - 커스텀 스텟이 비정상적으로 출력 되는 현상이 수정되었습니다.

#### v 2.203  <스튜디오> <a href="#v-2.203-hardbreak-hardbreak-less-than-greater-than" id="v-2.203-hardbreak-hardbreak-less-than-greater-than"></a>

* 레이아웃 매니저에서 채팅창을 조절 할 수 있는 기능이 추가됩니다.
* 스킬에 커스텀 상수 기능이 추가됩니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
--커스텀 상수들 불러오기
Client.GetSkill(dataID).customConstants
```

{% endcode %}

* 스플래시 화면 / 프로젝트 매니저가 추가되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.14" id="less-than-greater-than.14"></a>

* 애니메이션 주변광이 비정상적으로 출력되던 현상이 수정되었습니다.
* 캐릭터의 특성이 인게임에 적용되도록 개선되었습니다.

#### v 2.200  <스튜디오> <a href="#v-2.200-hardbreak-hardbreak-less-than-greater-than" id="v-2.200-hardbreak-hardbreak-less-than-greater-than"></a>

* 애니메이션에도 주변광이 적용됩니다.

#### <안드로이드> <a href="#less-than-greater-than" id="less-than-greater-than"></a>

* 회원가입에 약관이 추가됩니다.

#### \<IOS> <a href="#less-than-ios-greater-than" id="less-than-ios-greater-than"></a>

* 회원가입에 약관이 추가됩니다.

#### v 2.199  <스튜디오> <a href="#v-2.199-hardbreak-hardbreak-less-than-greater-than" id="v-2.199-hardbreak-hardbreak-less-than-greater-than"></a>

* 유닛 사망 시간의 기본값이 10초로 설정됩니다.
* 스크린샷을 찍을 수 있도록 기본 전체 GUI를 켜거나 끌 수 있는 기능이 추가되었습니다.
* \[탑 세줄 메뉴] -> \[게임 설정] -> \[전체 UI 보기 체크 설정]

#### <클라이언트> <a href="#less-than-greater-than.7" id="less-than-greater-than.7"></a>

* 유닛이 사망 후 사라지는 딜레이를 설정하는 ScriptUnit.delayUntilDead 추가

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.15" id="less-than-greater-than.15"></a>

* 상점에서 툴팁을 열 시에 슬롯 등록 버튼이 있는 버그가 개선되었습니다.

#### v 2.197  <버그픽스 및 수정사항> <a href="#v-2.197-hardbreak-hardbreak-less-than-greater-than" id="v-2.197-hardbreak-hardbreak-less-than-greater-than"></a>

* 캐릭터 액션 재생 시 down 액션의 첫번째 프레임으로만 돌아가는 현상이 수정되었습니다.

#### v 2.196  <버그픽스 및 수정사항> <a href="#v-2.196-hardbreak-hardbreak-less-than-greater-than" id="v-2.196-hardbreak-hardbreak-less-than-greater-than"></a>

* 핫게임 메뉴 카테고리가 일정 글자를 넘어가면 잘려서 비정상적으로 출력되는 현상이 수정되었습니다.

#### v 2.195  <스튜디오> <a href="#v-2.195-hardbreak-hardbreak-less-than-greater-than" id="v-2.195-hardbreak-hardbreak-less-than-greater-than"></a>

* 커스텀 메뉴 기능에서 기본 메뉴 아이콘도 수정이 가능하도록 개선되었습니다.
* 몬스터가 사망 시에 바로 사라지지 않고 죽는 모션(dead\_up,dead\_down,dead\_left,dead\_right)을 설정할 수 있도록 개선되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.16" id="less-than-greater-than.16"></a>

* 다크 모드 설정 상태에서 내 게임 배경이 적용되지 않는 현상이 수정되었습니다.
* 커스텀 메뉴 버튼을 클릭 시 탑메뉴가 닫히도록 개선하였습니다.

#### v 2.194  \<IOS> <a href="#v-2.194-hardbreak-hardbreak-less-than-ios-greater-than" id="v-2.194-hardbreak-hardbreak-less-than-ios-greater-than"></a>

* /exit 명령어로 게임에서 나갈 시, 정보가 저장되어 다음 접속부터는 NEKO WORLD가 아닌 로비로 바로 연결됩니다. (펑크랜드 파일 내 데이터에 저장하는 것이니, 데이터를 삭제하거나 펑크랜드가 삭제되면 해당 기록이 초기화 됩니다.)

#### v 2.193  <스튜디오> <a href="#v-2.193-hardbreak-hardbreak-less-than-greater-than" id="v-2.193-hardbreak-hardbreak-less-than-greater-than"></a>

* 폼 메인 좌측의 필드를 드래깅 할때 마우스 위치에 따라 자동으로 스크롤 되는 기능이 추가되었습니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.17" id="less-than-greater-than.17"></a>

* 맵 이동 커맨드가 개선됩니다.
* 맵 이동 위치 편집 창에 접근 시에 설정된 위치값이 없거나 다른 맵을 선택할 시에 위치가 0, 0으로 설정되도록 수정하였습니다.
* 게임 최초 접속 시에 날씨가 강제로 출력되는 현상이 수정되었습니다.

#### v 2.192  <버그픽스 및 수정사항> <a href="#v-2.192-hardbreak-hardbreak-less-than-greater-than" id="v-2.192-hardbreak-hardbreak-less-than-greater-than"></a>

* 세로 모드에서 게임머니 텍스트가 출력되지 않는 현상이 수정되었습니다.
* 앱 다크모드 설정 시, 일부 ui가 흰색으로 비정상 출력이 되는 현상이 수정되었습니다.

#### v 2.191  <버그픽스 및 수정사항> <a href="#v-2.191-hardbreak-hardbreak-less-than-greater-than" id="v-2.191-hardbreak-hardbreak-less-than-greater-than"></a>

* 탑 메뉴 큐브샵, 공지 버튼 활성화 여부를 설정하는 스크립트가 작동하지 않는 이슈가 해결되었습니다.

#### v 2.190  <스튜디오> <a href="#v-2.190-hardbreak-hardbreak-less-than-greater-than" id="v-2.190-hardbreak-hardbreak-less-than-greater-than"></a>

> 커스텀 메뉴를 꾸밀 수 있는 기능이 추가됩니다.

* 커스텀 메뉴는 설정 / 게임 종료 버튼과 나머지 기본 메뉴들 사이에 위치됩니다.
* \[도구] - \[레이아웃 관리자] - \[메뉴 설정] 에서 커스텀 메뉴를 추가 및 수정 할 수 있습니다.
* active : 커스텀 메뉴의 활성화 여부를 설정합니다. (True/False)
* closureScript : 클릭 시 동작할 클로져 함수를 설정합니다.
* Image : 적용할 아이콘 이미지를 설정합니다.
* text : 커스텀 메뉴의 이름을 설정합니다.
* PKLAY를 사용하는 \[PKLAY 사용] 이벤트 커맨드 기능이 추가됩니다. 사용법은 기존 CUBE 사용하기와 동일합니다.

#### v 2.183 <a href="#v-2.183" id="v-2.183"></a>

#### <서버> <a href="#less-than-greater-than.4" id="less-than-greater-than.4"></a>

* 다른 게임 아이템을 확인할 수 있는 ScriptRoomPlayer.GetOtherGameItem이 추가 되었습니다.
* 게임 ID를 확인할 수 있는 ScriptServer.gameId가 추가 되었습니다.
* 필드 내의 몬스터를 확인할 수 있는 ScriptField.enemyUnits가 추가 되었습니다.

#### <버그픽스> <a href="#less-than-greater-than" id="less-than-greater-than"></a>

* 조건분기 - 다른 게임 아이템 확인하기 기능이 수정되었습니다.
* TGameMonster.respawnTime이 적용 되지 않는 현상이 수정되었습니다.

#### v 2.171 <a href="#v-2.171" id="v-2.171"></a>

#### <클라이언트> <a href="#less-than-greater-than.8" id="less-than-greater-than.8"></a>

* ScriptPanorama 클래스가 추가 되었습니다.
* ScriptMapTile 클래스가 추가 되었습니다.

#### <스튜디오> <a href="#less-than-greater-than.6" id="less-than-greater-than.6"></a>

* 이벤트 커맨드 관리자가 개편 되었습니다.

#### v 2.168 <a href="#v-2.168" id="v-2.168"></a>

#### <클라이언트> <a href="#less-than-greater-than.9" id="less-than-greater-than.9"></a>

* ScreenUI.ShowPopup, ScreenUI.HidePopup의 “Notice” 프로퍼티가 “EventPage”로 수정되었습니다.
* ScreenUI.IsShowPopup 메소드가 추가 되었습니다.
* ScreenUI.bagButtonVisible 프로퍼티가 추가 되었습니다.
* ScriptSprite.sortingLayerName 프로퍼티가 추가 되었습니다. 레이어 이름은 추후 변경 될 수 있습니다.

#### <스튜디오> <a href="#less-than-greater-than.7" id="less-than-greater-than.7"></a>

* aab 생성 버튼이 분리 되었습니다.

#### <버그픽스> <a href="#less-than-greater-than.1" id="less-than-greater-than.1"></a>

* 애니메이션 속성의 ***캐릭터 뒤 표시***&#xB97C; 활성화 했을 때 타일에 애니메이션이 잘리는 현상이 수정 되었습니다.

#### &#x20;v 2.162 <a href="#hardbreak-v-2.162" id="hardbreak-v-2.162"></a>

#### <클라이언트> <a href="#less-than-greater-than.10" id="less-than-greater-than.10"></a>

* 이벤트 유닛을 클릭하면 발동하는 콜백 함수 Client.onClickEvent(ScriptUnit) 함수가 추가 되었습니다.
* 화면의 해상도와 화면 방향을 조정하는 Client.resolution, Client.orientation 프로퍼티가 추가 되었습니다.
* 캐릭터의 점프 속성을 설정하는 ScriptMyPlayerUnit.jumpPower, jumpDuration, canJump 프로퍼티가 추가 되었습니다.

#### <서버> <a href="#less-than-greater-than.5" id="less-than-greater-than.5"></a>

* 운영 및 관리를 도와주는 Server.Kill(), Server.Shutdown(), Server.Chatban() 메소드가 추가 되었습니다.

#### <스튜디오> <a href="#less-than-greater-than.8" id="less-than-greater-than.8"></a>

* 예제게임(네코파이트)가 추가 되었습니다.
* 스튜디오 메뉴 단축키가 추가 되었습니다.(배율, 이벤트 이름 보기, 충돌 영역 표시하기)

#### &#x20;v 2.160 <a href="#hardbreak-v-2.160" id="hardbreak-v-2.160"></a>

#### <클라이언트> <a href="#less-than-greater-than.11" id="less-than-greater-than.11"></a>

* ScreenUI.ShowPopup() 메소드의 GameSettings 옵션이 추가 되었습니다.
* 설정창 알림의 활성화 여부를 설정하는 Client.SetNotification() 메소드가 추가 되었습니다.
* 게임의 전체 볼륨을 설정하는 Client.bgmVolume 과 Client.fxVolume 프로퍼티가 추가 되었습니다.

#### v 2.159 <a href="#v-2.159" id="v-2.159"></a>

#### <클라이언트> <a href="#less-than-greater-than.12" id="less-than-greater-than.12"></a>

* ScreenUI
  * 이제 공지사항, 큐브샵, 메인 메뉴 버튼의 활성화 여부를 조작 할 수 있습니다.\
    menuButtonVisible, noticeButtonVisible, cubeShopButtonVisible 프로퍼티 추가
  * UI팝업을 조작하는 ShowPopup(string popup), HidePopup(string popup) 메소드 추가
* 수정사항
  * 이모티콘 출력 버그 픽스

#### &#x20;v 2.158 <a href="#hardbreak-v-2.158" id="hardbreak-v-2.158"></a>

#### <클라이언트> <a href="#less-than-greater-than.13" id="less-than-greater-than.13"></a>

* 방명록 UI 비활성화
* 방명록 세로모드 버그 수정
* Say 메소드 말풍선 버그 수정

#### &#x20;v 2.156 <a href="#hardbreak-v-2.156" id="hardbreak-v-2.156"></a>

#### <서버> <a href="#less-than-greater-than.6" id="less-than-greater-than.6"></a>

* ScriptEventPublisher 생성 함수 추가

{% code overflow="wrap" lineNumbers="true" %}

```lua
local myCallback = EventPublisher()
myCallback.Add(function()
  print("myCallback1")
end)
myCallback.Call()
```

{% endcode %}

#### <클라이언트> <a href="#less-than-greater-than.14" id="less-than-greater-than.14"></a>

* ScriptEventPublisher 생성 함수 추가
* Client.GetPing(string) 함수 추가
* Client.ShowCenterLabel 추가

#### v 2.153 <a href="#v-2.153" id="v-2.153"></a>

#### <클라이언트> <a href="#less-than-greater-than.15" id="less-than-greater-than.15"></a>

* ScriptCamera
  * size 추가
  * height 추가
  * width 추가

#### <버그픽스> <a href="#less-than-greater-than.2" id="less-than-greater-than.2"></a>

* 예제 게임 제목 수정

#### v 2.152 <a href="#v-2.152" id="v-2.152"></a>

#### <서버> <a href="#less-than-greater-than.7" id="less-than-greater-than.7"></a>

* ScriptUnit
  * position 추가

#### <클라이언트> <a href="#less-than-greater-than.16" id="less-than-greater-than.16"></a>

* 이제 ScriptSprite 클래스에서 ScriptTweening 메소드 사용이 가능합니다.

#### <버그픽스 및 수정사항> <a href="#less-than-greater-than.18" id="less-than-greater-than.18"></a>

* 채팅창 성능 개선
* Server.SendSay 말풍선도 같이 뜨던 현상 픽스
* SendCenterLabel 성능 개선

#### v 2.151 <a href="#v-2.151" id="v-2.151"></a>

#### <클라이언트> <a href="#less-than-greater-than.17" id="less-than-greater-than.17"></a>

* Client.onJoinDropItem(ScriptDropItem) 추가
* ScriptDropItem 클래스 추가
* ScriptBoxCollider 클래스 추가
* ScriptCamera
  * 더 다양한 트위닝 함수 추가
* ScriptInput
  * anyKey 추가
  * anyKeyDown 추가
  * inputString 추가

#### <버그 픽스> <a href="#less-than-greater-than" id="less-than-greater-than"></a>

* 독스 출력 수정

#### v 2.150 <a href="#v-2.150" id="v-2.150"></a>

#### <클라이언트> <a href="#less-than-greater-than.18" id="less-than-greater-than.18"></a>

* Camera.DOMove 추가
* ScriptInput
  * Input.KeyCode 추가
  * Input.GetKey 추가
  * Input.GetKeyDown 추가
  * Input.GetKeyUp 추가
* ScriptPoint
  * 연산자 오버로딩 추가

{% code overflow="wrap" lineNumbers="true" %}

```lua
local a = Point(100,100) + Point(200,300)
print(a.x, a.y) --> 300 400
```

{% endcode %}

#### <버그수정> <a href="#less-than-greater-than" id="less-than-greater-than"></a>

* 간헐적으로 스크립트가 불러 들여지지 않는 현상이 수정 되었습니다.

#### v 2.147 <a href="#v-2.147" id="v-2.147"></a>

* 각 채팅 패킷에 대응하는 ScriptChat 클래스 추가
* ScriptClient
  * onChat(ScriptChat chat) 이벤트 리스너 추가

{% code overflow="wrap" lineNumbers="true" %}

```lua
-- 해당 테이블 대신 서버 개인 변수에 저장 할 수도 있습니다.
local muteUsers = {}

-- 밴할 유저 등록
Client.onChat.Add(
    function(chat)
        local i, j = string.find(chat.text, "mute")
        if i == nil then
            return
        end

        local muteUser = string.sub(chat.text, j + 2, string.len(chat.text))
        table.insert(muteUsers, muteUser)
        chat.type = -1
        chat.text = muteUser .. "님을 차단 하였습니다."
    end
)

-- 밴한 유저가 있을시 채팅 안보이기
Client.onChat.Add(
    function(chat)
        if #muteUsers < 1 then
            return
        end
        for _, v in ipairs(muteUsers) do
            if v == chat.name then
                chat.type = -1
                chat.visible = false
            end
        end
    end
)

```

{% endcode %}

#### v.2.146 <a href="#v.2.146" id="v.2.146"></a>

#### <클라이언트> <a href="#less-than-greater-than.19" id="less-than-greater-than.19"></a>

* ScriptCamera
  * aspect
  * DOOrthoSize(float size, float duration)

{% code overflow="wrap" lineNumbers="true" %}

```lua
-- 2초동안 카메라 크기를 300으로 만듭니다.
Camera.DOOrthoSize(300,2)

```

{% endcode %}

* DOAspect(float to, float duration)
  * DOColor(ScriptColor color, float duration)
  * DOShake(float duration, float strength, float vibrato, float randomness, float fadeout)
  * ScriptURLImage: ScriptImage

```lua
local a = URLImage("https://www.이미지주소",Rect(0,0,300,300))
```

* ScriptURLSprite: ScriptSprite
* style 프로퍼티에서 rect, y 가 적용이 되지 않던 문제가 해결 되었습니다.

#### v2.144 <a href="#v2.144" id="v2.144"></a>

#### <스튜디오> <a href="#less-than-greater-than.9" id="less-than-greater-than.9"></a>

* 테스트 환경 아이콘 디자인이 변경 되었습니다.

#### v2.140 <a href="#v2.140" id="v2.140"></a>

#### <클라이언트> <a href="#less-than-greater-than.20" id="less-than-greater-than.20"></a>

* 폰트를 설정할 수 있는 `ScriptFont` 클래스가 추가 되었습니다. 정해진 폰트 설정을 골라서 사용 가능합니다. 사용 가능한 폰트는 독스를 참고 바랍니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local a = Text("안녕하세요")
a.font = Font("NunumMyeongjo")
```

{% endcode %}

* 외곽선 효과를 설정할 수 있는 `ScriptOutline` 클래스가 추가 되었습니다.
* 그림자 효과를 설정할 수 있는 `ScriptShadow` 클래스가 추가 되었습니다.
* ScriptTweening
  * 소용돌이 효과를 주는 DOSpiral 메소드가 추가 되었습니다.
  * 원 운동 효과를 주는 DOOrbit 메소드가 추가 되었습니다.
  * 목표 지점까지 포물선으로 이동하는 DOSlerp 메소드가 추가되었습니다.
* ScriptTween
  * 숫자 값을 변화 시키는 DONumber 메소드가 추가 되었습니다.
* ScriptText
  * 폰트를 설정할 수 있는 font 프로퍼티가 추가 되었습니다.
  * `ScriptBorder` 객체를 리턴하는 border 프로퍼티가 추가 되었습니다.
  * `ScriptShadow` 객체를 리턴하는 shadow 프로퍼티가 추가 되었습니다.

#### <수정사항> <a href="#less-than-greater-than" id="less-than-greater-than"></a>

* ScriptChatUI 에서 DOScale이 적용되지 않던 문제가 수정 되었습니다.
* ScriptTween의 SetId 메소드의 이름이 SetID로 변경 되었습니다.

#### v2.138 <a href="#v2.138" id="v2.138"></a>

#### <클라이언트> <a href="#less-than-greater-than.21" id="less-than-greater-than.21"></a>

> 이제 다양한 스킬에 트위너 효과를 적용할 수 있도록 도와주는 ScriptCustomskill 클래스가 추가되었습니다.

* 스킬에 다양한 트위너 효과를 줄 수 있는 ScriptCustomSkill 클래스가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local me = Client.myPlayerUnit
local skill = me.UseCustomSkill(1) -- 데이터베이스 1번에 있는 스킬을 가져옵니다

-- 스킬 애니메이션을 360도 회전시키고 회전 타입은 30번, 트위닝이 끝나면 트위너를 삭제하고 스킬 객체 또한 삭제합니다.
skill
  .DORotate(360,1,1)
  .SetEase(30)
  .OnComplete(function()
    skill.DOKill()
    skill.Destroy()
  end)
```

{% endcode %}

* 스킬의 충돌범위를 동적으로 설정할 수 있는 ScriptCircleCollider 클래스가 추가되었습니다.
* 기존 ScriptBaseControl에 속해있던 DO\~로 시작하는 애니메이션 시작 메소드가 ScriptTweening이라는 클래스로 변경되었습니다. ScriptTweening 클래스를 상속받는 클래스는 ScriptUnit, ScriptBaseControl, ScriptCustomSkill 등이 있습니다.
* 더욱 다양한 트위너 효과가 추가 되었습니다. 추가된 메소드는 다음과 같습니다.
  * ScriptTweening
    * DOPunch/DOPunchRotate/DOPunchScale: 펀치 효과를 줍니다.
    * DOJump: 점프 효과를 줍니다.
    * DOShake/DOShakeRotate/DOShakeScale: 지진 효과를 줍니다.
    * DOPath: 경로를 따라 움직이는 효과를 줍니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local me = Client.myPlayerUnit
local path = {
	Point(25,25),
	Point(-50,-25),
	Point(50,-25),
	Point(-25,25),
	Point(0,-50),
	Point(25,25)
}

me.DOPath(path,2)
```

{% endcode %}

* DOPivot: 피벗이 움직이는 효과를 줍니다.
* 트위너의 세팅들을 미리 저장해뒀다가 한번에 적용할 수 있게 도와주는 ScriptTweenParams 클래스가 추가 되었습니다. TweenParams객체는 SetAs 메소드와 함께 사용할 수 있습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local me = Client.myPlayerUnit

-- 트윈 세팅들을 저장합니다.
local params = Tween.Params().SetLoops(-1).SetEase(30)

-- 저장되어있던 세팅을 SetAs 메소드에 넣어 적용합니다.
me.DORotate(360,1,1).SetAs(params)
```

{% endcode %}

&#x20;

#### v2.137 <a href="#v2.137" id="v2.137"></a>

#### <스튜디오 및 플레이> <a href="#less-than-greater-than" id="less-than-greater-than"></a>

> 펑크랜드 스튜디오가 펑크랜드 스튜디오(Punkland Studio)로 리뉴얼됩니다.\
> 기존 사용하시던 기능이나 서비스가 변경되는 점 없이 브랜드만 리뉴얼 됩니다

* favicon과 Title이 Punkland로 변경되었습니다.
* 독스에 api가 정상적으로 출력되지 않는 현상이 수정되었습니다.
* 클라이언트 보안이 강화 되었습니다.
* AAB 빌드시 발생하는 오류가 수정 되었습니다.
* 앱 실행시 중앙 하단에 `nft 지갑` 탭이 추가 되었습니다.

#### <클라이언트> <a href="#less-than-greater-than.22" id="less-than-greater-than.22"></a>

> 이제 펑크랜드에서 좀 더 다양한 트위닝 옵션을 제공합니다.\
> 트위닝을 관리하고 도와주는 각각의 트윈 클래스를 추가하였습니다.\
> 추가내역은 다음과 같습니다.

* **ScriptTween: 객체의 애니메이션 동작을 관리하는 클래스가 추가 되었습니다.**
  * 생성자:

{% code overflow="wrap" lineNumbers="true" %}

```lua
public ScriptTween()
```

{% endcode %}

* 사용법:

{% code overflow="wrap" lineNumbers="true" %}

```lua
local tween = Tween() --> Game.Scripts.ScriptTween
tween.KillAll() --> 재생중인 모든 트윈 없애기
```

{% endcode %}

* 메소드:
  * *CompleteAll()* : 모든 트윈을 완료시킵니다.
  * *FilpAll()* : 모든 트윈을 반전시킵니다.
  * *KillAll()* : 모든 트윈을 반전시킵니다.
  * *PuaseAll()* : 모든 트윈을 일시정지합니다.
  * *PlayAll()* : 모든 트윈을 실행합니다.
  * *RestartAll()* : 모든 트윈을 재실행합니다.
  * *RewindAll()* : 모든 트윈을 역 재생 합니다.
* ScriptTweener와 ScriptTweenSequence에서 공용 사용 가능한 메소드가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local a = Panel()
a.style = {
  rect = Rect(Client.width/2, Client.height/2, 100, 100)
  color = Color(255,0,0)
}

a.DOMove(Point(200,100),1)
 .SetAutoKill(true) --> 트윈이 끝나면 트위너 자동 종료
 .SetId("MyPanel")
 .SetLoops(3,1) --> 루프 3번 반복 1번 타입
 .OnComplete(function()
    -- 트위너 재생이 끝날 때 호출되는 함수
    print("트위너 재생 끝!")
    -- 다음 애니메이션 재생
    a.DOMove(Point(400,100),1)
  end)
```

{% endcode %}

* 세팅 함수
  * *SetAutoKill(bool autokill)* : `autokill` 이 `true` 로 설정되면 트윈이 완료되는 즉시 종료됩니다.
  * *SetEase(int ease)*: 트위너의 속도를 조정하는 `Ease` 타입을 설정합니다.
  * *SetId(object id)*: 트윈을 식별할 수 있는 커스텀 id를 설정합니다.
  * *SetLoops(int loops, int loopType)*: 반복 횟수와 애니메이션 타입을 설정합니다 ( 0 \~ 2 )
  * *SetRelative(bool isRelative)*: 트윈을 상대적으로 설정합니다.
* 콜백 함수
  * *OnComplete(Closure c)* : 트윈이 완료되는 순간 발동됩니다.
  * *OnKill(Closure c)* : 트윈이 메모리에서 지워질 때 발동 되는 콜백입니다.
  * *OnPause(Closure c)* : 트윈이 일시정지 될 때 발동되는 콜백입니다.
  * *OnPlay(Closure c)* : 트윈이 실행될때 발동되는 콜백입니다.
  * *OnRewind(Closure c)* : 트윈이 역재생 될떄 발동되는 콜백입니다.
  * *OnStart(Closure c)* : 트윈이 시작할때 발동되는 콜백입니다.
  * *OnStepComplete(Closure c)* : 각 트윈의 단일 반복 주기를 완료할 때마다 호출되는 콜백입니다.
* **ScriptTweener** : 객체의 애니메이션 동작 하나에 대응 하는 클래스가 추가되었습니다.
  * *From(bool)* : 원래 값으로 트위닝 합니다.
  * *SetDelay(float delay)* : 트윈을 `delay` (초) 뒤에 실행합니다.
  * *SetSpeedBased(bool isSpeedBased)* : 트윈을 속도 기반으로 설정합니다.
* **ScriptTweenSequence** : 트위너들을 시퀀스 단위로 묶어서 시간과 순서에 맞춰 연속된 애니메이션으로 다룰 수 있는 클래스가 추가되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local s = Sequence()
local a = Panel(Rect(100,100,100,100))
a.color = color(Color(255,0,0))
Sequence.Append(a.DOMove(Point(200,200),1)
```

{% endcode %}

* *Append(ScriptTweener t)* : 시퀀스 가장 끝에 트위너를 추가합니다
* *AppendCallback(ScriptTweener t)*: 시퀀스의 가장 끝에 실행되는 콜백입니다.
* *AppendInterval(ScriptTweener t)* : 시퀀스의 실행 순서와 상관 없이 `interval`(초) 후에 실행됩니다.
* *Insert(ScriptTweener t)* : 시퀀스의 `atPosition`으로 순서를 설정하여 트위너를 추가합니다.
* *InsertCallback(ScriptTweener t)* :콜백 함수의 순서를 `atPosition`으로 설정하여 추가합니다.
* *Join(ScriptTweener t)* : 지정된 트윈을 마지막 트윈의 같은 위치에 삽입하거나 콜백을 시퀀스에 추가합니다.
* *Prepend(ScriptTweener t)* : 시퀀스의 가장 앞에 트위너를 추가하고 원래 있던 나머지 트윈을 뒤로 밀어냅니다.
* *PrependCallback(ScriptTweener t)* :지정된 콜백을 시퀀스 선두에 추가합니다.
* *PrependInterval(float interval)* : 지정된 `interval`을 시퀀스 선두에 추가하고 같은 시간대 `interval`을 뒤로 밀어냅니다.

> 그 외 추가 및 변경사항은 다음과 같습니다.

* **ScriptUnit**
  * 유닛의 픽셀 각도를 조정하는 `rotation` 프로퍼티가 추가되었습니다.\ <br>

#### v2.135 <a href="#v2.135" id="v2.135"></a>

#### <클라이언트> <a href="#less-than-greater-than.23" id="less-than-greater-than.23"></a>

* **ScriptUnit**
  * 유닛의 이름 텍스트 객체를 리턴 하는 `nameControl` 프로퍼티가 추가 되었습니다.
  * 유닛의 말풍선 텍스트 객체를 리턴하는 `sayTextControl` 프로퍼티가 추가되었습니다.
  * 유닛의 컬러를 설정하는 `color` 프로퍼티가 추가되었습니다.
  * 유닛의 픽셀 사이즈를 구하는 `size` 프로퍼티가 추가되었습니다.
  * 유닛의 스케일을 설정하는 `scale` 프로퍼티가 추가되었습니다.
  * 유닛의 색깔을 바꿔주는 `DOColor` 메소드가 추가되었습니다.
  * 유닛의 스케일을 바꿔주는 `DOScale` 메소드가 추가되었습니다.
* **ScriptText**
  * 텍스트 행의 간격을 설정하는 `lineSpacing` 프로퍼티가 추가되었습니다.

#### v2.134 <a href="#v2.134" id="v2.134"></a>

#### <클라이언트> <a href="#less-than-greater-than.24" id="less-than-greater-than.24"></a>

* 스크롤 패널 안에 버튼을 추가 할 시 스크롤이 되지 않던 현상을 수정하였습니다.

#### v2.133 <a href="#v2.133" id="v2.133"></a>

#### &#x20;<클라이언트> <a href="#hardbreak-less-than-greater-than" id="hardbreak-less-than-greater-than"></a>

* 스크롤바를 표시하는 **ScriptScrollbar** 클래스가 추가 되었습니다. 포함된 프로퍼티는 다음과 같습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
public class ScriptScrollbar : ScriptControl
```

{% endcode %}

* color: 스크롤바 배경의 색깔을 설정합니다.
* direction: 스크롤바의 방향을 설정합니다\
  (0 : LeftToRight, 1 : RightToLeft, 2 : BottomToTop, 3 : TopToBottom)
* handlerColor: 스크롤바 핸들의 색깔을 설정합니다.
* handlerImagePath: 핸들의 이미지를 이미지 경로 문자열로 설정합니다.
* imagePath: 배경 이미지를 이미지 경로 문자열로 설정합니다.
* onValueChanged: 입력 필드의 텍스트 콘텐츠가 변경된 경우 호출되는 이벤트 입니다.
* scale: 이 컨트롤의 스케일을 설정합니다.
* size: 스크롤바 핸들이 한번에 이동하는 거리입니다. 터치 이벤트가 발생할 경우, 핸들러를 size만큼 이동시킵니다.
* style: 스크롤 바의 스타일을 설정합니다.
* value: 스크롤바 핸들러의 위치를 설정합니다. 0\~1 사이의 값을 갖습니다.
* **ScriptScrollPanel**
  * horizontalScrollbar: 가로 스크롤바를 리턴 받습니다.
  * verticalScrollbar: 세로 스크롤바를 리턴 받습니다.
  * movementType: 드래그시 움직이는 스타일을 설정합니다. (0: Unrestricted, 1: Elastic, 2: Clamped)
* **ScriptBaseControl**
  * sizeDelta: 이 컨트롤의 크기를 설정합니다. (x: 가로크기, y: 세로크기)
* **ScriptButton**
  * 이제 `onClick` 이벤트 리스너가 테이블 형태 매개변수 `eventData` 를 넘겨받습니다. `eventData` 의 인자는 다음과 같습니다.
    * eventData.button: 클릭한 버튼의 타입
    * eventData.clickCount: 클릭 횟수
    * eventData.position: 클릭한 좌표
  * 그 외 포인터 이벤트를 제어하는 이벤트 리스너가 추가 되었습니다. 추가 된 이벤트 리스너는 다음과 같습니다.
    * onDragStart: 드래그를 시작할 때 호출되는 이벤트
    * onDragEnd: 드래그가 끝났을 때 호출되는 이벤트
    * onMouseEnter: 마우스가 버튼 영역에 들어왔을 때 호출되는 이벤트
    * onMouseExit: 마우스가 버튼 영역에서 벗어났을 때 호출되는 이벤트
* **ScriptInputField**
  * 인풋 필드의 플레이스 홀더를 리턴하는 `placeholderControl` 프로퍼티가 추가되었습니다.
* **ScriptText**
  * textSize를 무시하고 Text 컴포넌트 rect 범위에 맞게 크기를 조정하는 `bestFit` 프로퍼티가 추가 되었습니다.
  * 폰트 스타일을 설정할 수 있는 `fontStyle` 프로퍼티가 추가 되었습니다.\
    (0: Normal, 1: Bold, 2: Italic, 3: Bold and Italic)
  * Text가로 영역을 넘어선 글을 처리할 수 있는 `horizontalOverflow` 프로퍼티가 추가되었습니다.\
    (true: 가로 범위를 넘어가도록 허용, false: 다음 행으로 내려쓰기)
  * Text 세로 영역을 넘어선 글을 처리 할 수 있는 `verticalOverflow` 프로퍼티가 추가 되었습니다.\
    (true: 세로 범위를 넘어가도록 허용, false: 넘어간 글자는 잘라내어 미표시)
  * 텍스트의 색깔을 바꾸는 애니메이션 함수 `DOColor` 메소드가 추가 되었습니다.
  * 타이핑 효과를 나타내는 애니메이션 함수 `DOText` 메소드가 추가 되었습니다.\ <br>

#### <스튜디오> <a href="#less-than-greater-than.10" id="less-than-greater-than.10"></a>

* 게임 콘솔 → \[설정] 탭에 전체 플레이어의 가방, 창고, NFT 창고를 검색하고, 아이템 ID 별로 아이템 총 개수, 보유자 숫자를 리포트로 제공하는 \[Scan Items] 기능이 추가 되었습니다.

#### v2.132 <a href="#v2.132" id="v2.132"></a>

#### <서버> <a href="#less-than-greater-than.8" id="less-than-greater-than.8"></a>

* `onActiveItem` 의 이름이 `onEquipItem` 으로 변경 되었습니다.
* 아이템을 해제할 때 발동되는 `onUnequipItem` 콜백이 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
function(ScriptUnit unit, TItem item)
```

{% endcode %}

#### <클라이언트> <a href="#less-than-greater-than.25" id="less-than-greater-than.25"></a>

* ScriptBaseControl
* 외곽선 색깔을 조정하는 `borderColor` 프로퍼티가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local text = Text("Hello, NekoLand!")
text.borderColor = Color(0,255,0)
```

{% endcode %}

* 외곽선 거리를 조정 하는 `borderDistance` 프로퍼티가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local panel = Panel()
panel.color = Color(255,0,0)
panel.borderDistance = Point(5,5)
```

{% endcode %}

* 외곽선을 표시하는 `borderEnabled` 프로퍼티가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local panel = Panel()
panel.color = Color(255,0,0)
panel.borderEnabled = true
```

{% endcode %}

#### &#x20;v2.131 <a href="#hardbreak-v2.131" id="hardbreak-v2.131"></a>

#### <서버> <a href="#less-than-greater-than.9" id="less-than-greater-than.9"></a>

* 아이템을 장착 할 때 호출 되는 `onActiveItem` 이벤트 리스너가 추가 됩니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
function(ScriptUnit unit, TItem titem)
```

{% endcode %}

* 이제 `onSay` 이벤트 리스너에서 채팅 타입을 매개 변수로 넘겨줍니다.\
  chatType : (0: 근처, 1: 전체, 2: 귓속말, 4: 클랜, 6: 파티)

{% code overflow="wrap" lineNumbers="true" %}

```lua
function(ScriptUnit sender, string text, int chatType)
```

{% endcode %}

#### <클라이언트> <a href="#less-than-greater-than.26" id="less-than-greater-than.26"></a>

* **ScriptBaseControl**
* 대상의 색깔을 바꿔주는 `DOColor()` 메소드가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
function DOColor(ScriptColor color, float duration)
```

{% endcode %}

* 대상의 x, y 위치를 나타내는 `position` 프로퍼티가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
1panel.position = Point(x,y)
```

{% endcode %}

* 컨트롤의 여백 정보를 나타내는 `RectOff` 클래스가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
1public RectOff(int left,int right, int top, int bottom)
```

{% endcode %}

* 채팅창의 UI를 설정하는 `ScriptChatUI` 클래스가 추가 되었습니다. `BaseControl` 의 프로퍼티를 사용 할 수 있습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
1public ScriptChatUI : ScriptBaseControl
```

{% endcode %}

* **ScriptGridPanel**
  * 그리드 패널 외곽의 여백을 설정하는 `padding` 프로퍼티가 추가 되었습니다.
  * 그리드 패널 안쪽 자식 컨트롤의 간격을 설정하는 `spacing` 프로퍼티가 추가 되었습니다.
* **ScriptInputField**
* 인풋 필드 안의 내용이 변경되면 호출 되는 `onValueChanged` 이벤트 리스너가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
function(string text)
```

{% endcode %}

* 입력 필드의 줄 스타일을 설정하는 `lineType` 프로퍼티가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
( 0: Single Line, 1: Multi Line)
```

{% endcode %}

* 커서가 얼마나 자주 깜빡이는지 정의하는 `cursorRate` 프로퍼티가 추가 되었습니다.
* 텍스트 선택 부분의 배경을 설정하는 `selectionColor` 프로퍼티가 추가 되었습니다.
* 인풋 필드 내의 글자 수를 제한하는 `characterLimit` 프로퍼티가 추가 되었습니다.
* **ScriptButton**
  * 마우스를 누를 때와 뗄 때 각각 호출 되는 `onMouseDown`, `onMouseUp` 이벤트 리스너가 추가 됩니다.

#### <스튜디오> <a href="#less-than-greater-than.11" id="less-than-greater-than.11"></a>

* `Beta/Test` 상태에서도 APK 배포가 가능하게 수정 되었습니다.
* 휴대폰 인증이 외부에서도 가능하게 되었습니다.

#### <버그 수정> <a href="#less-than-greater-than" id="less-than-greater-than"></a>

* `/item 445` 명령어를 사용 시 생기는 에러 현상을 수정 하였습니다.
* 파티 가입 상태에서 맵 이동시 참여 멘트가 계속 뜨는 현상을 수정 하였습니다.
* 로그인 에러가 수정 되었습니다.

\
v2.127

* `ScriptControl` 하위 객체에서 사용 가능한 `style` 프로퍼티가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local panel = Panel()
local myStyle = {
  rect = Rect(Client.width/2,Client.height/2,150,150),
  color = Color(255,0,0),
  pivot = Point(0.5,0.5),
  opacity = 200,
  rotation = 30
}
panel.style = myStyle
```

{% endcode %}

* `SetParent()` 함수가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local myPanel = Panel()
local myButton = Button()
myButton.SetParent(myPanel)
```

{% endcode %}

* `ToggleVisible()` 함수가 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
local myBtn = Button()
local myPanel = Panel()

myBtn.onClick.Add(function()
  myPanel.ToggleVisible()
end)
```

{% endcode %}

* `opacity` 프로퍼티가 추가 되었습니다.
* `scaleX`, `scaleY` 프로퍼티가 추가 되었습니다.
* `rotation` 프로퍼티가 추가 되었습니다.
* `pivot` 프로퍼티가 추가 되었습니다.
* `orderIndex` 프로퍼티가 추가 되었습니다.
* ScriptImage의 `imageWidth`, `imageHeight` 프로퍼티가 추가 되었습니다.
* 스튜디오 `NFT 컨트롤러`가 추가 되었습니다.
* `Client.onInit` 콜백이 추가 되었습니다.
* `ScriptControl` 객체의 프로퍼티 `rect`가 get도 가능하게 되었습니다.
* `Client.onResize` 콜백이 추가 되었습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
Client.onResize.Add(function(...)
  print(...)
end)
```

{% endcode %}

v2.050

* 3D 카메라 기능이 추가 되었습니다.
* 데이터베이스 → 시스템 탭 → Camera Settings 에서 아래와 같이 설정해보세요.
* Orthographic 체크박스 해제, Rotation X = -50, Z Pos = -300, Offset Y = -400, FOV = 40
  * Rotation X : 카메라의 각도 (음수)
  * Z Pos : 카메라의 높이 (음수)
  * Offset Y : 카메라의 Y 위치 (음수)
  * FOV : 카메라의 시야범위

&#x20;

v2.047

* Server.GetField 채널지정시 채널에 맞는 필드를 가져오지 못했던 이슈가 수정되었습니다.
* Server.createClan 이 작동이 안되는 이슈가 수정되었습니다.
* 간헐적으로 onUnitDead 가 2회씩 실행이 되는 이슈가 수정되었습니다.

&#x20;

v2.046

* 검은 화면에서 진행되지않는 이슈가 수정되었습니다.

&#x20;

v2.045

* 대사이벤트에서 색깔지정(\C#FFFF00) 및 GetWorldStringVar의 값을 가져오는 기능이 추가되었습니다.(\WSV1)
* 거래완료시 호출되는 onTradeDone 콜백이 추가되었습니다.(네코 개발자 지원센터 - 스크립팅 참고 )
* 해상도 값(Client.screenWidth,Client.screenHeight) 및 클릭한 화면좌표 값(Input.mousePositionToScreen)을 얻어오는 스크립트가 추가되었습니다.
* 스킬창에서 스킬을 바로사용할 수 있도록 추가되었습니다.
* 사운드 재생 및 스킬 사용 클라이언트 스크립트 추가되었습니다.(ScriptMyPlayerUnit - PlaySE,UseSkillToPosition)
* 스크립트 클랜 참조가 간헐적으로 풀리는 문제가 수정되었습니다.
* 채널지정해서 맵에 접속하는 기능이 추가되었습니다.(ScriptUnit - SpawnAtFieldID)
* 스크립트 도움말이 달라졌습니다.(도움말 - 스크립트 도움말 New)
* 클라이언트 스크립트에 랜덤값을 뽑는 기능이 추가되었습니다.(rand, randFloat)
* 팀태그를 None 으로 설정 후 본인일때 스킬 공식이 적용안되는 버그가 수정되었습니다.
* ScriptControl.Clone 이 자식 컨트롤이 여러개일 경우 동작하지 않는 버그가 수정되었습니다.
* ScriptControl의 자식 컨트롤 중 해당 이름의 자식을 가져올 수 있는 ScriptControl.GetChild 메서드가 추가되었습니다.
* 스프라이트 시트에서 원하는 부위(순서)의 스프라이트로 이미지를 변경할 수 있도록 ScriptImage.SetTargetSprite 메서드가 추가되었습니다.(리소스 관리자의 Animations, Characters 에서 설정한 스프라이트를 활용할 수 있습니다.)
* ScriptUnit.SpawnPet이 펫 소환 성공 여부를 반환하도록 반환형이 bool 로 변경되었습니다.
* 펫을 소환하지 않고 새로 등록한 후 등록된 ID를 반환하는 ScriptUnit.AddPet 메서드가 추가되었습니다.
* 플레이어에 등록된 전체 펫 데이터 목록(TOnlinePetData\[])을 가져오는 ScriptUnit.GetAllRegisteredPetData 메서드가 추가되었습니다.
* 플레이어에 등록된 펫 데이터 중 해당 ID의 펫 데이터(TOnlinePetData)를 가져오는 ScriptUnit.GetRegistedPetDataByPetID 메서드가 추가되었습니다.

&#x20;

v2.044

* 일본어 버전에서 데이터베이스 실행이 안되는 이슈가 수정되었습니다.

&#x20;

v2.043

* 데이터베이스에서 숫자로 검색하는 기능이 추가되었습니다.
* GUI 설정 - 게임 머니 표시 기능이 작동 안 되는 이슈가 수정되었습니다.

&#x20;

v2.042

* 검수 시스템이 적용되었습니다.
* 맵선택시 하단에 맵ID가 출력되도록 수정되었습니다.
* 아이템 선택 이벤트의 카테고리가 다르게 표시되는 이슈가 수정되었습니다.

&#x20;

v2.041

* 아이템 선택 팝업의 아이템 클릭이 안되는 이슈가 수정되었습니다.
* 플랫포머 점프 애니메이션이 상대방에게 안보이는 이슈가 수정되었습니다.
* 테스트 플레이에서 큐브상점 버튼이 추가되었습니다.
* 클라이언트 스크립트 중 onClick 과 같이 연결되는 부분의 에러가 채팅창에 출력되도록 수정되었습니다.

&#x20;

v2.040

* 기본 UI(가방,프로필,스킬,도감,파티)팝업이 열려있는지 확인하는 스크립트가 추가되었습니다.(ScriptClient 참고)
* 스파인 캐릭터를 변경할때마다 이름 위치가 계속 증가되는 버그가 수정되었습니다.
* 스파인 캐릭터에 장착된 아이템이 깜빡이는 버그가 수정되었습니다.

&#x20;

v2.039

* 프로젝트 보안이 개선되었습니다.
* UseCube 이벤트 사용시 발생하는 버그가 수정되었습니다. 이제 구매내역에 UseCube 이벤트를 사용했을 때, 어떤 공용 이벤트에서 실행된 것인지 표시됩니다
* 버프 재사용시 표시 갱신이 안 되는 이슈가 수정되었습니다. (untilAt 값으로 조절시 unit.SandUpdated() 사용 필요합니다.)
* 버프 클릭시 설명을 보여주는 기능이 추가되었습니다.
* 아이템 사용시 액션 이름 애니메이션이 다른 유저에게 안보이는 이슈가 수정되었습니다.
* 플레이어 검색 기능 세분화 추가 및 동일 게임 거래요청 기능이 활성화 되었습니다.
* damageCallback 데미지 표시 여부 기능이 추가되었습니다.(개발자 지원센터 스크립트 참고)
* 스파인 런타임 버전이 3.8로 업데이트 되었습니다. 기존에 사용중 또는 새로 적용하는 스파인 데이터 파일은 스파인 에디터 버전 3.8.20 이상에서 내보내야 합니다.

&#x20;

v2.038

* 새 프로젝트 생성: con,prn,nul,aux 와 같은 파일명으로 폴더를 만들면 alert 이 뜹니다.
* 퀵슬롯 등록 스크립트가 추가되었습니다.(SetQuickSlot)
* 출시하기 - UUID 변경시 상태값변경안되는 이슈가 수정되었습니다.

&#x20;

v2.037

* 테스트 플레이에서 FireEvent 와 상점구매가 안되는 이슈가 수정되었습니다.

&#x20;

v2.036

* 루나 수수료의 최소값이 0%로 조정되었습니다.
* 이미지 이름 출력 스크립트 추가 되었습니다.( Client.GetImageName(imageID) )
* print 실행시 TgameItem,TItem 출력안되는 부분 수정되었습니다.
* 데이터 베이스 캐싱 이슈가 수정되었습니다.
* 특성창의 스탯이 - 일경우 +- 가아닌 -로 보여지도록 수정되었습니다.

&#x20;

v2.035

* 맵 왼쪽위에서 애니메이션 잔상이 남는 이슈가 수정되었습니다.

&#x20;

v2.034

* 카메라 설정 수정시 로드가 안되는 이슈가 수정되었습니다.
* 출시스테이터스 기능이 추가되었습니다(Live,OpenBeta,ClosedBeta(비밀번호입력으로 입장),Test(제작자만입장가능))
* 샘플프로젝트 생성이 안되는 문제가 수정되었습니다.&#x20;

&#x20;

v2.033

* 루아 테이블 JSON 이슈가 수정되었습니다.

&#x20;

v2.032

* 레이아웃 관리자에서 페이지 이름이 숫자로만 나오는 이슈가 수정되었습니다.

&#x20;

v2.031

* 버프 패널 활성화/비활성화 기능이 추가되었습니다. (ScriptScreenUI - buffPanelVisible)
* Client.ShowTopUI(boolean) 기능이 정상화 되었습니다.
* 스튜디오의 64bit 기능이 지원되었습니다.
* 클라이언트 JSONParse 음수값 이슈가 수정 되었습니다.
* 앱버전 출력 스크립트가 추가되었습니다.
* 클라이언트 관련 스크립트및 설정은 펑크랜드 앱 v2.42 버전 이후에 적용됩니다.

&#x20;

v2.030

* 스튜디오 테스트 플레이에서 레벨표시가 변하지 않는 이슈가 수정되었습니다.
* 스튜디오 카메라 시야 설정 이벤트가 추가되었습니다.

&#x20;

v2.029

* 애니메이션 위치 이슈가 수정되었습니다.

&#x20;

v2.028

* 이벤트 페이지 관리자 실행 시 오류가 발생하는 이슈가 수정되었습니다.
* 테스트 플레이에서 일부 이미지가 깨져서 보이는 이슈가 수정되었습니다.
* 테스트 플레이의 애니메이션 충돌처리 이슈가 수정되었습니다.

&#x20;

v2.027

* 스크립트로 설정한 최대 체력 만큼 회복되지 않는 이슈가 수정되었습니다.

&#x20;

v2.026

* 테스트 플레이에서 스크립트로 만든 텍스트의 글자가 안나오는 이슈가 수정되었습니다.

&#x20;

v2.025

* 이벤트 관리자 접속이 안 되는 버그가 수정되었습니다.

&#x20;

v2.024

* ScriptScreenUI 가 추가되었습니다. (기본 UI를 컨트롤 할 수 있습니다.)
* 데이터베이스 시스템에 GUI 설정기능이 추가되었습니다. 여기서 기본 UI 표시 조정이 가능합니다.

레이아웃 관리자 수정 및 이벤트페이지 기능이 추가되었습니다.

* 컨트롤 클릭 시 마우스 민감도 조절
* 같은 영역 여러 번 클릭 시 상위 컨트롤 선택 기능 추가
* ScrollPanel 선택 시 vertical 값이 true일 때(세로 스크롤 활성화) 마우스 휠로 ScrollPanelContent 세로 스크롤링 기능 추가

레이아웃관리자

* Ctrl + Z(Undo), Ctrl+Shift+Z(Redo), 저장 인식 문제 픽스

&#x20;

v2.023

* 몬스터로 부터 받는 데미지가 항상 0인 이슈가 수정되었습니다.

&#x20;

v2.022

* 이벤트 검색 기능이 추가되었습니다.
* 맵 목록 -> 이름바꾸기 이슈가 수정되었습니다.

&#x20;

v2.021

* 애니메이션 미리보기 이슈가 수정되었습니다.

&#x20;

v2.020

* 스크립트 문서가 업데이트 되었습니다.

&#x20;

v2.019

* 애니메이션 일괄 변경 기능 추가되었습니다.
* 레이아웃 관리자에서 생성한 스크롤 패널이 스크롤이 되지않는 문제가 수정되었습니다. -> 레이아웃 관리자 스크롤패널기능은 최신버전(v2.32)의 앱에서만 정상작동됩니다.
* 스킬 배우기 이벤트 변수 설정 기능이 추가되었습니다.
* ScriptImage SetImageID 기능이 추가되었습니다.(Titem의 imageID로 그림지정이가능합니다.)
* 현재 레이어만 보기 기능이 추가되었습니다.(보기 - 현재 레이어 보기)
* 넉백 내기준으로 밀기,당기기 스크립트 기능이 추가되었습니다(KnockbackFromUnit,PullFromUnit)
* 직업 이벤트에 장착아이템 유지 설정이 추가되었습니다.

&#x20;

v2.018

* .neko 파일 이슈가 수정되었습니다.

&#x20;

v2.017

* 플레이어 정보에서 다른유저가 장착한 아이템 정보가 안뜨는 문제가 수정되었습니다.
* 펫의 충돌이 펫의 캐릭터 충돌 설정에 따라서 결정되도록 수정되었습니다.
* 인터넷 연결이 안되도 테스트 플레이가 가능하도록 수정되었습니다.
* 업로드 추천(대표 이미지) 사이즈가 변경되었습니다.

&#x20;

v2.016

* 비디오 광고 넣기 기능이 추가되었습니다.(이벤트 - 비디오 AD 보여주기)
* 스킵 가능은 1뷰당 약 0.1 CUBE
* 스킵 불가능은 1뷰당 약 0.2 CUBE가 적립됩니다.
* 현재 베타 버전이라서 추후 변경될수있습니다.
* 출시할때 오류메세지가 발생하는 부분이 수정되었습니다.

&#x20;

v2.015

* 맵 선택창에 \[폴더 기능]이 추가되었습니다.(보기 편한 구조를 위해서 빈 맵파일을 안만들어도 됩니다.)
* .neko 파일이 열 수 없게 되었을 때 사용 가능한 \[복구 기능]을 추가했습니다. (+ 복구 파일 자동 저장 기능)
* 자동저장으로 저장된 설정 불러오기는 파일-프로젝트 복구하기를 선택하시면됩니다.
* 이제 .neko 파일을 더블 클릭하거나 비어있는 에디터에 드래그 하는 형식으로 프로젝트를 열 수 있습니다.
* 도구 메뉴에 \[옵션 창]이 추가되었습니다. (자동 저장, 데이터베이스 최적화 설정)
* 아이템 중 포션과 소모품에만 적용 가능한 \[소모되지 않는 소모품] 옵션이 추가되었습니다.\
  \[소모되지 않는 소모품] 옵션을 체크한 경우 사용해도 아이템의 개수가 줄지 않습니다.
* 각 캐릭터의 이름 크기를 조절할 수 있게 되었습니다.(캐릭터 스프라이트 설정 - 이름 크기 에서 설정하면 됩니다.)
* 캐릭터의 아이템을 회수할 때 사용 가능한 \[착용 중인 아이템은 제외] 옵션이 추가 되었습니다. (스크립트에도 추가된 기능)\
  \[착용 중인 아이템은 제외] 옵션이 활성화 된 경우 착용 중인 아이템을 제외한 아이템만 회수됩니다.
* 창고접근 스크립트가 추가되었습니다.(GetStorageItems,AddStorageItem,RemoveStorageItem)
* 스크롤패널 스크롤 안되는 부분이 수정되었습니다.
* 거래소 설정 기능이 추가되었습니다.(게임 출시할때 거래 수수료율과 거래소 허용여부를 선택가능합니다.)
* 아케이드 샘플 게임이 업데이트 되었습니다.
* 몇가지 추가기능 실제적용은 다음 펑크랜드앱 버전에서 적용될 예정입니다.(2.27 버전 후부터)

&#x20;

v2.014

* 조건분기에서 팀 확인 기능이 추가되었습니다.
* Undo Redo 기록이 128개까지로 제한됨으로 스튜디오의 램 사용 비율이 최적화 되었습니다.
* 랭킹등록 이벤트를 실행하지 않아도 주간랭킹이 자동으로 초기화 되도록 수정되었습니다.(랭킹보기 이벤트 에서 주간랭크 를 체크해주세요)

&#x20;

v2.013

* 아케이드 모드 안정화관련 문제가 수정되었습니다.

&#x20;

v2.012

* Default UI 쿨타임 이미지 동기화 및 투명도 설정 이 추가되었습니다.
* Default UI 스크립트 예제가 개발자 지원센터 - 인터페이스 스크립팅 란에 추가되었습니다.

&#x20;

v2.011

* 인원 최소 설정 버그가 수정 되었습니다.
* 스킬커멘드 이슈가 수정 되었습니다.

&#x20;

v2.010

* 레이아웃 관리자 에서 만든 UI 피봇값이 정상적용되지않던 버그가 수정되었습니다.
* 팀세팅에서 최소 시작 인원수 기능이 추가되었습니다.
* 아케이드는 펑크랜드앱 2.19 버전 이상부터 플레이 가능합니다.
* 아케이드맵 버전이 10/7일자로 실제 적용될예정입니다.

&#x20;

v2.009

* 월드변수가 작동안되는 문제가 수정되었습니다.
* 기본 컨트롤러 이미지변경이 안되는 문제가 수정되었습니다.

&#x20;

v2.008

* 테스트 플레이 상에서의 스크립트 커스텀 UI 위치 문제가 수정되었습니다.
* 게임 유형 글 번역이 수정되었습니다.

&#x20;

v2.007

* json 음수값 파싱이 안되는 부분이 수정되었습니다.
* ai 가 사용하는 스킬의 애니메이션이 랜덤한 위치로 안나오는 문제가 수정되었습니다.
* ScriptImage 의 이미지 변경 함수가 추가되었습니다.
* 레이아웃 관리자 버튼 타입을 Closure 로 설정하면 스크립트 편집기를 활용할 수 있도록 추가되었습니다.
* 레이아웃 관리자 Default\_page 가 추가되었습니다. 기본 컨트롤러와 스킬슬롯,변경 슬롯의 위치,그림 변경 등이 조절 가능해졌습니다.(스크립트로도 조정가능합니다.)
* 베타버전이었던 스킬 커멘드 시스템이 적용되었습니다.
* 스튜디오에 새로 추가되는 '스킬 커맨드'와 '유즈맵'기능은 펑크랜드 앱의 업데이트 이후 실제 게임 내 적용이 됩니다. (9월 말 \~ 10월 초 예정이나 변경될수있습니다.)
* 해당 기능들은 추후 튜토리얼을 제공하도록 하겠습니다.

&#x20;

v2.006

* AddItemOption 사용시 아이템이 증식하는 버그가 수정되었습니다. 옵션추가및 변경되었을때 이벤트 클릭 실행이라면 unit.player.SendItemUpdated(item)을 실행해줘야합니다.
* 이동경로 일본어로 출력되는 부분이 수정되었습니다.

&#x20;

v2.005

* 발자국 사운드 기능이 추가되었습니다(데이터베이스 - 캐릭터 에 있습니다.)
* 클라이언트 스크립트중 isLandscape 기능이 추가되었습니다. 이제 isLandscape == true 이면 가로 false 이면 세로 모드로 확인이 가능해졌습니다.(ScriptCamera를 참고해주세요.)

&#x20;

v2.004

* 미니맵 파일 용량이 최적화 되었습니다.(현재 Maps 폴더에서 \_m붙은 파일을 모두 지우신후 프로젝트를 저장해주시면 줄어든 용량의 미니맵이 생성됩니다.)
* ScriptUtility 에 GetItemOptions,SetItemOption,AddItemOption,RemoveItemOption,RemoveItemOption 기능이 추가되었습니다.
* onLeavePlayer 호출시 플레이어 변수 데이터가 저장되지않던 문제가 수정되었습니다.
* playerLeavePartyCallback 콜백이 추가되었습니다. 유닛이 파티에 탈퇴할때 호출됩니다.
* onAddItem,onRemoveItem 이벤트가 추가되었습니다. 아이템 획득,제거시 호출됩니다.
* 위의 추가된 스크립트 관련 예제는 펑크랜드 개발 지원 센터에 업데이트될 예정입니다.
* 스크립트 신 기능은 펑크랜드 스튜디오에만 기능이 추가된 부분이며 실 서버 적용이 되면 업데이트 내역에 내용을 추가하도록 하겠습니다.

&#x20;

v2.003

* 미니맵 기능이 추가되었습니다. 프로젝트를 저장하면 미니맵용그림이 예)7\_m.png 로 저장됩니다. 레이아웃 관리자 - 미니맵으로 사용 가능합니다.
* 데이터베이스 - 애니메이션 충돌 오프셋으로 인한 충돌표시가 시작크기에 맞게 정상적으로 표시되도록 수정되었습니다.
* 맵이동시, 플레이어 타이머가 꺼지는 현상이 수정되었습니다.
* 데이터베이스 - 시스템 자동회전 기능이 추가되었습니다.(이제 휴대폰을 뒤집으면 자동으로 변경됩니다. 펑크랜드앱 2.6버전이후로 실질적용됩니다.)

&#x20;

v2.001

* 아이콘 이미지크기가 수정되었습니다.

&#x20;

v2.000

* 게임 출시하기 - 탭에서 추천이미지,게임 스크린샷 이미지 등록기능이 추가되었습니다.
* 해당 그림은 리뉴얼된 UI에서 표시됩니다.
* 레이아웃 관리자 파일 내보내기 불러오기 기능이 추가되었습니다.

&#x20;

v1.362

* 게임 출시하기 - uuid 변경시 프로젝트가 저장되도록 수정되었습니다.
* 아이폰 유저는 Nox플레이어시에만 거래요청이 가능하게 되었습니다. 추후 아이폰에 적용되면 다시 공지 올리겠습니다.

&#x20;

v1.361

* 숫자입력이벤트의 음수입력 가능/불가능 기능이 추가되었습니다.
* 조건분기 표시내용이 정상적이게 표현되도록 수정되었습니다.

&#x20;

v1.360

* 스파인 예제 및 기능이 추가되었습니다.
* 기존 똥피하기 예제의 맵 - 캐릭터 선택 에서 스파인 캐릭터 이벤트가 추가되었습니다.
* 맵 - 마을 에서 스파인용 장비 구입 이벤트가 추가되었습니다.
* 스파인 관련 파일은 똥피하기 - SpineProjects - 2d\_character 폴더에 있습니다.
* 상세한 적용방법은 펑크랜드 개발 지원 센터에 업데이트될 예정입니다.

&#x20;

v1.359

* 펫 CancelPetSummon 에러가 수정되었습니다.

&#x20;

v1.358

* 테스트플레이 종료안되는 문제가 수정되었습니다.

&#x20;

v1.357

* 충돌 범위 문제가 수정되었습니다.

&#x20;

v1.356

* 펫 레벨업 기능이 추가되었습니다.(이벤트인 펫 설정에서 조정 가능합니다. 스크립트는 도움말을 참고해주세요.(ScriptPetUnit))
* 펫의 레벨이 추가되면서 펫의 직업에 따른 레벨당 공격력이 펫이 사용한 스킬에 적용됩니다.
* 레이아웃 관리자 버튼 글자 문제가 수정되었습니다.
* 펫 클랜이름이 안뜨도록 수정되었습니다.

&#x20;

v1.354

* 몬스터에게 아이템을 바로 지급하는 기능이 추가되었습니다. (데이터베이스 - 몬스터 -page2 - 직접아이템 지급 체크, 단 그 적을 죽인 사람에게 아이템이 지급됩니다.)
* 스킬의 타겟지정,끌어서 사용 기능이 추가되었습니다. 타겟을 지정한 곳에서 스킬이 시작 됩니다. (데이터 베이스 - 스킬 -스킬사용방식 선택, 데이터베이스 - 스킬 - 지정할 타겟 을 설정하면 됩니다 단 해당 스킬 애니메이션 설정이 해당 스킬설정에 맞게 하셔야됩니다. 예) 타겟지정 - 몬스터 해당 애니메이션은 적과의 충돌이 true 여야 합니다.)
* 스킬이펙트,데미지표시 on/off 기능이 추가되었습니다.
* 레이아웃 관리자가 수정 되었습니다.
* 데이터베이스 불러오기가 수정되었습니다.(이제 정확하게 갯수를 맞추지 않아도 있는부분까지만 불러옵니다. 만약 공백부분이라면 원본에서 설정된 값을 유지합니다.
* 데이터베이스 엑셀 내용에 이미지 경로가 추가되었습니다
* 키보드 관련 버그 수정되었습니다.
* 인벤토리 관련 렉이 최적화 되었습니다.

&#x20;

v1.338

* 직업 설정 변수 버그가 수정되었습니다.
* 업데이트내역 위키 연결 버튼이 추가되었습니다.(도움말 - 업데이트 내역 보기)
* 충돌 크기 작게하고 맵의 끝으로 이동하면 이동불가로 메세지 보내면서 이동되는 문제가 수정되었습니다.
* 드랍된아이템이 1시간이지나면 삭제되도록 수정되었습니다.
* 창고 이용 가능/불가능 기능이 추가되었습니다.(데이터베이스 - 아이템 에서 설정 가능합니다.)
* 스튜디오에서 이벤트들 이름 표시하는 기능이 추가되었습니다.(보기 - 이벤트 이름 보이기)(- 플랫포머 점프 애니메이션이 추가되었습니다.(애니메이션 만들때 이름을 jump\_left,jump\_right,jump 로 설정하면 됩니다.)
* 맵크기가 카메라 크기보다 작아질때 카메라위치가 중간지점에 고정되도록 수정되었습니다.(- 아이템습득,레벨업,아이템사용알림,채팅 표시를 끌 수 있도록 수정되었습니다.(게임안 설정에서 변경가능합니다.)

&#x20;

v1.337

* 검은화면 안없어지는 문제가 수정 되었습니다.

&#x20;

v1.336

* 번역 불러오기시 대사의 줄바꿈이 안되는 부분이 수정 되었습니다.
* 랭킹불러오기시 짤리는 부분이 수정되었습니다.
* 8방향 플레이어 충돌이 안되는 부분이 수정 되었습니다.
* 공격장판스킬 사용후 맵이동시 팀태그가 안바뀌는 부분이 수정되었습니다.

&#x20;

v1.335

* 프로필에 직업 표시가 추가되었습니다.
* 테스트시 TEST\_2이후의 플레이어 스킬레벨,펫등록해제 스크립트가 안되는 버그가 수정되었습니다.

&#x20;

v1.334

* 8방향 중력적용 y값 이벤트 충돌이 수정되었습니다.
* 게임 출시 회원가입 버튼이 추가되었습니다.
* 가방과 창고 창의 스크롤추가와 창고 최대 제한이 해제 되었습니다.
* 피로도 선택을 안할시 프로필창에서 피로도 표시가 안되게 수정 했습니다.

&#x20;

v1.333

* 버튼 위치 버그가 수정되었습니다.

v1.332

* 펫 소환,펫 등록해제 펫 소환 해제 스크립트 명령어가 추가 되었습니다.
* 펫 소환 탭,캐릭터 선택 변수 지정이 추가되었습니다.
* 스크립트 갱신 /reloadscript 명령어가 추가되었습니다. Test 플레이 시에만 사용가능합니다
* 플랫포머 이벤트 y축 충돌 안되는 부분이 수정 되었습니다.

v1.331

* damageFormula ? 버튼이 추가되었습니다.

v1.330

* 스킬 레벨 시스템이 추가되었습니다. 이제 스킬 demageFormula 에서 a.atk - b.def + (level +10) 같은 방법으로 사용가능해집니다.
* 스킬 레벨 설정 이벤트가 추가되었습니다.
* 직업 설정이벤트에 변수가 추가되었습니다.
* 직업 변경시 스킬 유지 체크박스가 추가되었습니다. 체크할경우 직업이 변경될때 같은 스킬의 스킬레벨이 더 높은 쪽으로 계승됩니다.
* 이제 스킬 창의 레벨은 해당 스킬의 레벨로써 표시됩니다. 스킬레벨 제한은 해당스킬 설명 창에 {{learnLevel}}을 입력하면 직업탭에서 설정된 기본 스킬의 습득레벨이 설정됩니다.
* 테스트 플레이중 창에서 스크립트를 바로 실행시킬수 있는 란이 추가되었습니다.

&#x20;

v1.327

* 일부 스크립트 사용시, 서버가 crash 되던 문제 수정(Pet Script의 AddMasterBuff)- 클라이언트 스크립트 문제 수정. (Array error)
* 애니메이션 Idle(대기 상태일때 애니메이션) 추가- (스프라이트 액션 이름을 idle로 하시면 됩니다. idle\_left, idle\_right, idle\_up, idle\_down 도 사용 가능)
* 모바일 색조 & 조명 미작동 버그 수정

&#x20;

v1.326

* 큐브 구매시 약관 버튼이 추가되었습니다.
* \[게임 관리자 페이지]에 큐브 환불 시스템이 추가되었습니다.

&#x20;

v1.325

* 파티클 시스템이 추가되었습니다.
* 스탯창 증식 문제가 수정되었습니다.- 클랜 탈퇴 인원수 변동 문제가 수정되었습니다.
* 특성 창이 한글화 되었습니다.

&#x20;

v1.324

* 아이템 스탯 증가 버그 수정
* 아이템 분류 추가

&#x20;

v1.315

* 쿠폰기능이 추가되었습니다.
* 쿠폰은 내프로필 → 내게임 관리하기 →쿠폰 클릭 이름,최대 쿠폰 사용횟수 를 지정 →생성-
* →펑크랜드 스튜디오 쿠폰사용 이벤트 사용 → Success,fail,cancelled 에 따라서 이벤트지정-
* → 인게임에서 이벤트를 실행 → 생성된 쿠폰이름 입력 → Success,fail,cancelled 에따른 이벤트 발생

&#x20;

v1.314

* 조건분기 스크롤 짤림문제가 수정되었습니다.
* 경험치, 데미지, 그림회전 각도 이벤트 변수 지정기능이 추가되었습니다.
* 말하기, 알림 이벤트 도움말이 추가되었습니다.
* 플랫포머 끼임 문제가 수정되었습니다.
* 플랫포머 샘플 게임이 추가되었습니다. (똥피하기 + PvP)

&#x20;

v1.309

* 도움말이 업데이트 되었습니다.

&#x20;

v1.308

* 이동 이벤트에 채널 이동 기능이 추가되었습니다.
* 맵 설정창에 채널개수와 최대인원 기능이 추가되었습니다.
* 데이터베이스 몬스터에 지형과의 충돌 해제/설정 기능이 추가되었습니다.
* 게임별 인기상품 목록을 확인할 수 있습니다.

v1.302

* 친구목록이 수정되었습니다.

&#x20;

v1.301

* 버프 재접속시 안보이는 문제가 해결되었습니다.
* 스프라이트 설정 충돌 박스 싱크가 수정 되었습니다.

&#x20;

v1.300

* 쿨타임 테이블 싱크 문제가 해결되었습니다.
* 버프의 싱크부분은 클라이언트 출력 상의 문제 이기 때문에 실질적인 적용부분은 문제없었습니다.

&#x20;

v1.298

* 클라이언트 스크립트 ScriptControl에 showOnTop 가 추가되었습니다.
* ex) button.showOnTop = true 기본UI보다 앞 false면 뒤

&#x20;

v1.297

* 리스폰 표시 문제가 해결되었습니다.

&#x20;

v1.296

* 이벤트 캐릭터 출력 문제가 해결되었습니다.

&#x20;

v1.295

* 스파인 애니메이션이 추가되었습니다.

&#x20;

v1.294

* \[리소스 관리자] → Characters →\[설정] 스프라이트 설정에 이름 위치조정, 충돌 위치조정 및 크기 조정이 추가되었습니다.
* 충돌적용은 캐릭터에만 적용됩니다.
* 미리보기 탭에서 범위 표시 확인이 가능합니다.
* 데이터 베이스의 몬스터 공격범위가 추가되었습니다.

&#x20;

v1.293

* \[도구] → \[번역파일 내보내기] 기능을 통해, 게임내 모든 텍스트를 번역할 수 있습니다.
* (꼭 프로젝트 파일을 먼저 백업 해주세요.)
* (프로젝트/맵이 변경되면 \[번역파일 불러오기]시 오작동할 수 있습니다.)

&#x20;

v1.292

* 그림없는 이벤트의 충돌처리가 수정되었습니다.

&#x20;

v1.291

* 영어 버전 샘플 게임 추가

&#x20;

v1.290

* 주변광 설정이 추가되었습니다.( 리소스 관리자 - 설정에서 변경 가능합니다.)
* 샘플 게임이 추가되었습니다(프로젝트 생성 Basic RPG Game을 만들면 확인가능합니다.)
* 샘플 게임은 지속적으로 기능추가 예정입니다.

&#x20;

v1.288

* 펫의 공격으로 죽은 적의 경험치는 주인에게 가도록 변경되었습니다.
* 펫의 삭제가 유닛이 나간후 사라지도록 수정되었습니다.
* 조건분기의 타이머가 수정 되었습니다.
* 플레이어 팝업 창에서 플레이어의 정보를 볼 수 있도록 추가되었습니다.- /kill 5 명령어로, 게임 재부팅을 해야 업데이트 내용이 적용됩니다.

&#x20;

v1.284

* 지속 데미지 공식이변경되었습니다.
* 상태 탭의 공식 란에 a 는 버프를건 유닛 b는 버프를 받은 유닛입니다.
* 단 a는 null 일수 있으니 스킬등록시 주의 부탁드립니다.

&#x20;

v1.283

* 펫 기능이 추가되었습니다.
* 펫 소환(해당 펫을 등록하고 소환합니다. 이미 펫이 등록되어있다면 등록된 펫을 소환합니다.)
* 펫 소환해제
* 펫 등록해제
* 펫 의 커스텀 AI 가 추가되었습니다.
* 지속 데미지 상태가 추가되었습니다.


# 시작하기


# 펑크랜드 스튜디오 다운로드

[펑크랜드 스튜디오 다운로드](https://get.nekoland.net/)를 클릭하면, 바로 다운로드가  가능합니다.

[펑크랜드 소개 페이지](https://punkland.io/about)에서도 다운로드받을 수 있습니다.

* 펑크랜드 PC 스튜디오는 윈도우 버전만 지원합니다.
* 펑크랜드 스튜디오는 최신 .Net framework 를 필요로 합니다. 펑크랜드 스튜디오 실행시 오류가 뜬다면, [닷넷 프레임워크](https://www.microsoft.com/ko-kr/download/details.aspx?id=49982) 를 설치하신 후 재부팅 해주세요.

<figure><img src="/files/wL1Ecl6Whf6xfELtS33M" alt=""><figcaption><p>다운로드 받은 설치파일을 실행 후 Next></p></figcaption></figure>

<figure><img src="/files/tSMZgdsZOWcd7n4v2MyF" alt=""><figcaption><p>설치 경로 선택 후 Next></p></figcaption></figure>

<figure><img src="/files/ebdK74SWDZdxHTC3F7nH" alt=""><figcaption><p>한번 더 Next> 를 누르면 설치가 진행됩니다.</p></figcaption></figure>


# 버전 확인 및 업데이트

펑크랜드 스튜디오를 실행하면 최신 버전 업데이트 팝업창이 표시됩니다.

<figure><img src="/files/A3vu7tE8dyWtCIyoo3fp" alt=""><figcaption><p>Update 버튼 클릭</p></figcaption></figure>

\[업데이트] 버튼을 클릭하면, 소프트웨어 업데이트 팝업창이 뜨고, 업데이트 진척도를 확인 할 수 있습니다. 업데이트 완료 되면 펑크랜드 스튜디오가 열립니다. 아래 스크린샷 참고 바랍니다.

<figure><img src="/files/tYV9RxXT0IOOoXs5PVR7" alt=""><figcaption></figcaption></figure>


# 신규 프로젝트 생성

최신 버전 업데이트가 완료된 펑크랜드 스튜디오 실행 시 아래와 같이 초기 화면이 표시됩니다.

<figure><img src="/files/oAQwR9aYqom6d6gv1T2B" alt=""><figcaption></figcaption></figure>

\[New Project] 버튼을 눌러 신규 프로젝트를 생성할 수 있습니다.

프로젝트명, 경로, 실행 플랫폼, 해상도를 설정하고, \[Create] 버튼을 누르면 신규 프로젝트가 생성되고 자동으로 프로젝트가 실행됩니다.

<figure><img src="/files/kz2RiC0gm1CNjhvgTU9Y" alt=""><figcaption></figcaption></figure>


# 맵  만들기

## &#x20;<a href="#undefined" id="undefined"></a>


# 신규 맵 생성

**1. 신규 맵 생성**

인트로, 사냥터, 마을 등 플레이어가 이동하는 무대인 \[맵]을 생성합니다.

\[네코샘플] 폴더를 우클릭합니다. 아래와 같이 \[새로운 맵] 팝업 메뉴가 뜨면, \[새로운 맵]을 클릭합니다.

<figure><img src="/files/SU2ChQK5u7ZVuB7NqjNz" alt=""><figcaption></figcaption></figure>

팝업창이 뜨면 (아래 스크린샷 참조 바랍니다)

\[이름] \[크기] \[타일셋] \[BGM 변경] \[BGS 변경] \[싱글 플레이] \[인스턴스 맵] \[중력] \[채널 개수] \[최대 인원]을 설정하고, \[확인]을 클릭합니다.

<figure><img src="/files/0t8axaymJI7H7gEvtNdb" alt=""><figcaption></figcaption></figure>

* 이름: 편집 중인 맵 이름을 설정합니다. 게임 내용과는 관련 없으므로, 어떠한 맵인지 알기 쉽게 설정하면 됩니다.
* 크기(가로/세로): 맵 크기를 여기서 설정합니다.
* 타일셋:맵 만들기에 사용할 맵 타일을 설정합니다. 배경 맵을 만들려면 \[002:배경타일]을 선택하고, 마을을 만들려면 \[000:Town]을 선택하는 등, 만들려는 맵에 맞는 타일셋을 선택합시다.
* BGM 변경:
* BGS 변경:
* 싱글 플레이:
* 인스턴스 맵:
* 중력:
* X, Y:
* 채널 개수:
* 최대 인원:

&#x20;

**2. 맵 만들기 예시**

예를들면, \[이름]을 test, \[크기]를 가로 16 / 세로 16, \[타일셋]을 000:Town, \[인스턴트 맵]에 체크를 하고, \[확인]을 클릭했을때, 생성되는 맵은 아래 스크린샷을 참조 바랍니다.

<figure><img src="/files/Im3K50j8uU0zSPvYc7AU" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/MkfvN28brnrYz9qyNRzb" alt=""><figcaption></figcaption></figure>


# 하위 맵 생성

기존맵에서 더 상세하게 편집하기 위하여, 하위 맵을 생성하는 방법은 신규 맵 생성과 같은 방식으로 진행하면 됩니다. 예를들면, \[test]맵에 하위 맵\[test1]을 만들려면, \[test]를 우클릭하여 뜨는 팝업창에서 \[새로운 맵]을 클릭하면,

<figure><img src="/files/bXltAe8JWakQV2vGtSZS" alt=""><figcaption></figcaption></figure>

\[맵 만들기] 팝업창이 뜨고, 해당 창에서 \[이름] \[크기] \[타일셋] \[BGM 변경] \[BGS 변경] \[싱글 플레이] \[인스턴스 맵] \[중력] \[채널 개수] \[최대 인원]을 설정하고, \[확인]을 클릭합니다.

\[이름], \[크기], \[타일셋]을 아래 스크린샷과 같이 설정하고, \[확인] 버튼을 클릭하면,

<figure><img src="/files/c1JHjuRIl0q0f7WZNWFS" alt=""><figcaption></figcaption></figure>

\[test\_1]맵이 생성 됩니다.

<figure><img src="/files/xrKUiDR5RKY1lmm8UkwN" alt=""><figcaption></figcaption></figure>

마찬가지 방식으로 \[test\_2]맵도 생성 가능합니다.

<figure><img src="/files/hrPuCJ5oOTI1rb3mmzlx" alt=""><figcaption></figcaption></figure>


# 맵 편집

맵을 편집합니다. 타일 팔레트에서 맵에 배치하고 싶은 타일을 클릭 혹은 드래그해서 여러개 선택합니다.

그리기 도구 4가지 중, 원하는 도구를 선택해서 타일을 배치하면 됩니다.

<figure><img src="/files/p3vUZFk3FfRZMD4raZRa" alt=""><figcaption></figcaption></figure>

위에 스샷에 도구는 순차적으로, \[펜그리기], \[사각형 그리기], \[원 그리기], \[칠하기] 입니다.

**1. \[펜 그리기]**

\[펜 그리기]를 사용하여 타일을 배치한 예시입니다.

왼쪽 타일 팔레트에서 타일을 클릭 혹은 드래그해서 선택합니다.

선택된 타일은 빨간색 테두리로 표시 됩니다.

\[펜 그리기] 도구를 클릭하여, 선택되었음을 확인 합니다.

클릭 혹은 드래그해서 원하는 모양으로 자유롭게 배치 가능합니다.

<figure><img src="/files/ZFNkHEfr8BnEm27YcTJ7" alt=""><figcaption></figcaption></figure>

**2. \[사각형 그리기]**

\[사각형 그리기]를 사용하여 타일을 배치한 예시입니다.

왼쪽 타일 팔레트에서 타일을 클릭 혹은 드래그해서 선택합니다.

선택된 타일은 빨간색 테두리로 표시 됩니다.

\[사각형 그리기] 도구를 클릭하여, 선택되었음을 확인 합니다.

클릭 혹은 드래그해서 원하는 모양으로 자유롭게 배치 가능합니다.

<figure><img src="/files/GU5W3L9tl4aL0NyD5v57" alt=""><figcaption></figcaption></figure>

**3. \[원형 그리기]**

\[원형 그리기]를 사용하여 타일을 배치한 예시입니다.

왼쪽 타일 팔레트에서 타일을 클릭 혹은 드래그해서 선택합니다.

선택된 타일은 빨간색 테두리로 표시 됩니다.

\[원형 그리기] 도구를 클릭하여, 선택되었음을 확인 합니다.

클릭 혹은 드래그해서 원하는 모양으로 자유롭게 배치 가능합니다.

<figure><img src="/files/kFnRMJum7qX6l1kGtHto" alt=""><figcaption></figcaption></figure>

**4. \[칠하기]**

\[칠하기]를 사용하여 타일을 배치한 예시입니다.

왼쪽 타일 팔레트에서 타일을 클릭 혹은 드래그해서 선택합니다.

선택된 타일은 빨간색 테두리로 표시 됩니다.

\[칠하기] 도구를 클릭하여, 선택되었음을 확인 합니다.

클릭 혹은 드래그해서 원하는 부분에 칠하기 가능합니다.

<figure><img src="/files/bDy6ZiDSF6nD8pjBo0X2" alt=""><figcaption></figcaption></figure>

**5. \[잘라내기]**

마을맵에서 잘라내기를 사용하여 일부를 잘라내서 오른쪽으로 옮겨 놓은 예시 입니다.

<figure><img src="/files/mk2GkzIO4ELrf01qpMZC" alt=""><figcaption></figcaption></figure>

**6. \[맵보기 확대 혹은 축소]**

<figure><img src="/files/HiJDzTOaHNrbdt9gBJ8O" alt=""><figcaption></figcaption></figure>

**6.1 \[1/1 화면 예시]**

<figure><img src="/files/pKdZqJnhnza0L5CBqGkH" alt=""><figcaption></figcaption></figure>

**6.2 \[1/2 화면 예시]**

<figure><img src="/files/NLJ6Gyko5ha8RCKcjeu3" alt=""><figcaption></figcaption></figure>

**6.3 \[1/4 화면 예시]**

<figure><img src="/files/gUYU1FL1Lb9PRMPlModb" alt=""><figcaption></figcaption></figure>


# 스튜디오 인터페이스

<figure><img src="/files/dqfghpFKZ6hv3xSHVu0R" alt=""><figcaption></figcaption></figure>

{% tabs %}
{% tab title="A" %}
메인 메뉴
{% endtab %}

{% tab title="B" %}
Tool 바
{% endtab %}

{% tab title="C" %}
&#x20;각종 타일이 표시 되는 곳 입니다.
{% endtab %}

{% tab title="D" %}
각종 맵을 생성하고 편집 할 수 있습니다.
{% endtab %}

{% tab title="E" %}
편집하고 있는 맵을 보여줍니다. 예를들면, \[캐릭터 선택창]을 편집할때 보여지는 화면은 아래와 같습니다.
{% endtab %}

{% tab title="F" %}
선택한 맵 이름, 선택한 맵 사이즈, 맵 표시 비율(1/1, 1/2, ¼) 이 표시 됩니다.
{% endtab %}
{% endtabs %}

<figure><img src="/files/sgapJ3nARlrG5uTFe8ac" alt=""><figcaption></figcaption></figure>


# \[파일]탭

\[파일]탭에는 {새 프로젝트] \[프로젝트 열기] \[프로젝트 닫기] \[프로젝트 저장] \[끝내기] 버튼이 있습니다. 용도에 따라 각 버튼을 클릭하면 됩니다.

<figure><img src="/files/ia0ayhngLjzyEvVTll3q" alt=""><figcaption></figcaption></figure>


# \[편집]탭

\[편집]탭에는 \[실행 취소] \[다시 실행] \[자르기] \[복사] \[붙여넣기] \[삭제] 버튼이 있습니다. 아래 스크린샷 빨간 네모 안에 아이콘 버튼은 순차적으로 \[자르기] \[복사] \[붙여넣기] \[삭제] 아이콘 입니다.

<figure><img src="/files/Z6gM9pBAOn6KdMOTdQEG" alt=""><figcaption></figcaption></figure>

<br>


# \[보기]탭

\[보기]탭에는 \[현재 및 하위 레이어 보기] \[모든 레이어 보기] \[현재 레이어가 아니면 흐리게] \[충돌 영역 표시하기] \[레이어1] \[레이어2] \[레이어3] \[레이어4] \[스마트 레이어] \[이벤트 레이어] \[1/1] \[1/2] \[1/4] \[이벤트 이름 보기] 버튼이 있습니다.

\[보기]탭에서 각 메뉴를 선택했을때 보이는 화면 스크린샷은 아래와 같습니다.

<figure><img src="/files/vM2nnr3sfVb3kDPGuJ0V" alt=""><figcaption></figcaption></figure>

## **1. \[현재 및 하위 레이어 보기]**

마을맵에서 해당 기능을 선택했을때 보이는 화면은 아래와 같습니다.

<figure><img src="/files/FutOhOdv38LW0hM8Krsc" alt=""><figcaption></figcaption></figure>

## **2. \[모든 레이어 보기]**

마을맵에서 해당 기능을 선택했을때 보이는 화면은 아래와 같습니다.

<figure><img src="/files/0ObAifS1OHxtz4YzC4bz" alt=""><figcaption></figcaption></figure>

## **3. \[현재 레이어가 아니면 흐리게]**

마을맵에서 해당 기능을 선택했을때 보이는 화면은 아래와 같습니다.

<figure><img src="/files/qBUK09tFW3yDVo3HmHnI" alt=""><figcaption></figcaption></figure>

## **4. \[충돌 영역 표시하기]**

마을맵에서 해당 기능을 선택했을때 빨간색으로 충돌 영역을 표시해 줍니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/exOdnXcaGzqX5OhLb3ht" alt=""><figcaption></figcaption></figure>

## **5. \[레이어1] \[레이어2] \[레이어3] \[레이어4]**

\[보기] 탭에서 선택 가능하며, 아래 아이콘 클릭을 통해서도 선택 가능합니다.

<figure><img src="/files/bUnsgTQ7RFRsAf25ukV9" alt=""><figcaption></figcaption></figure>

**\[레이어1]**

마을맵에서 레이어1을 선택했을때 보이는 화면 예시 입니다.

<figure><img src="/files/Ydw5z6AZ8WPfP268hGx8" alt=""><figcaption></figcaption></figure>

**\[레이어2]**

마을맵에서 레이어2를 선택했을때 보이는 화면의 예시 입니다.

<figure><img src="/files/UKFqVpTu4HAica9VjhQz" alt=""><figcaption></figcaption></figure>

**\[레이어3]**

마을맵에서 레이어3을 선택했을때 보이는 화면의 예시 입니다.

<figure><img src="/files/uOAOeCXEpkbkTVFr0dFs" alt=""><figcaption></figcaption></figure>

**\[레이어4]**

마을맵에서 레이어4를 선택했을때 보이는 화면 예시 입니다.

<figure><img src="/files/X6iOI6jhHUcjeB39VUje" alt=""><figcaption></figcaption></figure>

## **6. \[스마트 레이어]**

마을맵에서 스마트 레이어를 선택했을때 보이는 화면 예시 입니다.

<figure><img src="/files/ZouboIhCPcK5FLh0GdhL" alt=""><figcaption></figcaption></figure>

## **7. \[이벤트 레이어]**

마을맵에서 이벤트 레이어를 선택했을때 보이는 화면 예시 입니다.

<figure><img src="/files/DJA5InS1vznD57m8yQVv" alt=""><figcaption></figcaption></figure>

이벤트 레이어는 툴바에서도 선택 가능합니다.

## **8. \[1/1]**

마을맵에서 1/1을 선택했을때 보이는 화면 예시 입니다.

<figure><img src="/files/K0sX28Q9d0wxego95hjb" alt=""><figcaption></figcaption></figure>

## **9. \[1/2]**

마을맵에서 1/2를 선택했을때 보이는 화면 예시 입니다.

<figure><img src="/files/Z9Lfli6avDTxlDmlIbi4" alt=""><figcaption></figcaption></figure>

## **10. \[1/4]**

마을맵에서 1/4를 선택했을때 보이는 화면 예시 입니다.

<figure><img src="/files/RY2u5zk2iD7TTpp4T8p9" alt=""><figcaption></figcaption></figure>

**11. \[이벤트 이름 보이기]**\
마을맵에서 이벤트 이름 보이기를 선택했을때 보이는 화면 예시 입니다. 아래 스크린샷에서 빨간색으로 표기해둔 부분에 이벤트 이름이 표시되어 있습니다.

<figure><img src="/files/HOAdFbAMxHwscBwyqaeB" alt=""><figcaption></figcaption></figure>


# \[게임]탭

\[게임]탭에는 \[테스트 플레이] \[테스트 데이터 초기화] \[ 게임 출시하기] 메뉴가 있습니다.

<figure><img src="/files/UmN1gW0bApWRk41Twu6U" alt=""><figcaption></figcaption></figure>


# \[도구]탭

\[도구]탭에는 \[데이터베이스] \[리소스 관리자] \[레이아웃 관리자] \[스크립트] \[MP3 -> OGG 변환기] \[번역파일 내보내기] \[번역파일 불러오기] \[리소스 마켓] \[데이터 내보내기] \[데이터 불러오기] 메뉴가 있습니다.

<figure><img src="/files/k0xKEYmW5vMI57fijdPo" alt=""><figcaption></figcaption></figure>


# 테스트 플레이 진행

**1. 테스트 플레이 화면 진입하기**

\[게임]탭을 클릭하고, \[테스트 플레이]를 클릭하거나, 혹은 툴바에 있는 테스트 플레이 아이콘 클릭으로, 테스트 플레이 가능합니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/r5Q1rqrQbreiFtcibJRB" alt=""><figcaption></figcaption></figure>

테스트 플레이를 진행하려면, 우선 편집한 내용을 저장해야만 테스트 플레이 가능하다는 팝업창이 뜹니다.

<figure><img src="/files/X5nKS91ACFvSs5RS6Ih2" alt=""><figcaption></figcaption></figure>

해당 창에서 \[확인]을 클릭해서 편집 내용을 저장하면, 테스트 플레이가 시작 됩니다. 아래 화면 참조 바랍니다.

<figure><img src="/files/G4mPATPUY0IEJvw2tQEl" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/weNnFNDRvh29h1edE6XD" alt=""><figcaption></figcaption></figure>

**2. \[캐릭터 선택창]에서 캐릭터 선택하기**

오른쪽 하단의 빨간색 네모안에 보이는 손가락 아이콘이 있는 곳을 계속 클릭하면 캐릭터 선택창에 진입하게 됩니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/wp2ZuBAugkOsA7QFgcWZ" alt=""><figcaption></figcaption></figure>

캐릭터 선택창에 입장하면 왼쪽 하단에 있는 터치패드 조작을 통해 맵에서 위로 이동하여, 4명 캐릭터 중에서 원하는 캐릭터를 선택합니다.

<figure><img src="/files/BIJD9yl2o0n59dS6SZAn" alt=""><figcaption></figcaption></figure>

예를 들면, 도적을 선택했을 경우, 아래와 같이 “독적을 선택하시겠습니까? 라는 메시지가 뜹니다.

<figure><img src="/files/oOAZvlpKLAgQNczlwaUr" alt=""><figcaption></figcaption></figure>

오른쪽 하단의 손가락 아이콘 부분을 계속 터치하면, “네” “아니요” 선택 메세지가 뜹니다.

<figure><img src="/files/DtsDFM1H6FfU7i7o8aMx" alt=""><figcaption></figcaption></figure>

“네”를 클릭하여 도적을 선택하면 됩니다.

한단 중앙에 있는 \[마을로] 를 통해 마을맵에 입장 가능합니다.

<figure><img src="/files/zVjBHyuhz1DbjVWXzdSw" alt=""><figcaption></figcaption></figure>

마을맵에 입장할려고 하면 다시 한번 “정말 이직업으로 선택 하겠습니까?”라는 메시지가 뜹니다.

<figure><img src="/files/z5BW9qRR2AlfgMmq6Uzl" alt=""><figcaption></figcaption></figure>

오른쪽 하단의 손가락 아이콘을 클릭하면 “예” “ 아니요” 선택 메시지가 나타납니다.

<figure><img src="/files/9okbuR8JSZjeOc67IGs5" alt=""><figcaption></figcaption></figure>

“예”를 클릭하고 마을맵에 입장합니다. 아래 마을맵에 입장한 예시 입니다.

<figure><img src="/files/P8dCoJtPgE7j6iRVEoZe" alt=""><figcaption></figcaption></figure>

**3. 퀘스트 진행하기**

예를 들면, 한번만 퀘스트를 클릭하면, 아래 스크린샷과 같은 메시지 “재료 10개를 구해오면 1000골드를 주겠네” 가 나타납니다.

<figure><img src="/files/FHJLHDBr2xQH7dbc0QGy" alt=""><figcaption></figcaption></figure>

오른쪽 하단의 손모양 아이콘을 2번 클리하면, “수락하겠습니까” “예” “아니요” 메세지가 나타납니다.

<figure><img src="/files/eTOb4OpQktmNtU5sDpak" alt=""><figcaption></figcaption></figure>

“예”를 클릭하고,사냥터로 이동하여 퀘스트 내용에 따라 사냥을 진행 하면 됩니다.

아래 스크린샷은 사냥터 맵 입니다. 사냥이 끝나면 화면 오른쪽의 \[마을로]를 통해 마을맵에 이동 가능합니다.

<figure><img src="/files/uUeaPXgBLXA8pVhBDXwT" alt=""><figcaption></figcaption></figure>

**4. \[구입상인] 예시**\
마을맵에서 \[구입상인] 클릭 했을 경우의 예시 입니다.

\[구입상인] 아이콘을 클릭하면 “뭐든지 삽니다”라는 메시지가 나옵니다.

<figure><img src="/files/1IxitUQo19nUFCS2RHA5" alt=""><figcaption></figcaption></figure>

오른쪽 하단 손모양 아이콘을 클릭하면, \[판매상점으로] \[나가기] 선택창이 나옵니다. \[판매상점으로]를 클릭하여, 이동해 보겠습니다.

<figure><img src="/files/oOnKbGHojNxLhhFBaDlZ" alt=""><figcaption></figcaption></figure>

아이템 판매 팝업창이 뜹니다. 여기에서 체력포션 10개를 판매 해 보도록 하겠습니다. (아래 스크린샷 참조 바랍니다.)

<figure><img src="/files/XCfZ5OWVxrzTkZynho5U" alt=""><figcaption></figcaption></figure>

체력포션 부분을 클릭하면 아래 빨간 네모와 같은 체력포션 판매 팝업창이 뜹니다. (아래 스크린샷 참조 바랍니다.)

<figure><img src="/files/ZLFOO5Q8bfIe9CUO9k4X" alt=""><figcaption></figcaption></figure>

\[Sell]를 클릭하고, 판매 할 아이템 개수 입력후, 확인을 클릭하면,

<figure><img src="/files/p99UXxvBLaU3V6aGLUra" alt=""><figcaption></figcaption></figure>

“체력포션 10개를 팔았습니다”라는 안내 메시지가 뜹니다.

<figure><img src="/files/pOrFe6IMLz6cc4vGG471" alt=""><figcaption></figcaption></figure>

**5. \[판매상인] 예시**

\[판매상인]을 통해 아이템을 구매 할 수 있습니다.

\[판매상인]을 클릭하면 아래와 같은 안내 메시지가 나타납니다.

<figure><img src="/files/lt7cxUj93bZJd4SgyJVR" alt=""><figcaption></figcaption></figure>

오른쪽 하단 손모양 아이콘을 클릭하면, 무기/방어구/기타/닫기 선택창이 나옵니다.

<figure><img src="/files/Zony14eoKYpCnxpzhkwy" alt=""><figcaption></figcaption></figure>

무기를 한번 구매해 보도록 하겠습니다. 무기 버튼을 클릭하면, 아래와 같은 팝업창이 뜹니다.

<figure><img src="/files/XsiudlRwwBR9SRoZ1J4C" alt=""><figcaption></figcaption></figure>

\[궁수무기]를 클릭하면 궁수무기 안내 팝업창이 뜹니다.

<figure><img src="/files/tI0QwfzMsQY5kJafb90r" alt=""><figcaption></figcaption></figure>

구매하기 버튼을 클릭하고 아이템 개수를 입력 후, 확인 버튼을 클릭하면 구매를 완료할수 있습니다.

<figure><img src="/files/evxpCfg539fKa39CW1wM" alt=""><figcaption></figcaption></figure>

“궁수무기 아이템을 구매했습니다!” 라는 안내 메시지가 표시됩니다.

<figure><img src="/files/IHeTmq1RKWp1dztETtR0" alt=""><figcaption></figcaption></figure>

\[판매상인]을 클릭하고, 방어구 버튼을 선택합니다.

<figure><img src="/files/HKtCV57UquwoUFIQGsrB" alt=""><figcaption></figcaption></figure>

\[신발] 버튼을 클릭하면, 신발 구매 팝업창이 뜹니다.

<figure><img src="/files/496TIfZM5Nxq26uXJVQM" alt=""><figcaption></figcaption></figure>

\[구매하기] 버튼 클릭후, 아이템 개수 입력후 \[확인]을 클릭 합니다. 아래 예시 스크린샷 참조 바랍니다.

<figure><img src="/files/yti4PJYAlv5L2TmlwlRU" alt=""><figcaption></figcaption></figure>

“신발 아이템을 구매했습니다!” 라는 안내 메시지가 표시됩니다.

<figure><img src="/files/dm4vdVn5SKWOMXGWB9SO" alt=""><figcaption></figcaption></figure>

\[기타] 를 클릭하면, \[체력포션] \[마나포션] \[재료]를 구매 가능합니다.

<figure><img src="/files/7dPBtNjiAb3io92RnEmf" alt=""><figcaption></figcaption></figure>

**6. \[가방]**

게임 플레이를 통해서 획득한 아이템, 상점에서 구매한 아이템 등은, 화면 상단 오른쪽에 있는 가방 아이콘을 클릭하면 확인 가능합니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/AgZWeFPwHmHo4WIRindk" alt=""><figcaption></figcaption></figure>

**7. 아이템 사용하기**

무기는 \[슬롯등록]을 통해 장착 가능하고, 방어구는 \[사용]을 통해서 사용 가능합니다. 필요없는 아이템은 \[버리기] 버튼 클릭으로 버리기 가능합니다.

<figure><img src="/files/xGUEihKnmewllYmdZZzy" alt=""><figcaption></figcaption></figure>

임의의 무기를 클릭하면 아이템 설명 팝업창이 뜹니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/r6nAGEomqI109P3YKkvh" alt=""><figcaption></figcaption></figure>

\[슬롯등록]을 클릭하면, 슬롯 장착 화면이 나타납니다. 원하는 슬롯을 클릭해서 장착하면 됩니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/VcClC70tgPl7EvvjVVuV" alt=""><figcaption></figcaption></figure>

방어구를 클릭하면 아이템 설명 팝업창이 뜹니다. \[사용]을 클릭하면 사용 가능합니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/4TmUBjFI9EIaymTBWPuX" alt=""><figcaption></figcaption></figure>

방어구가 사용 되었을 경우, 해당 방어구 오른쪽 상단에 그린색 “E” 문자가 나타납니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/ou7SWwFrv19WZ205TOT3" alt=""><figcaption></figcaption></figure>

기타 아이템 중, 마나포션을 사용해 보도록 하겠습니다. 아래 스크린샷 마나포션을 클릭하면, 마나포션 설명 팝업창이 뜹니다.

<figure><img src="/files/cLDnaDG2NAvQ6KgmHB9N" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/LqTqSA4bMKj6Jac7SFbn" alt=""><figcaption></figcaption></figure>

사용을 클릭하면, “마나포션 1개 사용했습니다”라고 팝업 메세지가 뜹니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/pEkrzCNAdMs5rSOR7XuN" alt=""><figcaption></figcaption></figure>

**8. \[이동소] 입장하기**

마을맵에서 \[이동소]\(하단 빨간 네모 참조 바랍니다.)로 입장하면, \[이동소]맵으로 이동 가능합니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/eF6uWd5QELafxi04G1AE" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/BJuI7OaOb28UfF5z71cW" alt=""><figcaption></figcaption></figure>

**9. \[배경효과방으로]으로 입장하여 기타방 입장하기**

\[배경효과방으로] 입장하면, 각종 방 ( \[주변광방으로] \[타일배경방으로] \[포그방으로] \[파노라마방으로] \[날씨방으로] )으로 이동 가능한 맵에 입장하게 됩니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/BdN1lF8IRqbrhH9wvsYY" alt=""><figcaption></figcaption></figure>

**10. \[파노라마방으로] 입장한 예시**

<figure><img src="/files/LMfWwJFX6phpYrFHD9Nk" alt=""><figcaption></figcaption></figure>

**11. \[포그방으로] 입장한 예시**

<figure><img src="/files/NJVG4hqlak54CEN8rAim" alt=""><figcaption></figcaption></figure>

**12. \[날씨방으로] 입장한 예시**

<figure><img src="/files/3LdTXIUPwuiYYNZIQefq" alt=""><figcaption></figcaption></figure>

**13. \[주변광방으로] 입장한 예시**

<figure><img src="/files/72uajuSRS8wut1N3TOZC" alt=""><figcaption></figcaption></figure>

아래 스크린샷은 \[3초간 불켜기] 아이콘을 클릭했을때 전체 방이 밝아지는걸 확인 할 수 있습니다.

<figure><img src="/files/bLwN5WFAlacHei1Vb28F" alt=""><figcaption></figcaption></figure>

**14. \[타일배경방으로] 입장한 예시**

<figure><img src="/files/SPO3Kl3ptdrUZCtDTWiZ" alt=""><figcaption></figcaption></figure>

**15. 채팅창 사용 예시**

채팅창 왼쪽 \[전체] 아이콘을 클릭하면, 채팅 상대 선택창이 나타납니다.

\[전체] \[귓속말] \[@없음] \[클랜] \[파티] 중에서 하나를 선택하여 채팅을 진행할 수 있습니다.

<figure><img src="/files/amQD5XzV4HzNSHvJuTgH" alt=""><figcaption></figcaption></figure>

\[귓속말]을 선택했을 경우, 아래와 같은 팝업창이 뜹니다. 플레이어를 선택후 채팅을 시작하면 됩니다.

<figure><img src="/files/sC5FuRAG3VhvPbIocAmA" alt=""><figcaption></figcaption></figure>

채팅으로 \[이모티콘]도 발송할 수 있습니다. 아래 스크린샷 이모티콘 아이콘을 클릭하면 여러가지 이모티콘을 선택 가능합니다.

<figure><img src="/files/voL8x04eS5x75cBgb8OO" alt=""><figcaption></figcaption></figure>

**16. \[각종 설정 아이콘]**

\[각종 설정 아이콘]을 클릭하면, \[프로필], \[가방], \[스킬], \[도감], \[플레이어], \[메시지], \[파티], \[클랜], \[우편함], \[큐브 상점], \[초대하기], \[설정], 등을 확인 가능합니다.

<figure><img src="/files/yybFfvx9PtLOKWPrGb9l" alt=""><figcaption></figcaption></figure>

**16-1 \[프로필]**

프로필을 클릭하면, 캐릭터 능력치 와 장비를 확인 할 수 있습니다.

<figure><img src="/files/gBUshzMjcKgEz9VbDUPz" alt=""><figcaption></figcaption></figure>

\
**16-2 \[가방]**

가방에서는 소지 아이템을 확인하고, 사용 할 수 있습니다.

<figure><img src="/files/j2Y71dpUEX22WQrkDLlO" alt=""><figcaption></figcaption></figure>

**16-3 \[스킬]**

스킬에서는 캐릭터의 보유 스킬을 확인 가능합니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/mJXciC4IVffaPZFELfWg" alt=""><figcaption></figcaption></figure>

**16-4 \[도감]**

도감에서는 캐릭터가 보유한 도감을 확인 가능합니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/CNXBwbvfdvbZkr9dBvZM" alt=""><figcaption></figcaption></figure>

**16-5 \[플레이어]**

근처 유저 보유 골드, 같은 게임 플레이 유저, 친구 추가, 친구 요청 수락 기능이 있습니다.

아래 스크린샷 참조 바랍니다.

<figure><img src="/files/FUJyhySKxCyWCaB1zpNZ" alt=""><figcaption></figcaption></figure>

**16-6 \[메시지]**

메시지 팝업창이 뜹니다.

\
**16-7 \[파티]**

파티 찾기 및 파티 생성 기능이 있습니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/7KDKQYlnM5L9mCv6c2SI" alt=""><figcaption></figcaption></figure>

**16-8 \[클랜]**

클랜 찾기 및 클랜 생성 기능 등등 기능이 있습니다.

**16-9 \[우편함]**

받은 우편이 표시 됩니다.

**16-10 \[큐브 상점]**

큐브를 구매 할 수 있고, 큐브를 사용하여 각종 아이템을 구매 할 수 있습니다.

<figure><img src="/files/riYVaFtuyFCytlr7zXdk" alt=""><figcaption></figcaption></figure>

**16-11 \[초대하기]**

\
**16-12 \[설정]**

공식 채팅방/ 홈페이지로 이동 가능하며, 인게임 BGM FX 및 각종 성능을 설정 가능합니다. 그리고 기타 게임 플레이 가능 링크도 내장 되어 있습니다.

<figure><img src="/files/8LDASAXOneT6xWmKsd6z" alt=""><figcaption></figcaption></figure>


# 게임 출시하기

메인 메뉴에서 \[게임]을 클릭하고, \[게임 출시하기]를 클릭하면, 게임을 출시하는 팝업창이 뜹니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/uz7aNIkbehi6DzFzvIGh" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/j44tnyS2nTjHVr0W640p" alt=""><figcaption></figcaption></figure>

**1. 펑크랜드 \[회원 가입]**

펑크랜드 회원가입이 되어 있지 않으면, 우선 회원 가입을 진행해야 합니다. 로그인 방식 선택 팝업창에서 \[회원가입] 버튼을 클릭합니다. 아래 스크린샷 참조 바랍니다.

펑크랜드 회원 가입 페이지로 이동하며, 이메일/비밀번호/닉네임 입력후, 로그인을 클릭합니다.

<figure><img src="/files/ZL6SrIgTtZxX74kF0PhM" alt=""><figcaption></figcaption></figure>

입력한 메일주소로 \[이메일 인증] 메일이 발송 됩니다.

<figure><img src="/files/yECGv9v5U6RZl9dcZXAV" alt=""><figcaption></figcaption></figure>

메일로 받은 링크를 클릭하여, 이메일 인증을 진행하면,

“이메일이 인증되었습니다!” 라는 팝업 메시지 창이 뜹니다.

<figure><img src="/files/sb6j3zWCjV3L05CRvkEg" alt=""><figcaption></figcaption></figure>

이로서 회원가입이 성공적으로 완료 되었습니다.

<figure><img src="/files/MA2P2nfIg9KZVTm6MXfr" alt=""><figcaption></figcaption></figure>

**2. \[로그인] 방식 선택**

\[계정 이름] 혹은 \[계정 이메일]로 로그인 가능합니다.

\[계정 이름] \[계정 이메일]로 로그인하면, 아래와 같이 \[현재 계정 정보] 및 \[게임 정보]를 확인 가능하며, \[APK 생성하기] 및 \[게임 출시하기]를 진행 가능합니다.

<figure><img src="/files/CrrJzlXBgmLh25NWmjbz" alt=""><figcaption></figcaption></figure>

**3. \[현재 계정 정보]**

계정 닉네임, 계정 ID, Name, Version, Beta, Updated at를 확인 할 수 있습니다.

\
**4. \[게임 정보]**

UUID 확인 및 변경 가능 합니다.

아이콘, 버전, 현재 베타 버전, 현재 출시 버전, 장르, 게임 이름, 게임 설명, 카페 혹은 채팅방 URL, 지원 언어를 확인 가능합니다.

\
**5. \[APK 생성하기]**

**6. \[게임 출시하기]**

\[게임 출시하기]를 클릭하면, \[출시 확인] 팝업창이 뜹니다.

해당 팝업창 내용을 확인하고, \[개발자, 수익화 약관 모두 동의], \[펑크랜드 개발자 약관 동의], \[펑크랜드 수익화 약관 동의]에 모두 동의 하시고, \[출시] 버튼을 클릭하면, 게임 출시가 완료 됩니다.

<figure><img src="/files/8aFJpJrQbSV9m5NH1WTn" alt=""><figcaption></figcaption></figure>


# 기본 제작 가이드


# 데이터베이스

데이터베이스에서는, 캐릭터 데이터, 직업 데이터, 아이템 데이터, 몬스터 데이터, 스킬 데이터, 애니메이션 데이터, 상태 데이터, 도감 데이터, 타일셋 데이터, 공용 이벤트, 시스템 데이터 등 각종 데이터를 편집하고 관리 할 수 있습니다.

**1. \[데이터베이스] 편집창 열기**

화면 상단의 \[도구] 버튼을 클릭 후, \[데이터베이스]를 클릭하면 \[데이터베이스] 편집 팝업창이 뜹니다.

혹은, 화면 상단의 \[데이터베이스] 아이콘 클릭으로도 편집 팝업창을 띄울수 있습니다. (아래 스크린샷 빨간 네모 안의 아이콘 참조 바랍니다.)

<figure><img src="/files/hC3V96RmR5sgaCND1bqc" alt=""><figcaption></figcaption></figure>

데이터베이스 각 항목을 편집한 후 \[적용] 및 \[확인] 버튼을 클릭하여 설정 내용을 저장해야만 현재 만들고 있는 게임에 실제로 반영됩니다.

**2. \[최대치 변경]**

\[최대치 변경]은 아래 사진과 같이 \[최대치 설정] 클릭하면, \[최대치 설정] 팝업창이 뜹니다. 해당 창에서 최대치를 변경하고, \[OK] 버튼을 클릭하여 저장하면, 현재 제작중인 게임에 반영됩니다.

예를 들면: 캐릭터 최대치 설정을 클릭하면, 아래와 같이 \[최대치 설정] 팝업창이 뜨며, 여기에서 최대치를 수정하고 \[OK]를 클릭하면, 현재 편집중인 게임에 반영 됩니다.

<figure><img src="/files/ZyDeJVjZrFlXiv9gE4RZ" alt=""><figcaption></figcaption></figure>

**3. 데이터 베이스 기본 설정\_캐릭터 편**\
이름, 그래픽, 이동속도, 점프힘, 특성, 메모를 설정 할 수 있습니다.

<figure><img src="/files/K2UjwROGnluesyWexstL" alt=""><figcaption></figcaption></figure>

**4. 데이터 베이스 기본 설정\_직업 편**\
이름, 최대레벨, 최대 HP, 최대 MP, 공격력, 방어력, 마법 공격력, 마법 방어력, 민첩, 운, 기본 스킬, 특성, 메모를 설정 할 수 있습니다.

<figure><img src="/files/cUmZrWkpkHzv3dIzVkvG" alt=""><figcaption></figcaption></figure>

**5. 데이터 베이스 기본 설정\_아이템 편**

각종 아이템 관련 데이터 설정이 가능합니다.

이름, 아이콘, 설명, 종류, 가격, 쿨타임, 애니메이션, 판매 가격, 거래가능 여부, 드랍 가능 여부, 판매 가능 여부, 창고 이동 가능 여부, 최대 개수, 액션 이름, 데미지 종류, 공식, 크리티컬 유무, 특성, 메모를 설정 할 수 있습니다.

<figure><img src="/files/bdX9BzvKUG77km7BEsSa" alt=""><figcaption></figcaption></figure>

**6. 데이터 베이스 기본 설정\_몬스터 편**

각종 몬스터 데이터 설정이 가능합니다.

이름, 그래픽, 경험치, 공격 타입, 플레이어와 충돌 여부, 지형과 충돌 여부, 최대HP, 최대 MP, 공격력, 방어력, 마법 공격력, 마법 방어력, 민첩, 운, 최소 골드, 최대 골드, 최소 레벨, 최대 레벨, 팀 태그, 특성, 메모를 설정 가능합니다.

<figure><img src="/files/8s8C1alXdlyfUpwgoRL5" alt=""><figcaption></figcaption></figure>

**7. 데이터 베이스 기본 설정\_스킬 편**

이름, 아이콘, 설명, 애니메이션, 쿨타임, 소모HP, 소모MP, 액션 이름, 스킬 유형, 데미지 종류, 데미지 공식, 크리티컬 유무, 특성, 메모를 설정 가능합니다.

<figure><img src="/files/1DcOm805W7CABVrZ8sZE" alt=""><figcaption></figcaption></figure>

**8. 데이터 베이스 기본 설정\_애니메이션 편**

이름, 그래픽, 커맨드 추가, 커맨드 삭제, 커맨드 복사, 재생, 충돌영역 표시 유무, SE 재생 유무, 속성을 설정 가능합니다.

<figure><img src="/files/XiiGStC9nOf7fFD8CnUh" alt=""><figcaption></figcaption></figure>

**9. 데이터 베이스 기본 설정\_상태 편**\
이름, 아이콘, 설명, 종류, 애니메이션 표시 유무, 지속시간, 사망시 해제 여부, 지속 상태(종류, 시간, 공식, 크리티컬 유무), 특성, 메모를 설정 가능합니다.

<figure><img src="/files/AY4fDbFvpCBVp8VJScRo" alt=""><figcaption></figcaption></figure>

**10. 데이터 베이스 기본 설정\_도감 편**

이름, 아이콘, 설명, 아이템No/개수, 보상 아이템/개수, 보상 골드, 특성, 메모를 설정 가능합니다.

<figure><img src="/files/Be7EwbxWlP4dkmTTSzsx" alt=""><figcaption></figcaption></figure>

**11. 데이터 베이스 기본 설정\_타일셋 편**

이름, 타일셋, 오토타일, 포그, 파노라마, 이동가능 여부, 이동가능(4방향) 여부, 우선순위, 수풀, 태그를 설정 가능합니다.

<figure><img src="/files/ZyzwKFZ9gmV5mN4nHP9x" alt=""><figcaption></figcaption></figure>

**12. 데이터 베이스 기본 설정\_공용 이벤트 편**

이름, 시작 조건, 조건 변수, 커맨드를 설정 가능합니다.

<figure><img src="/files/ESfcA2lOh3FiHFaKi1zL" alt=""><figcaption></figcaption></figure>

**13. 데이터 베이스 기본 설정\_시스템 편**

기본 캐릭터, 게임 이름, 컨트롤 설정, 피로도 설정, 시스템 설정(타이틀 이미지, 윈도우 스킨, 버튼 스킨,화면 해상도, 버튼 SE, 데미지 SE, 크리티컬 데미지 SE), 용어를 설정 가능합니다.

<figure><img src="/files/3Op8pQAFIhd7a5M7HKdH" alt=""><figcaption></figcaption></figure>


# 리소스 관리자

화면 상단의 \[도구] 버튼을 클릭하고, \[리소스 관리자]를 클릭하면, \[리소스 관리자] 편집창이 뜹니다.

혹은, 화면 상단 \[리소스 관리자] 아이콘을 클릭으로도 편집 팝업창을 띄울수 있습니다. (아래 스크린샷 빨간 네모 안의 아이콘 참조 바랍니다.)

<figure><img src="/files/peaAoczAfqBiv9HOmAgN" alt=""><figcaption></figcaption></figure>

애니메이션, 이미지, 캐릭터, 스파인, 아이콘, 윈도우 스킨, BGM, BGS, SE, ME 등등 설정 가능합니다.

<figure><img src="/files/y3IiyjRtjitCyq5T7fsa" alt=""><figcaption></figcaption></figure>

왼쪽 \[Tilesets]에서 선택하면, 해당 리소스 미리보기를 볼수 있습니다.

**1. \[리소스 마켓]**

리소스가 부족할 경우, 팝업창 상단의 \[리소스 마켓] 버튼을 클릭하면, 아래와 같이 펑크랜드 리소스 마켓으로 이동하며, 원하는 리소스를 구매하여 사용 가능 합니다.

<figure><img src="/files/EQ0zpeaNrFyoCcPe77RT" alt=""><figcaption></figcaption></figure>

**2. \[리소스 가져오기]**

버튼을 클릭하면, 로컬에 있는 리소스를 가져와서 사용 가능 합니다.

<figure><img src="/files/1KpZK0bAUiIxoijE7SPK" alt=""><figcaption></figcaption></figure>

**3. \[스프라이트 설정] 및 \[미리보기]**

팝업창 상단의 \[설정] 버튼을 클릭하면, 아래와 같은 \[스프라이트 설정] 팝업창이 뜹니다.

<figure><img src="/files/FGUU5BRfpPKiJCdPF20X" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/BKGpaRx3o9N5Y20O5utZ" alt=""><figcaption></figcaption></figure>

스프라이트 정보, 스프라이트 시트, 스프라이트 테두리, 이름, 충돌, 주변광, 기타 등등 설정 가능하며,

그리고, \[미리보기]에서는 주변광범위 표시, 충돌범위 표시, 재생 여부, 그리드 표시 여부, 그리드 맞춤, 기타, 등등 설정 가능합니다.

<figure><img src="/files/mKE6WyxGhKI2l0kIBBPq" alt=""><figcaption></figcaption></figure>

**4. \[리소스는 삭제]**\
리소스 삭제 버튼 클릭을 통해 삭제 가능합니다.

<figure><img src="/files/M95gHwxeZv04JUxgCRNV" alt=""><figcaption></figcaption></figure>

**5. \[기타 옵션]**

\[새로고침], \[복제], \[대체하기], \[내보내기] 등 기능도 있습니다.

<figure><img src="/files/IriskU4WUJdi9EOx7oCM" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/eo7FWHoe1xLNUmPkVZKr" alt=""><figcaption></figcaption></figure>


# 레이아웃 관리자

> **\[도구] - \[레이아웃 관리자]** 를 클릭하면, 레이아웃 편집 팝업 창이 뜹니다.
>
> 각종 컨트롤과 커스텀 메뉴 관리, 퀵슬롯 추가 등등 기능이 포함되어 있습니다.

<figure><img src="/files/EtHKoZVCBgIRFzUxceEU" alt=""><figcaption></figcaption></figure>

> **① 페이지 리스트**
>
> 레이아웃 관리자는 페이지 단위로 레이아웃을 관리합니다.
>
> **② 컨트롤 상자**
>
> 레이아웃 페이지 안에 컨트롤을 생성할 수 있습니다.
>
> **③ 컨트롤 리스트**
>
> 선택된 페이지에 생성된 컨트롤을 볼 수 있습니다.
>
> **④ 속성 상자**
>
> 페이지, 컨트롤 등의 속성을 보거나 설정할 수 있습니다.
>
> **⑤ 퀵메뉴 상자**
>
> 아이콘 형태로 되어있으며, 초기화, 저장, 내보내기, 불러오기, 커스텀 메뉴 관리자 및 컨트롤 생성 기능으로 구성되어 있습니다.
>
> **⑥ 레이아웃 뷰**
>
> 인게임에서 보여질 형태를 미리볼 수 있으며, 컨트롤을 세부적으로 조절할 수 있습니다.

<figure><img src="/files/Bzv5mVfFAK1edAU8finM" alt=""><figcaption></figcaption></figure>

> **레이아웃 종료 시**
>
> 레이아웃 편집을 끝내고, 해당 팝업 창을 종료하면, 아래와 같은
>
> **“변경된 레이아웃을 저장하시겠습니까?”** 팝업 창이 나타납니다.
>
> **“OK”클릭 시**
>
> 편집한 내용들이 저장되고 관리자가 종료됩니다.
>
> **“NO”클릭 시**
>
> 편집한 내용들을 저장하지 않고 관리자가 종료됩니다.
>
> **“CANCEL” 클릭 시**
>
> 창을 끕니다.

<figure><img src="/files/zJS2ln9pDjRufQBwkvJa" alt=""><figcaption></figcaption></figure>

> **저장 완료 시 알림**
>
> 저장을 완료하게 되면 해당 알림과 함께 변경 사항이 적용됩니다.


# MP3 -> OGG 변환기

\[MP3 -> OGG변환기]를 클릭하면, 아래의 페이지로 이동합니다.

<figure><img src="/files/Qkt7W8WLemy1E51v6Uus" alt=""><figcaption></figcaption></figure>

편집할 파일을 열고 편집을 진행하면 됩니다.


# 번역파일 내보내기

\[번역파일 내보내기] 를 클릭하면, 아래와 같이 “게임의 이벤트, 아이템, 몬스터 등의 문자열을 번역 파일로 내보낼수 있습니다. 계속할까요?” 라는 팝업 메시지 창이 뜹니다. “예”를 클릭하면, 번역파일 저장 주소 및 번역 파일명, 그리고 파일 형식을 선택하고, \[저장]을 클릭하면 성공적으로 번역파일을 내보낼수 있습니다. 아래 스크린샷 예시 참조 바랍니다.

<figure><img src="/files/mxeBpkXvWH69v1xT3289" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/l3ZJNcqgWWwZ9iNwSWlA" alt=""><figcaption></figcaption></figure>


# 번역파일 불러오기

\[번역파일 불러오기]를 클릭하면, 번역된 파일을 불러와서 게임에 적용할수 있습니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/RZXNwfJev3p6E9IMajCD" alt=""><figcaption></figcaption></figure>


# 스크립트

\[도구]를 클릭하고, \[스크립트]\(혹은 툴바에 있는 스크립트 아이콘을)를 클릭하면, \[클라이언트 스크립트] 및 \[서버 스크립트]를 열어 편집 할 수 있습니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/fTITatkejpghfFrYaxPw" alt=""><figcaption></figcaption></figure>


# 리소스 마켓

> [*리소스 마켓*](https://nekoland.net/market?order=popular)을 클릭하면, 아래의 스크린샷과 같이 리소스 마켓 홈페이지로 이동됩니다.

<figure><img src="/files/RCx8tfW3hc7lvBul0Xxg" alt=""><figcaption></figcaption></figure>


# 데이터 내보내기

\[데이터 내보내기]를 클릭하여, 몬스터, 캐릭터, 직업, 아이템, 스킬, 애니메이션, 상태, 도감 관련 데이터를 내보낼수 있습니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/NWLWX7YqSFqOFP9Q8Tse" alt=""><figcaption></figcaption></figure>


# 데이터 불러오기

\[데이터 불러오기]를 클릭하여, 몬스터, 캐릭터, 직업, 아이템, 스킬, 애니메이션, 상태, 도감 관련 데이터를 불러올수 있습니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/PBhWWHFAdyK849TvpZ58" alt=""><figcaption></figcaption></figure>


# 도움말

도움말]탭에는 \[도움말] \[스크립트 도움말] \[업데이트 확인] \[업데이트 내역 확인] \[피드백 보내기] \[자세히] 버튼이 있습니다.

<figure><img src="/files/FY1rrWrm5pc4F9gfCZva" alt=""><figcaption></figcaption></figure>


# 프로젝트 관리

## **1. 프로젝트 저장**

게임 제작 중에 일시 중단할 경우, 편집 중인 프로젝트를 저장하시고, 펑크랜드 스튜디오를 종료해야 합니다. 상단 메인 메뉴 \[파일]을 클릭하고, \[프로젝트 저장]\(혹은 \[프로젝트 저장] 아이콘)을 클릭하면, 편집중인 내용들을 저장 할 수 있습니다.

<figure><img src="/files/wtPSpMqlhJjU2nvvVOsa" alt=""><figcaption></figcaption></figure>

## **2. 프로젝트 열기**

진행하던 프로젝트를 재개 하려면, 메인 메뉴 \[파일]을 클릭하고, \[프로젝트 열기]\(혹은 \[프로젝트 열기] 아이콘)를 클릭하고, 프로젝트를 선택한 후 열기를 클릭하면 됩니다.

<figure><img src="/files/9FLhJPliAyiDFALKkd05" alt=""><figcaption></figcaption></figure>

## **3. 프로젝트 닫기**

프로젝트를 닫으려면, 메인 메뉴에서 \[파일]을 클릭하고, \[프로젝트 닫기]를 클릭하면, 프로젝트를 닫을수 있습니다.

<figure><img src="/files/PssSXAHcLCQSsSQbZwAy" alt=""><figcaption></figcaption></figure>

## **4. 펑크랜드 스튜디오 종료하기**

펑크랜드 스튜디오를 종료하려면 메인 메뉴 \[파일]에서 \[끝내기] 클릭으로 종료 가능합니다. 혹은 화면 오른쪽 상단의 X를 클릭해서 종료 할수도 있습니다. 아래 스크린샷 참조 바랍니다.

<figure><img src="/files/LoGbyRGfiZzzW2YbxygG" alt=""><figcaption></figcaption></figure>


# 대사 꾸미기

<table><thead><tr><th width="195">명령어</th><th>설명</th></tr></thead><tbody><tr><td><strong>\V변수 아이디</strong></td><td>특정 변수의 값을 출력합니다. 예) <strong>\V0</strong>: 0번 변수의 값을 출력</td></tr><tr><td><strong>\WV변수 아이디</strong></td><td>특정 월드 변수의 값을 출력합니다. 예) <strong>\WV0</strong>: 0번 월드 변수의 값을 출력</td></tr><tr><td><strong>\G</strong></td><td>해당 플레이어가 가진 골드를 출력합니다.</td></tr><tr><td><strong>\$</strong></td><td>해당 플레이어가 가진 골드를 출력합니다.</td></tr><tr><td><strong>\C0~\C9</strong></td><td>대사에 색깔을 입힙니다. (0부터 9까지)</td></tr><tr><td><strong>\S0~\S9</strong></td><td>대사 출력 속도를 조절합니다. (0부터 9까지, 낮을수록 빠름)</td></tr><tr><td><strong>\N</strong></td><td>해당 플레이어의 닉네임을 출력합니다.</td></tr><tr><td><strong>\!</strong></td><td>대사 출력을 멈추고 터치하면 재시작합니다.</td></tr><tr><td><strong>\|</strong></td><td>2초간 기다립니다.</td></tr><tr><td><strong>\.</strong></td><td>0.5초간 기다립니다.</td></tr><tr><td><strong>\^</strong></td><td>대사창을 바로 닫습니다.</td></tr><tr><td><strong>\_</strong></td><td>공백을 삽입합니다.</td></tr><tr><td><strong>\> 내용 \&#x3C;</strong></td><td>특정 부분을 한번에 출력합니다.</td></tr></tbody></table>


# GM 명령어

<table><thead><tr><th width="275">명령어</th><th>설명</th></tr></thead><tbody><tr><td><strong>/kill N</strong></td><td>모든 플레이어를 내쫓고 N초 뒤에 서버를 재부팅하며 게임을 업데이트합니다. (/kill만 입력 시 120초 후에 서버가 재부팅됩니다.)</td></tr><tr><td><strong>/ban 플레이어 닉네임</strong></td><td>해당 플레이어를 내쫓습니다.</td></tr><tr><td><strong>/ban 플레이어 닉네임 N 사유</strong></td><td>해당 플레이어를 내쫓고 N초만큼 접속할 수 없게 합니다.<br>사유 입력 시 플레이어에게 벤 사유를 노출합니다. (최대 30자)</td></tr><tr><td><strong>/chatban 플레이어 닉네임 N 사유</strong></td><td>해당 플레이어의 채팅을 N초간 차단합니다.<br>사유 입력 시 해당 플레이어에게 차단 사유도 함께 노출합니다.</td></tr><tr><td><strong>/notice 내용</strong></td><td>모든 플레이어에게 공지 사항을 노출합니다.</td></tr><tr><td><strong>/item 아이디 개수</strong></td><td>아이템을 개수만큼 생성합니다.</td></tr><tr><td><strong>/item 아이디 개수 플레이어 닉네임</strong></td><td>아이템을 개수만큼 생성하여 해당 플레이어에게 지급합니다.</td></tr><tr><td><strong>/gold 골드량</strong></td><td>골드량만큼 골드를 획득합니다.</td></tr><tr><td><strong>/gold 골드량 플레이어 닉네임</strong></td><td>해당 플레이어에게 골드를 지급합니다.</td></tr><tr><td><strong>/exp 증가량</strong></td><td>증가량만큼 경험치를 올립니다.</td></tr><tr><td><strong>/exp 증가량 플레이어 닉네임</strong></td><td>해당 플레이어에게 경험치를 지급합니다.</td></tr><tr><td><strong>/save</strong></td><td>접속 중인 플레이어의 데이터를 저장합니다.</td></tr><tr><td><strong>/script 내용</strong></td><td>해당 Lua 스크립트를 실행합니다.</td></tr></tbody></table>

&#x20;


# 스탯

## **플레이어의 스탯** <a href="#undefined" id="undefined"></a>

* 캐릭터, 직업, 아이템 및 스킬의 특성에 의해 결정됩니다.
* 이전에는 특성이 적용되는 순서에 따라 최종 결과 스탯의 값이 달라지는 경우(곱셈 이후 덧셈 또는 덧셈 이후 곱셈)가 발생하였습니다.
* 이와 관련하여 스탯을 계산 및 적용하는 방식을 아래와 같이 일관성 있게 수정하였습니다.

> **직업의 레벨에 따라 주어지는 스탯에 직업의 특성으로 인한 상승분을 계산하여 기본 스탯으로 정합니다.**
>
> **또한, 아이템 및 캐릭터 등의 특성으로 인해 상승하는 스탯은 기본 스탯을 기준으로 아래의 계산 방법에 따라 계산합니다.**

## **기본 스탯** <a href="#undefined" id="undefined"></a>

* 각 직업의 레벨 별 초기 스탯에 직업의 특성에 의한 상승분만을 적용한 스탯입니다.
* 특성으로 인한 상승분의 계산은 아래의 계산 방법과 마찬가지로 곱셈 및 퍼센트 덧셈/곱셈은 레벨별 초깃값을 기준으로 계산합니다.

## **아이템으로 상승하는 스탯**  <a href="#undefined" id="undefined"></a>

* 같은 방식으로 아이템은 기본 스탯을 기준으로 스탯을 상승시켜줍니다.
* 아이템의 특성을 통해 스탯을 상승시키는 방식은 현재 4가지(단순 덧셈, 단순 곱셈, 퍼센트 덧셈, 퍼센트 곱셈)가 제공되고 있는데 이중 단순 곱셈, 퍼센트 덧셈, 퍼센트 곱셈은 계산 방법에 차이가 있을 뿐 아래 예와 같이 통일되어 표현할 수 있습니다.

> #### **+50%=\*150%=\*1.5**
>
> #### **+200%=\*300%=\*3**
>
> #### **+50%, x150%, x1.5**

...등의 표기 방법이 있지만, 스탯 상승분은 모두 동일합니다.

* 아이템 특성을 위와 같이 설정한 경우 아이템 레벨이 0일 때 `{{attackPlus}}`는 **70**으로, `{{attackPercent}}`는 **5**로 출력되고, 아이템 레벨이 1일 때 `{{attackPlus}}`는 **70+100=170**으로 출력되며, `{{attackPercent}}`는 **5+(105-100)=10**으로 출력됩니다.

## **아이템 옵션으로 상승하는 스탯** <a href="#undefined" id="undefined"></a>

* 기존에 옵션을 통해 각 직업의 레벨별 고유 스탯을 상승시킬 수 있었던 것에서 나아가 아이템 고유의 스탯을 상승시켜주는 시스템을 도입하였습니다. 해당 시스템은 캐릭터의 현재 스탯 값에 영향을 받지 않는 `{{스탯명Plus}}`과 같은 단순 덧셈 스탯에만 적용됩니다.
* 만약 `{{attackPlus}}`의 값이 100인 아이템의 경우, 아이템 스탯을 기준 스탯 타입으로 지정했을 때 **+10%**&#xC758; 옵션이 부여되면 해당 아이템으로 상승하는 attack의 값은 **100 + 100\*(10/100) = 110** 이 됩니다. 여기서 옵션으로 인한 상승분 **100\*(10/100) = 10**은 `{{attackPlusOption}}`과 같이 `{{스탯명PlusOption}}`을 통해 출력할 수 있고, 기본 스탯+옵션으로 인한 상승분으로 계산되는 아이템 고유의 합산 스탯인 **110**은 `{{attackPlusTotal}}`과 같이 `{{스탯명PlusTotal}}`로 출력할 수 있습니다. 해당 시스템은 오직 `{{스탯명Plus}}`에만 적용되고 `{{스탯명Percent}}`에는 적용되지 않습니다.

#### 예)

> **아이템에 적용된 기본 특성 2개**
>
> Set Stat attack +100
>
> Set Stat attack +5%

#### 옵션 없을 시

{% code overflow="wrap" lineNumbers="true" %}

```lua
{{attackPlus}}=100
{{attackPlusOption}} = 0
{{attackPlusTotal}} = 100
{{attackPercent}} = 5
```

{% endcode %}

#### 옵션 1개일 경우

{% code overflow="wrap" lineNumbers="true" %}

```lua
Set Item Stat attack 10%
{{attackPlus}}=100
{{attackPlusOption}}=100*(10/100)=10
{{attackPlusTotal}}=110
{{attackPercent}}=5
```

{% endcode %}

#### 옵션 3개일 경우

{% code overflow="wrap" lineNumbers="true" %}

```lua
Set Item Stat attack +10%
Set Item Stat attack +20
Set Item Stat attack +5%
{{attackPlus}} =100
{{attackPlusOption}} =100*(10/100)+20+100*(5/100)=35
{{attackPlusTotal}} =135
{{attackPercent}} =5
```

{% endcode %}

## **계산 방법** <a href="#undefined" id="undefined"></a>

* 기존의 스탯 계산 방법은 각 직업의 레벨별 기본 스탯을 바탕으로 각 특성을 통해 상승된 스탯이 순차적으로 누적되며 적용되었습니다.

#### 예 1)

> 기본 공격: 100
>
> 1번째 특성 공격 +50:100+50=150
>
> 2번째 특성 공격 +50%:150+150\*(50/100)=225

#### 예 2)

> 기본 공격: 100
>
> 1번째 특성 공격 +50%:100+100\*(50/100)=150
>
> 2번째 특성 공격 +50:150+50=200

* 변경된 계산 방법을 통해서는 곱셈의 기준이 되는 스탯이 누적되어 적용된 스탯이 아닌 직업 고유의 스탯으로 고정되어 어떤 순서로 적용되든 같은 양만큼 상승하게 됩니다. 관련하여 기존 예시 1번의 경우 두 번째 특성에서 곱셈의 기준값이 150이 아닌 100이 적용됩니다.

#### 예 3)

> 기본 공격: 100
>
> 1번째 특성 공격 +50:100+50=150
>
> 2번째 특성 공격 +50%:150+100\*(50/100)=200


# 피해량 공식

* 아이템의 포션 종류를 선택하거나 스킬을 선택하면, 피해량 공식을 입력할 수 있습니다.
* 하지만 피해량 공식 대신 다른 것을 입력한다면? (예: 아이템 지급, 스킬 지급, 골드 지급) 작동됩니다!

> `a`는 공격자, `b`는 방어자를 의미합니다.
>
> `a`에서 사용 가능한 변수와 함수는 다음과 같습니다.

* `a`와 `b`는 모두 `ScriptUnit` 객체입니다.
* 아이템의 경우 `b`는 없습니다. `level`로 아이템의 레벨 값을 가져올 수 있습니다.
* 상태의 경우 `a`, `b`만 존재합니다.
* 스킬의 경우 `level`은 해당 스킬의 레벨입니다.

## **변수**

<table><thead><tr><th width="280">변수</th><th>설명</th></tr></thead><tbody><tr><td><strong>a.id</strong></td><td>a의 고유한 숫자 아이디</td></tr><tr><td><strong>a.type</strong></td><td>a의 타입 (0=플레이어, 1=이벤트, 2=몬스터)</td></tr><tr><td><strong>a.name</strong></td><td>a의 이름</td></tr><tr><td><strong>a.x</strong></td><td>a의 좌표 X</td></tr><tr><td><strong>a.y</strong></td><td>a의 좌표 Y</td></tr><tr><td><strong>a.atk</strong></td><td>a의 공격력</td></tr><tr><td><strong>a.def</strong></td><td>a의 방어력</td></tr><tr><td><strong>a.magicAtk</strong></td><td>a의 마법 공격력</td></tr><tr><td><strong>a.magicDef</strong></td><td>a의 마법 방어력</td></tr><tr><td><strong>a.agi</strong></td><td>a의 민첩</td></tr><tr><td><strong>a.luk</strong></td><td>a의 운</td></tr><tr><td><strong>a.maxHP</strong></td><td>a의 최대 체력</td></tr><tr><td><strong>a.maxMP</strong></td><td>a의 최대 마력</td></tr><tr><td><strong>a.hp</strong></td><td>a의 현재 체력</td></tr><tr><td><strong>a.mp</strong></td><td>a의 현재 마력</td></tr></tbody></table>

## **함수**

<table><thead><tr><th width="333">함수</th><th>설명</th></tr></thead><tbody><tr><td><strong>a.SpawnAt(x, y)</strong></td><td>a를 x, y 좌표로 이동한다.</td></tr><tr><td><strong>a.SpawnAtField(mapID, x, y)</strong></td><td>a 를 mapID 의 맵에 x, y 좌표로 이동한다.</td></tr><tr><td><strong>a.RespawnAt(x, y)</strong></td><td>a를 x, y 좌표에 부활한다.</td></tr><tr><td><strong>a.SetVar(id, value)</strong></td><td>a의 id 변수를 value로 바꾼다.</td></tr><tr><td><strong>a.GetVar(id)</strong></td><td>a의 id 변수를 가져온다.</td></tr><tr><td><strong>a.AddSkill(id, level)</strong></td><td>a에게 id 스킬 레벨 level을 추가한다.</td></tr><tr><td><strong>a.AddItem(id, count)</strong></td><td>a에게 id 아이템 count 개수를 추가한다.</td></tr><tr><td><strong>a.AddGameMoney(amount)</strong></td><td>a에게 골드를 추가한다.</td></tr><tr><td><strong>b.RemoveSkill(id)</strong></td><td>b로부터 id 스킬을 제거한다.</td></tr><tr><td><strong>b.RemoveItem(id, count)</strong></td><td>b로부터 count 개수만큼 id 아이템을 소모한다.</td></tr><tr><td><strong>b.UseGameMoney(amount)</strong></td><td>b로부터 골드 amount를 소모한다.</td></tr><tr><td><strong>b.StartGlobalEvent(id)</strong></td><td>공용 이벤트 id를 호출한다.</td></tr><tr><td><strong>b.AddBuff(id)</strong></td><td>b로부터 id 상태를 부여한다.</td></tr><tr><td><strong>b.RemoveBuff(id)</strong></td><td>b로부터 id 상태를 제거한다.</td></tr></tbody></table>

**예) 스킬 공식 1 피해량 = 공격자의 공격력 - 방어자의 방어력**

> a.atk - b.def

**예) 스킬 공식 2 피해량 = 10과 50사이의 랜덤 피해량**

> rand(10, 50)

**예) 스킬 피해량 공식 - 내 스킬이 적중하는 사람의 골드를 10씩 빼앗기**

> b.UseGameMoney(10)

**예) 아이템과 골드를 모두 빼앗을 경우**

> a.RemoveItem(1, 10) or a.UseGameMoney(10)

**예) 치명타에 따른 스킬 피해량 설정 - 치명타가 발생할 경우 (a.attack \*2) 적용, 아닐 경우 (a.attack)적용**

> critical and (a.attack \* 2) or (a.attack)

**예) 해당 스킬의 레벨에 따른 피해량 - a의 마법 공격력 10, b의 마법 방어력 5, 해당 스킬의 레벨이 10이라면 피해량 16 피해량 출력**

> a.magicAtk - b.magicDef + level +1

**예) 아이템 피해량 공식 - a가 어떤 아이템을 사용했을 때 아래와 같은 값을 피해량 공식에 넣는다면 아이템 사용 시 스킬을 배우게 할 수 있습니다.**

> a.AddSkill(0,1) \\-\\- A에게 0번째 스킬 Lv. 1을 추가한다.

**예) 상태 지속 피해량 가하기**

> 종류 HP 피해량 설정 후 공식에 10을 입력하면 시간에 따른 피해량을 가한다. (최소 2초)


# 아이템 조건식

* 아이템을 선택할 때 나오는 팝업에 보여지는 아이템들의 리스트는 조건식을 이용하여 필터링 할 수 있습니다.
* 작성된 조건에 부합하는지 여부에 따라 아이템을 표시할 수 있습니다!

> `item`은 아이템 (TItem) 객체를 의미합니다.
>
> `unit`은 유저의 ScriptUnit 객체를 의미합니다.

## **변수**

| 변수                  | 설명              |
| ------------------- | --------------- |
| **item.level**      | 아이템의 레벨 (강화 수치) |
| **item.id**         | 아이템의 고유 아이디     |
| **item.count**      | 아이템의 개수         |
| **item.dataID**     | 아이템의 ID         |
| **item.index**      | 아이템의 인덱스        |
| **item.inTrade**    | 아이템의 거래 여부      |
| **item.exp**        | 아이템의 경험치        |
| **item.locked**     | 아이템의 잠금 여부      |
| **item.nftTokenID** | 아이템의 nft 토큰ID   |
| **item.options**    | 아이템의 옵션 리스트     |

**예) 레벨이 1 이상인 아이템만 리스트**

> item.level >= 1

**예) 1번 \~ 20번의 아이템만 리스트**

> item.dataID >= 1 and item.dataID <= 20

**예) 아이템의 이름이 “검” 인 경우 리스트**

> Server.GetItem(item.dataID).name == “검”


# 팁과 노하우

## 마케팅에 대하여

슈퍼캣은 다양한 MCN 채널과 마케팅 협약 관계를 맺기위해 노력하고 있습니다.

1인 개발자가 컨택을 하는 것보다 펑크랜드를 통해 마케팅 회사와 컨택하면 더 저렴한 가격에 마케팅을 진행할 수 있습니다.

자세한 문의는 <we@supercat.co.kr> 으로 해주세요.

## 서버 확장에 대하여

유튜브나 기타 마케팅으로 인해 게임 유저가 대폭 늘어날 경우, 펑크랜드 팀에 미리 알려주세요.

추가 서버를 미리 배치하여, 게임에 접속 못하는 유저가 없도록 충분히 대응해드립니다.

게임 서버 1대당 1000명의 유저가 접속할 수 있습니다.

자세한 문의는 <we@supercat.co.kr> 으로 해주세요.

## 월초효과에 대하여

핸드폰 결제 한도 및 카드 한도가 풀리는 날인 매월 1일에 유저당 결제금액이 가장 높습니다.

게임 개발 스케쥴 짜실때, 매월 말일에 캐시 아이템들을 업데이트 하면 높은 결제 효과를 볼 수 있습니다.


# 예제 게임

### 흑화 스토리 <a href="#undefined" id="undefined"></a>

* 설명 : 리메이크 전의 흑화 스토리 입니다.\
  다른 제작자 분들께 도움을 드리고 싶어서 이렇게 올리게 되었네요.
* 제작자 : 천학
* 날짜 : 2019-01-19
* [**다운로드**](https://cdn.nekoland.net/examples/blackening.zip)

### 축구 <a href="#undefined" id="undefined"></a>

* 설명 : 축구 게임 예제입니다.\
  김백수 사커즈에 있던 시스템을 대부분 가져 왔습니다.
* 제작자 : 카브에트
* 날짜 : 2019-01-25
* [**다운로드**](https://cdn.nekoland.net/examples/soccer.zip)


# 펑크랜드 네이버 카페

[펑크랜드 네이버 카페](https://cafe.naver.com/nekolandgames)를 클릭하면 해당 페이지로 이동합니다.

<figure><img src="/files/ahRgA25LruDEnI6jKPWO" alt=""><figcaption></figcaption></figure>


# 자주 묻는 질문

## **펑크랜드는 무료인가요?**

네. 펑크랜드 가입은 무료입니다.

## **코딩, 서버, 데이터베이스 몰라도 정말 게임을 만들 수 있나요?**

네. 그렇습니다. 펑크랜드를 이용하면 복잡한 코딩, 서버, DB 지식이 없더라도 누구나 손쉽게 온라인 게임을 만들 수 있습니다. 펑크랜드의 목표는 누구나 쉽게 온라인 게임을 만들게 하고, 서버나 DB 등의 어려운 기술에 대해 알지 못해도, 온라인 게임을 완성하는 것 입니다.

## **어떻게 그게 가능한가요?**

펑크랜드 개발도구인 **펑크랜드 스튜디오**를 활용하면 누구든지 클릭만으로 게임의 기본 뼈대를 구성한 다음 게임을 돌려볼 수 있게 합니다. 서버와 데이터베이스는 신경쓰실 필요가 없도록 모두 펑크랜드가 알아서 구성합니다. 여러분은 인게임과 콘텐트 제작만 신경쓰면 됩니다.

## **펑크랜드 스튜디오는 무엇인가요?**

펑크랜드 모바일 앱에서 구동되는 모바일 게임을 개발하기 위한 개발도구입니다. 펑크랜드 모바일 앱에서 동작하는 게임을 개발하기 위해서는 개발도구인 “펑크랜드 스튜디오”를 이용해야 합니다.\
\
펑크랜드 스튜디오는 PC 프로그램을 지원하며, 게임을 개발해서 펑크랜드 앱으로 출시가 가능합니다. (단, 펑크랜드 PC 스튜디오는 윈도우 버전만 지원)

펑크랜드 스튜디오 내부에 있는 \[출시] 메뉴에서, 버튼만 누르면 자동으로 게임이 업로드되어 펑크랜드 앱을 통해 서비스 됩니다. 펑크랜드 스튜디오는 최신 .Net framework 를 필요로 합니다. 펑크랜드 스튜디오 실행시 오류가 뜬다면, [닷넷 프레임워크](https://www.microsoft.com/ko-kr/download/details.aspx?id=49982) 를 설치하신 후 재부팅 해주세요. 보다 자세한 내용은 [펑크랜드 개발 지원 센터](https://nekoland.atlassian.net/wiki/spaces/nekoland)를 참고하세요.

* [펑크랜드 PC 스튜디오 다운로드 받기](https://get.nekoland.net/)

## **펑크랜드 모바일 스튜디오 버전은 없나요?**

AOS 버전을 제공했었으나, 현재는 지원이 잠정 중단된 상태입니다.

## **펑크랜드 스튜디오로 만든 게임은 그럼 어디에 노출되나요?**

펑크랜드 스튜디오로 만든 게임이 실제로 라이브되어 사용자들에게 보여지는 곳은 펑크랜드라는 모바일앱입니다. 구글 플레이스토어에서 `펑크랜드`라고 검색해서 앱을 설치하시면 됩니다.

* [펑크랜드 구글 앱 (Android)](https://play.google.com/store/apps/details?id=net.supercat.nekoland)
* [펑크랜드 애플 앱 (iOS)](https://itunes.apple.com/kr/app/%EC%B4%88%ED%86%A0%ED%99%94%EB%8D%98%EC%A0%84-with-nekoland/id1446251772?mt=8)

## **펑크랜드에서 활동하는 개발자는 얼마나 되나요?**

2020년 3월 기준으로 1500명의 개발자가 활동하고 있습니다.

개발자 커뮤니티인 [펑크랜드 네이버 공식 카페](https://cafe.naver.com/nekolandgames)에는 7500명이 가입되어 있습니다. (2020년 3월 기준)

## **실제로 펑크랜드로 게임을 제작하여 수익을 만든 사례가 있나요?**

네. 그렇습니다. 펑크랜드 매출 순위 상위 10위권 게임들의 일평균 매출 총합은 200-300만원 (2019년 3월 기준)으로 월 평균 6천에서 9천만원에 이르고 있습니다. 한 직장인 개발자는 2019년 2월에 한 달 수익금이 5천만원을 달성했으며 한 초등학생 개발자는 한 달에 수십만의 수익을 올리고 있습니다.

## **펑크랜드 개발자 커뮤니티가 있으면 알려주세요**

* 펑크랜드 개발자 센터 ( [https://nekoland.atlassian.net/wiki/spaces/nekoland/overview?mode=global](https://nekoland.atlassian.net/wiki/spaces/nekoland))
* 펑크랜드 네이버 공식 카페 ( <https://cafe.naver.com/nekolandgames/> )

## **큐브는 무엇인가요?**

큐브(Cube)는 펑크랜드 내부에서 통용되는 게임 재화 이름입니다. 사용자가 게임에 지불한 큐브, 즉 게임제작을 통해 벌어들인 큐브를 통해 수익을 창출할 수 있게 됩니다. 수익금은 개발자에게 매달 23일 일괄 입금 처리됩니다.

## **펑크랜드에서 발생한 매출의 수익 배분율은 어떻게 되나요?**

| 기여자                  | 배분율 |
| -------------------- | --- |
| 마켓 (Google or Apple) | 30% |
| 펑크랜드                 | 30% |
| 개발자                  | 40% |

## **매출이 발생한 뒤 정산은 어떻게 이뤄지나요?**

펑크랜드 플레이어에서 \[내 게임 관리하기] 를 누르고,\[수익 지급] 메뉴를 눌러 요구되는 아래와 같은 정보를 입력하면 자동 접수 됩니다. 아래 정보는 국세청을 통해 3.3% 사업소득세를 신고해야하기에 반드시 필요한 정보입니다.

> * 실명
> * 주민등록번호
> * 전화번호

## **수익금은 어떻게 구성되나요?**

매달 23일 입금되는 수익금은 아래와 같이 계산됩니다.

* 총 수익금 — (환불금액 + 3.3% 사업소득세) = 입금 금액
* 계좌에 실제 입금되는 금액은 총 수익금에서 환불금액과 3.3% 사업소득세가 제외된 금액입니다.

## **리소스 마켓은 무엇인가요?**

게임 개발할 때 리소스 문제로 어려움을 겪는 경우가 많습니다.

* [**리소스 마켓 바로가기**](http://nekoland.net/market)

리소스 마켓은 펑크랜드 유저라면 누구든지 게임 리소스를 등록해서 판매하거나 구매해서 게임 제작에 활용할 수 있습니다. 슈퍼캣에서도 무료로 사용 가능한 리소스를 많이 올려두었습니다.

## **펑크랜드 고객센터를 알려주세요.**

펑크랜드 관련 문의를 고객센터에 보내실 때 아래 양식을 지켜서 보내주시면 더 빠르게 해결되니, 참고해서 양식대로 보내주세요

* 고객센터 공식 이메일 주소 : <we@supercat.co.kr>
* 운영시간 : 월 \~ 금 / 11 am \~ 7 pm


# 심화 제작 가이드


# 탑메뉴 관리자

탑메뉴 관리자는 인게임의 상단 메뉴 리스트들을 수정하는 기능입니다.\
펑크랜드에서 제공되는 기본 메뉴 뿐만 아니라 커스텀 메뉴도 제작할 수 있으며,\
메뉴의 이미지, 이름 등을 수정하여 보다 자연스럽게 디자인 할 수 있습니다.\
`도구 - 레이아웃 관리자` 를 열어 상단의 `아이콘(세 줄 모양 三)`을 클릭하면,\
`탑메뉴 관리자` 기능을 만나 보실 수 있습니다.

**\[리소스 관리자] - \[설정]** 을 클릭하면 스프라이트 관리자를 열 수 있습니다.

해당 스프라이트의 액션(캐릭터의 모션) 및 이미지 세부 설정을 할 수 있습니다.

<figure><img src="/files/blG9K4d9eRTcvH3giJXN" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/XBp6gkJFM7LzuIgyuRhx" alt=""><figcaption></figcaption></figure>


# 리소스 관리자

화면 상단의 \[도구] 버튼을 클릭하고, \[리소스 관리자]를 클릭하면, \[리소스 관리자] 편집창이 뜹니다.

혹은, 화면 상단 \[리소스 관리자] 아이콘을 클릭으로도 편집 팝업창을 띄울수 있습니다. (아래 스크린샷 빨간 네모 안의 아이콘 참조 바랍니다.)

<figure><img src="/files/UczgCGnEP8kRloSHIAtJ" alt=""><figcaption></figcaption></figure>

애니메이션, 이미지, 캐릭터, 스파인, 아이콘, 윈도우 스킨, BGM, BGS, SE, ME 등등 설정 가능합니다.

<figure><img src="/files/t4SSTEfn7lowjnyhVtZj" alt=""><figcaption></figcaption></figure>

왼쪽 \[Tilesets]에서 선택하면, 해당 리소스 미리보기를 볼수 있습니다.

## **1. \[리소스 마켓]**

리소스가 부족할 경우, 팝업창 상단의 \[리소스 마켓] 버튼을 클릭하면, 아래와 같이 펑크랜드 리소스 마켓으로 이동하며, 원하는 리소스를 구매하여 사용 가능 합니다.

<figure><img src="/files/iEuUo2QuFG5iNbSpDmbA" alt=""><figcaption></figcaption></figure>

## **2. \[리소스 가져오기]**

버튼을 클릭하면, 로컬에 있는 리소스를 가져와서 사용 가능 합니다.

<figure><img src="/files/fBywtBGfpQZCav3NUe6k" alt=""><figcaption></figcaption></figure>

## **3. \[스프라이트 설정] 및 \[미리보기]**

팝업창 상단의 \[설정] 버튼을 클릭하면, 아래와 같은 \[스프라이트 설정] 팝업창이 뜹니다.

<figure><img src="/files/M5uEL5CUeuX5ZIbWN4gv" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/idbRFBg0j2kYhd8xPWNb" alt=""><figcaption></figcaption></figure>

스프라이트 정보, 스프라이트 시트, 스프라이트 테두리, 이름, 충돌, 주변광, 기타 등등 설정 가능하며,

그리고, \[미리보기]에서는 주변광범위 표시, 충돌범위 표시, 재생 여부, 그리드 표시 여부, 그리드 맞춤, 기타, 등등 설정 가능합니다.

<figure><img src="/files/yI4G8hlBYRLgcp0KniRw" alt=""><figcaption></figcaption></figure>

## **4. \[리소스 삭제]**

리소스는 삭제 버튼 클릭을 통해 삭제 가능합니다.

<figure><img src="/files/fNCOuKBWRUSmWy62kFNA" alt=""><figcaption></figcaption></figure>

## **5. \[기타 옵션]**

\[새로고침], \[복제], \[대체하기], \[내보내기] 등 기능도 있습니다.

<figure><img src="/files/u3ePhpY7RojBOZMUxj3l" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/swLCc3dc80mVhf7QttHI" alt=""><figcaption></figcaption></figure>


# 스프라이트 관리자

> **\[리소스 관리자] - \[설정]** 을 클릭하면 스프라이트 관리자를 열 수 있습니다.
>
> 해당 스프라이트의 액션(캐릭터의 모션) 및 이미지 세부 설정을 할 수 있습니다.

<figure><img src="/files/1Mt5PScK6AqwpVd6DBqE" alt=""><figcaption></figcaption></figure>

> **\[스프라이트 시트]**
>
> 이미지 전체 뷰를 볼 수 있으며, 그리드(배열)를 지정하여 이미지를 일정 단위로 나누어 프레임에 추가할 수 있습니다. 드래그를 하거나 클릭을 하여 프레임 영역을 지정할 수 있습니다.
>
> **\[액션]**
>
> 캐릭터의 모션으로 사용될 단위 입니다. 이름을 설정하여 상황에 맞는 이름을 설정하여 적절한 모션을 구현할 수 있습니다.
>
> **\[프레임]**
>
> 액션에 적용될 구성 단위입니다. 스프라이트 시트에서 그리드에 맞게 나뉜 셀을 클릭하여 프레임을 추가하여 프레임을 편집할 수 있습니다. 프레임을 추가 시 현재 선택된 프레임의 뒤에 프레임이 생성됩니다. 선택된 프레임을 해제하고자 한다면 프레임 영역의 빈 공간을 클릭하면 선택이 해제됩니다.
>
> **\[미리보기]**
>
> \- 재생: 선택된 현재 액션을 재생하여 미리 볼 수 있습니다.
>
> \- 반복: 현재 재생을 반복 재생할지 여부를 설정합니다.
>
> \- 충돌 범위: 애니메이션 피격 판정, NPC 타입 유닛의 경우 이벤트 범위 등으로 사용되는 기능입니다.
>
> \- 주변광: 환경광을 설정 시 해당 스프라이트 기준으로 밝게 비춰질 영역의 범위를 설정할 수 있습니다.

<figure><img src="/files/8JHs9ywmIBjz0RFS0Fr5" alt=""><figcaption></figcaption></figure>

> **\[설정]**
>
> 선택한 영역의 속성들을 설정하는 기능입니다.
>
> &#x20;
>
> **스프라이트 시트 영역 : 0slime.png (스프라이트)**
>
> **액션 영역 : 0slime.png/down (액션:down)**
>
> **프레임 영역 : 0slime.png/down/#1 (프레임:down의 #1번)**
>
> &#x20;
>
> 설정 상단의 네비게이션 바를 확인하면 현재 포커스가 어느 영역에 맞춰져 있는지 확인 할 수 있습니다.

<figure><img src="/files/HRKiw7e4p6couYy3QUKO" alt=""><figcaption></figcaption></figure>

> **\[메뉴 구성]**
>
> **추가**
>
> 액션 부분을 우클릭 - 추가 하면 새로운 액션을 만들 수 있습니다.
>
> 액션이 선택되어 있을때 스프라이트 시트의 이미지를 좌클릭 하면 프레임 리스트에 추가 됩니다.
>
> **삭제**
>
> 삭제를 원하는 액션 또는 프레임을 클릭 후 delete 키를 누르면 삭제됩니다.
>
> **잘라내기, 복사 및 붙여넣기**
>
> 복사 및 붙여넣기를 원하는 액션 또는 프레임을 클릭 후 **Ctrl + C / V** 키를 누르면 됩니다.
>
> 잘라내기의 경우 **Ctrl + X**


# 레이아웃 관리자

**\[도구] - \[레이아웃 관리자]** 를 클릭하면, 레이아웃 편집 팝업 창이 뜹니다. 각종 컨트롤과 커스텀 메뉴 관리, 퀵슬롯 추가 등등 기능이 포함되어 있습니다.

<figure><img src="/files/zJCCSbSLiqczfJ9XSPbD" alt=""><figcaption></figcaption></figure>

{% tabs %}
{% tab title="① 페이지 리스트" %}
레이아웃 관리자는 페이지 단위로 레이아웃을 관리합니다.
{% endtab %}

{% tab title="② 컨트롤 상자" %}
레이아웃 페이지 안에 컨트롤을 생성할 수 있습니다.
{% endtab %}

{% tab title="③ 컨트롤 리스트" %}
선택된 페이지에 생성된 컨트롤을 볼 수 있습니다.
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="④ 속성 상자" %}
페이지, 컨트롤 등의 속성을 보거나 설정할 수 있습니다.
{% endtab %}

{% tab title="⑤ 퀵메뉴 상자" %}
아이콘 형태로 되어있으며, 초기화, 저장, 내보내기, 불러오기, 커스텀 메뉴 관리자 및 컨트롤 생성 기능으로 구성되어 있습니다.
{% endtab %}

{% tab title="⑥ 레이아웃 뷰" %}
인게임에서 보여질 형태를 미리볼 수 있으며, 컨트롤을 세부적으로 조절할 수 있습니다.
{% endtab %}
{% endtabs %}

**레이아웃 종료 시**

레이아웃 편집을 끝내고, 해당 팝업 창을 종료하면, 아래와 같은 **“변경된 레이아웃을 저장하시겠습니까?”** 팝업 창이 나타납니다.

<figure><img src="/files/eQzgHb6BtJNtZBiNt0Rw" alt=""><figcaption></figcaption></figure>

<details>

<summary><strong>“OK”클릭 시</strong></summary>

편집한 내용들이 저장되고 관리자가 종료됩니다.

</details>

<details>

<summary><strong>“NO”클릭 시</strong></summary>

편집한 내용들을 저장하지 않고 관리자가 종료됩니다.

</details>

<details>

<summary><strong>“CANCEL” 클릭 시</strong></summary>

창을 끕니다.

</details>

<figure><img src="/files/sO1iTFbPqoYMdVCg20ft" alt=""><figcaption></figcaption></figure>

**저장 완료 시 알림**

저장을 완료하게 되면 해당 알림과 함께 변경 사항이 적용됩니다.


# 이벤트 페이지 관리자

## **이벤트 페이지 :**

이벤트 페이지란 아래와 같이 인게임 화면의 우측 상단에 있는 확성기 모양의 아이콘을 통해 접근할 수 있는 이벤트 목록에 게시될 각각의 이벤트를 의미합니다. 이벤트 페이지는 이미 출시된 게임에만 등록할 수 있습니다.

<figure><img src="/files/5OwNwnGXQEmnRu9BM8YB" alt=""><figcaption></figcaption></figure>

각각의 이벤트 페이지는 아래 스크린샷과 같은 형태로 보여지게 되고, 게임을 플레이하는 유저가 각 이벤트에서 제시하는 조건을 달성할 시 해당 유저에게 등록해 놓은 아이템을 지급하게 됩니다.

화면 좌측 이벤트 페이지 목록에서 각각의 이벤트 페이지에 수령 가능한 보상이 있을 시 아래 스크린샷처럼 좌측에 주황색 체크 표시가 출력됩니다.

<figure><img src="/files/GfKrKMbXLmDpvzPBPIoG" alt=""><figcaption></figcaption></figure>

유저가 이벤트 페이지에 설정한 조건을 만족시켰는지 여부에 따라 아이템 셀(아이템을 지급받을 수 있는 박스)는 아래의 4가지 상태로 출력됩니다.

* 조건 미충족 : 추가 표시 없음 / 클릭(터치) 시 아이템 정보 조회
* 조건 충족 불가 : 불투명한 아이템 셀, 하얀 X 마크 / 클릭(터치) 시 아이템 정보 조회
* 조건 충족 - 수령 가능 : 주황색 아웃라인, 주황색 체크 마크 / 클릭(터치) 시 아이템 수령
* 조건 충족 - 이미 수령 : 불투명한 아이템셀, 하얀 체크 마크 / 클릭(터치) 시 아이템 정보 조회

## **이벤트 페이지 관리자 :**

펑크랜드 스튜디오에서 이벤트 페이지를 추가/수정, 커스터마이징 할 수 있는 관리 도구입니다. 아래 스크린샷의 경로로 접근할 수 있습니다.

<figure><img src="/files/zGprMpp91i4NOSSKCmi4" alt=""><figcaption></figcaption></figure>

&#x20;해당 경로로 이벤트 페이지 관리자를 열게 되면 아래와 같은 창이 열리게 됩니다.

<figure><img src="/files/wGctx2e8KiPYXmoNUtv9" alt=""><figcaption></figcaption></figure>

1. UI 추가 버튼 목록
   * 이벤트 페이지를 꾸미거나 기간을 늘려 아이템 셀을 추가해야 할 경우에 이용합니다.
2. 페이지 목록 조회 및 추가/삭제
   * 추가한 이벤트 페이지를 조회 및 선택할 수 있습니다.
   * 페이지 삭제의 경우엔 기간이 종료된 이벤트에 한해 Delete 버튼을 눌러 삭제할 수 있습니다.
   * 하단의 버튼을 눌러 원하는 템플릿을 선택하면 이벤트 페이지를 추가할 수 있습니다.
3. 페이지 구성 미리보기 및 UI 선택,이동, 크기 조절
   * 구성한 페이지를 미리 볼 수 있는 영역입니다.
   * 각 구성요소를 클릭 시 해당 요소를 선택하여 이동 및 크기 조절을 할 수 있습니다.
   * 여러 요소가 중첩되있는 경우에 클릭 시 최하단(자식이 없는) UI가 우선적으로 선택되고 추가 클릭을 하게 되면 상위 UI를 선택할 수 있습니다.
4. 페이지 구성 요소(페이지 및 UI) 트리뷰
   * 구성요소는 이벤트 페이지 자체(최상단) 및 페이지에 종속된 UI들로 이루어져 있습니다. 자세한 설명은 본 튜토리얼 하단 `이벤트 페이지 구성요소 및 커스터마이징` 파트에서 확인할 수 있습니다.
   * 각 구성 요소의 부모/자식 관계를 파악할 수 있습니다. 5의 데이터 중 위치 및 크기와 관련된 데이터의 경우 %값을 쓰게 될 시 부모 UI의 위치 및 크기에 영향을 받습니다.
5. 선택한 구성 요소의 속성값 조회 및 편집
   * 이벤트 페이지의 경우 이벤트 명(title), 활성화여부(activated), 아이템 라벨에 표시될 수령 조건의 포맷(itemLabelFormat), 이벤트 시작일(startDate), 이벤트 지속 기간(durationDay)를 편집할 수 있습니다.
   * 이벤트 페이지가 아닌 구성요소들은 각각 위치를 조정할 수 있는 값 등을 편집할 수 있습니다.

## **이벤트 페이지 추가방법 :**

이벤트 페이지 관리자의 좌측 하단 `새 이벤트 페이지 추가` 버튼을 통해 신규 이벤트 페이지를 추가할 수 있습니다.

제작자 분들이 쉽게 이벤트 페이지를 추가하실 수 있도록 현재 아래 3가지의 템플릿을 제공하고 있습니다.

* 일일 보상 : 이벤트 시작일로부터 1일마다 보상을 수령 가능, 이미 지난 날짜의 보상 수령 불가
* 레벨 달성 보상 : 유저가 특정 레벨을 달성할 시 보상 수령 가능
* 누적 접속일 보상 : 이벤트 기간내에 유저가 누적해서 접속한 일수에 따라 보상 수령 가능

<figure><img src="/files/B7XWQo0HwXbZWYhtt8Qe" alt=""><figcaption></figcaption></figure>

이벤트 페이지를 추가한 후 각각의 아이템 셀(붉은 선으로 표시된 영역)을 클릭하여 선택한 후 우측 주황색 선으로 표시된 영역에서 보상으로 아이템을 등록할 수 있습니다.

템플릿에 따라 필요한 아이템 셀에 아이템 등록을 완료하게 되면 이벤트 페이지 관리자 우측 하단의 업로드 버튼을 통해 추가한 페이지를 현재 서비스 중인 게임에 바로 적용시킬 수 있습니다.

## **이벤트 페이지 구성요소 및 커스터마이징:**

각각의 템플릿을 통해 이벤트 페이지를 만드는 경우, 모든 아이템 셀에 각 아이템만 등록해주면 바로 업로드가 가능합니다. 하지만, 각각의 게임에 맞게 이벤트명, 이벤트 설명 등의 구성요소를 설정해준다면 다른 게임과의 차별성, 게임에 대한 몰입감과 같은 부분에서 도움이 될 수 있습니다.

각 구성요소는 `3. 페이지 구성 미리보기 및 UI 선택,이동, 크기 조절` 과 `5. 선택한 구성 요소의 속성값 조회 및 편집` 을 통해 커스터마이징이 가능합니다.

1. 이벤트 페이지(Page)
   * 이벤트 자체의 설정을 설정할 수 있습니다.
   * 이벤트명(title) - 좌측에 표기되는 이벤트 목록 및 페이지 상단에 출력되는 이벤트 이름
   * 활성화여부(activated) - 해당 이벤트 페이지의 활성화 여부입니다.\
     false일 시 유저에게 해당 페이지가 보여지지 않습니다. 웹콘솔([nekoland.net/me](http://nekoland.net/me))의 `공지사항/이벤트 & 푸시` 메뉴에서도 해당 값을 실시간으로 수정 가능합니다.
   * 아이템 라벨 포맷(itemLabelFormat) - 각 아이템 셀의 상단에 표기되는 아이템 수령을 위한 조건을 보여줄 방식입니다.\
     `{0}` 부분에 각 아이템 셀에서 설정한 조건(레벨) 또는 이벤트 시작일부터 지난 일수가 표기됩니다.\
     예시 : {0}레벨 → 1레벨 2레벨 3레벨 등등 / {0}번째 날 → 1번째 날 2번째 날 3번째 날 등등
   * 이벤트 시작일(startDate) - 해당 이벤트가 실제 유저들에게 표시되기 시작하는 날짜입니다. 현재 시간보다 이전 날짜로는 설정할 수 없습니다.
   * 이벤트 지속 기간(durationDay) - 해당 이벤트가 지속되는 기간(일수)입니다.\
     날짜 기반 템플릿(일일 보상, 접속일 보상)의 경우 아이템 셀의 갯수가 지속기간보다 많을 수 없습니다. 일일보상의 경우 아이템 셀의 갯수와 지속기간이 일치해야 합니다.\
     해당 기간이 만료되면 유저들에게 더이상 페이지가 보이지 않게 되고, 해당 페이지를 삭제 할 수 있습니다.
2. 아이템 박스(ItemBox)
   * 지급할 아이템을 선택하고, 해당 아이템의 이미지가 출력되는 공간입니다.
   * 아이템(item) - 우측의 `…` 을 눌러 아이템 선택창을 통해 아이템을 선택하거나 아이템 번호를 직접 입력해 지급할 보상을 선택할 수 있습니다.
   * 아이템 수량(itemCount) - 아이템을 선택한 경우에 편집할 수 있게되고, 조건 충족시 선택할 아이템을 몇개 지급할 지 설정할 수 있습니다.
3. 아이템 라벨(ItemLabel)
   * 아이템을 수령하기 위한 조건이 출력되는 공간입니다.
   * 필요레벨(neededLevel) - 레벨 달성 보상 템플릿을 선택한 경우에만 편집할 수 있고, 아이템을 수령하기 위해 달성해야할 레벨을 설정할 수 있습니다.
4. 아이템 셀(Item Cell)
   * 보상으로 주어질 아이템에 관한 UI들이 담기는 단위 UI입니다.
   * 인덱스(index) - 수정할 수 없는 값으로, 이벤트 보상이 순차적으로 지급되야 할 경우(일일 보상, 접속일 보상 등) 해당 인덱스 순서에 따라 아이템 수령 조건이 충족됩니다.
   * 아이템 박스와 아이템 라벨에서 설정할 수 있는 값들은 아이템 셀에서도 설정할 수 있습니다.
5. 레벨 라벨(LevelLabel) - 레벨 달성 보상 템플릿전용
   * 유저의 현재 레벨을 출력해주는 공간입니다. 삭제할 수 있지만 따로 추가할 수는 없습니다.
   * 이벤트 페이지의 `아이템 라벨 포맷`과 같은 방식으로 편집할 수 있습니다.
   * 예시 : 현재 레벨 : {0} → 현재 레벨 : 22
6. 기간 라벨(PeriodLabel)
   * 이벤트 페이지의 기간을 출력해주는 공간입니다. 삭제할 수 있지만 따로 추가할 수는 없습니다.
   * `{0}` 부분에 이벤트 시작일 , `{1}` 부분에 이벤트 종료일이 표기됩니다.
   * 시작일과 종료일은 `yyyy.MM.dd` 의 형식으로 출력됩니다. 예 : 2020.01.16
   * 예시 : 시작일이 20년 1월 16일, 이벤트 기간이 7일인경우\
     {0} 00시 부터 {1} 23시 59분까지 → 2020.01.16 00시 부터 2020.01.22 23시 59분까지
7. 텍스트박스(Text)
   * 이벤트 페이지 관리자의 좌측 상단에서 자유롭게 추가/삭제 가능한 텍스트박스입니다.
   * text - 실제 표기될 텍스트를 입력할 수 있습니다.
   * textAlign - 텍스트가 기준 위치를 지정할 수 있습니다.
   * 글씨크기(textSize) - 표기할 텍스트의 크기입니다. 미리보기에 출력되는 텍스트 크기와 실제 앱과 출력되는 크기에 약간의 차이가 있을 수 있습니다.
   * 글씨색상(color) - 우측의 `…` 버튼을 통해 색상을 선택하거나 (A)R,G,B 의 형태로 직접 입력해 설정 할 수 있습니다. 직접 입력을 통해서만 투명도(A)값을 수정할 수 있습니다.
8. 이미지박스
   * 이벤트 페이지 관리자의 좌측 상단에서 자유롭게 추가/삭제 가능한 이미지박스입니다.
   * 이미지(image) - 우측의 `…` 버튼을 통해 프로젝트가 저장된 위치의 Pictures 폴더에 추가된 이미지 중 출력할 이미지를 선택할 수 있습니다.
9. 스크롤 영역 - 스크롤 패널(ScrollPanel)
   * 실제 보여지게 되는 영역을 나타냅니다.
   * 가로스크롤 사용부(horizontal) - 가로 스크롤링을 사용할지 여부입니다. 기본 값은 False입니다.
   * 세로스크롤 사용여부(vertical) -세로 스크롤링을 사용할지 여부입니다. 기본 값은 False입니다.
   * 배경색상(color) - 우측의 `…` 버튼을 통해 색상을 선택하거나 (A)R,G,B 의 형태로 직접 입력해 설정 할 수 있습니다. 직접 입력을 통해서만 투명도(A)값을 수정할 수 있습니다.
   * 스크롤 미리보기(horizontalOffset / verticalOffeset) - 가로 또는 세로 스크롤링을 사용하도록 설정할 경우에 실제 스크롤 됐을 때의 상태를 미리 볼 수 있게 해주는 값입니다. 0%\~100% 까지의 값을 입력할 수 있습니다.
10. 스크롤 영역 - 컨텐츠 박스(Content)
    * 아이템셀이 등록되고 추가되는 공간입니다. 이벤트 페이지에서 해당 영역에만 아이템 셀을 추가할 수 있습니다.
    * 실제 스크롤 되는 영역을 나타냅니다.
    * 정상적으로 스크롤이 되기 위해선 스크롤패널보다 크기를 크게 만들어 주고, 스크롤 패널의 horizontal 또는 vertical 값을 True로 설정해주어야 합니다.
11. 크기 및 위치 조정을 위한 공통 사항
    * 이벤트 페이지 관리자 각 구성요소의 좌표계는 좌측 상단이 기준점(0,0)이고, 좌표값은 우측, 하단 방향으로 증가하는 방식입니다.\
      예시 : (50, -30) → 기준점 기준 우측 50 위쪽 30
    * x, y - 각 구성요소의 위치를 결정하는 값입니다. 부모 구성요소의 크기에 따라 변동되도록 % 값을 사용할 수 있습니다.
    * width, height - 각 구성요소의 크기를 결정하는 값입니다. 부모 구성요소의 크기에 따라 변동되도록 % 값을 사용할 수 있습니다.
    * anchor - 구성요소의 위치 값이 적용될 부모의 기준점을 설정할 수 있습니다.
    * pivotX, pivotY - 각 구성요소의 위치 기준점을 결정하는 값입니다.\
      0\~1 사이의 값을 가지고, 0이 좌측 끝, 상단 끝 1이 우측 끝, 하단 끝을 의미합니다.\
      (0,0) 일경우 구성요소의 위치값이 구성요소의 좌측 상단이, (0.5,0.5)일 경우 구성요소의 정중앙이 기준이됩니다.
    * 예시 : 구성요소를 부모의 정중앙에 위치시키고 싶을 경우 아래와 같은 방법들이 있습니다.
      * anchor : MiddleCenter / pivotX : 0.5 / pivotY : 0.5 / x : 0 / y : 0
      * anchor : MiddleLeft / pivotX : 0.5 / pivotY : 0.5 / x : 50% / y : 0
      * anchor : TopLeft / pivotX : 0.5 / pivotY : 0.5 / x : 50% / y : 50%
    * 예시 : 구성요소를 부모의 좌측상단에 위치시키고 싶을 경우 아래와 같은 방법이 있습니다.
      * anchor : TopLeft / pivotX : 0 / pivotY : 0 / x : 0 / y : 0
    * 예시 : 구성요소를 부모의 우측하단에 위치시키고 싶을 경우 아래와 같은 방법이 있습니다.
      * anchor : BottomRight / pivotX : 1 / pivotY : 1 / x : 0 / y : 0


# 데이터베이스

데이터베이스에서는, 캐릭터 데이터, 직업 데이터, 아이템 데이터, 몬스터 데이터, 스킬 데이터, 애니메이션 데이터, 상태 데이터, 도감 데이터, 타일셋 데이터, 공용 이벤트, 시스템 데이터 등 각종 데이터를 편집하고 관리 할 수 있습니다.

## **1. \[데이터베이스] 편집창 열기**

화면 상단의 \[도구] 버튼을 클릭 후, \[데이터베이스]를 클릭하면 \[데이터베이스] 편집 팝업창이 뜹니다.

혹은, 화면 상단의 \[데이터베이스] 아이콘 클릭으로도 편집 팝업창을 띄울수 있습니다. (아래 스크린샷 빨간 네모 안의 아이콘 참조 바랍니다.)

<figure><img src="/files/jttGCSTMY6ozhgnzNsDP" alt=""><figcaption></figcaption></figure>

데이터베이스 각 항목을 편집한 후 \[적용] 및 \[확인] 버튼을 클릭하여 설정 내용을 저장해야만 현재 만들고 있는 게임에 실제로 반영됩니다.

## **2. \[최대치 변경]**

\[최대치 변경]은 아래 사진과 같이 \[최대치 설정] 클릭하면, \[최대치 설정] 팝업창이 뜹니다. 해당 창에서 최대치를 변경하고, \[OK] 버튼을 클릭하여 저장하면, 현재 제작중인 게임에 반영됩니다.

예를 들면: 캐릭터 최대치 설정을 클릭하면, 아래와 같이 \[최대치 설정] 팝업창이 뜨며, 여기에서 최대치를 수정하고 \[OK]를 클릭하면, 현재 편집중인 게임에 반영 됩니다.

<figure><img src="/files/shqBNKOJKlVzWe5nJK9t" alt=""><figcaption></figcaption></figure>

## **3. 캐릭터**

이름, 그래픽, 이동속도, 점프힘, 특성, 메모를 설정 할 수 있습니다.

<figure><img src="/files/yVFDh6INLyGWm1yfNtEr" alt=""><figcaption></figcaption></figure>

## **4. 직업**

이름, 최대레벨, 최대 HP, 최대 MP, 공격력, 방어력, 마법 공격력, 마법 방어력, 민첩, 운, 기본 스킬, 특성, 메모를 설정 할 수 있습니다.

<figure><img src="/files/hu783TR8mA8xDtN0Z0WN" alt=""><figcaption></figcaption></figure>

## **5. 아이템**

각종 아이템 관련 데이터 설정이 가능합니다.

이름, 아이콘, 설명, 종류, 가격, 쿨타임, 애니메이션, 판매 가격, 거래가능 여부, 드랍 가능 여부, 판매 가능 여부, 창고 이동 가능 여부, 최대 개수, 액션 이름, 데미지 종류, 공식, 크리티컬 유무, 특성, 메모를 설정 할 수 있습니다.

<figure><img src="/files/C4Pxk10j7dCwUtb7CfOl" alt=""><figcaption></figcaption></figure>

## **6. 몬스터**

각종 몬스터 데이터 설정이 가능합니다.

이름, 그래픽, 경험치, 공격 타입, 플레이어와 충돌 여부, 지형과 충돌 여부, 최대HP, 최대 MP, 공격력, 방어력, 마법 공격력, 마법 방어력, 민첩, 운, 최소 골드, 최대 골드, 최소 레벨, 최대 레벨, 팀 태그, 특성, 메모를 설정 가능합니다.

<figure><img src="/files/J4JlKRRbj3ekt0bGeXmj" alt=""><figcaption></figcaption></figure>

## **7. 스킬**

이름, 아이콘, 설명, 애니메이션, 쿨타임, 소모HP, 소모MP, 액션 이름, 스킬 유형, 데미지 종류, 데미지 공식, 크리티컬 유무, 특성, 메모를 설정 가능합니다.

<figure><img src="/files/Q0rXrvxOUJpqIM4juaTO" alt=""><figcaption></figcaption></figure>

## **8. 애니메이션**

이름, 그래픽, 커맨드 추가, 커맨드 삭제, 커맨드 복사, 재생, 충돌영역 표시 유무, SE 재생 유무, 속성을 설정 가능합니다.

<figure><img src="/files/6dyPCACs8ZoRa98f8iEp" alt=""><figcaption></figcaption></figure>

## **9. 상태**

이름, 아이콘, 설명, 종류, 애니메이션 표시 유무, 지속시간, 사망시 해제 여부, 지속 상태(종류, 시간, 공식, 크리티컬 유무), 특성, 메모를 설정 가능합니다.

<figure><img src="/files/iKfM7aaqSz9ZpLLCwzV1" alt=""><figcaption></figcaption></figure>

## **10. 도감**

이름, 아이콘, 설명, 아이템No/개수, 보상 아이템/개수, 보상 골드, 특성, 메모를 설정 가능합니다.

<figure><img src="/files/nNqdt43Mk16SeKdjhwVT" alt=""><figcaption></figcaption></figure>

## **11. 타일셋**

이름, 타일셋, 오토타일, 포그, 파노라마, 이동가능 여부, 이동가능(4방향) 여부, 우선순위, 수풀, 태그를 설정 가능합니다.

<figure><img src="/files/LoNFZ2PjRusVqILmXHSU" alt=""><figcaption></figcaption></figure>

## **12. 공용 이벤트**

이름, 시작 조건, 조건 변수, 커맨드를 설정 가능합니다.

<figure><img src="/files/GYI44vrEUL9kxKTpmxeq" alt=""><figcaption></figcaption></figure>

## **13. 시스템**

기본 캐릭터, 게임 이름, 컨트롤 설정, 피로도 설정, 시스템 설정(타이틀 이미지, 윈도우 스킨, 버튼 스킨,화면 해상도, 버튼 SE, 데미지 SE, 크리티컬 데미지 SE), 용어를 설정 가능합니다.

<figure><img src="/files/cdO14ebf6XLH50C4MvIe" alt=""><figcaption></figcaption></figure>

&#x20;


# 스파인 적용법

\*스파인 버전 3.8.20 이상부터 적용이 가능합니다.\
\*펑크랜드 무료 스파인 리소스, 예시 게임 파일을 하단 링크에 첨부하였으니 참고하시길 바랍니다.

예제 리소스 : <https://nekoland.net/market/detail/3119>

***

* 펑크랜드에서의 spine 애니메이션 적용과 장비 교체 기능을 사용하기 위해선 spine 파일의 애니메이션 이름과 슬롯의 이름 설정을 펑크랜드에 맞게 설정해야합니다.\
  \
  키워드는 다음과 같습니다.

1. 애니메이션

|    |                |
| -- | -------------- |
| 대기 | idle\_left     |
|    | idle\_right    |
|    | idle\_up       |
|    | idle\_down     |
| 걷기 | left           |
|    | right          |
|    | up             |
|    | down           |
| 공격 | attack\_left   |
|    | attack\_right  |
|    | attack\_up     |
|    | attack\_down   |
| 점프 | jump\_left     |
|    | jump\_right    |
|    | jump\_up       |
|    | jump\_down     |
| 피격 | damaged\_left  |
|    | damaged\_right |
|    | damaged\_up    |
|    | damaged\_down  |
| 사망 | dead\_left     |
|    | dead\_right    |
|    | dead\_up       |
|    | dead\_down     |

<figure><img src="/files/zPIGHyyEuqrWABl9lRcy" alt=""><figcaption><p>*스파인 애니메이션 이름 예시</p></figcaption></figure>

2. 아이템

| 모자 | hat          |
| -- | ------------ |
| 갑옷 | armor        |
| 무기 | weapon       |
| 방패 | shield       |
| 날개 | wing         |
| 신발 | shoes\_left  |
|    | shoes\_right |

<figure><img src="/files/Km3Kh5PUHkDUGqgtyVju" alt="" width="555"><figcaption><p>*스파인 애니메이션 이름 예시</p></figcaption></figure>

\
\ <br>

***

* ## 캐릭터 등록

1. 스파인 allas.txt, json, png 파일을 펑크랜드 프로젝트 **Spines** 폴더에 넣습니다.\
   \* 세가지 파일이 같은 폴더에 존재해야 스파인 리소스가 문제 없이 실행됩니다, \
   \* 폴더명(**Spines)**&#xC740; 대소문자 구분 및 철자를 정확히 동일하게 해야합니다.

<figure><img src="/files/vjqcnHZds6X9hqi2FB7B" alt=""><figcaption></figcaption></figure>

2. 데이터 베이스>캐릭터>그래픽 에서 png 파일을 선택해줍니다.

<figure><img src="/files/HZz6RhkKgAiXFKOzJ7ti" alt=""><figcaption></figcaption></figure>

3. 이름 위치, 충돌 영역, 주변광을 설정합니다.

<figure><img src="/files/rlblLajrfaFWf4ouSEZZ" alt=""><figcaption></figcaption></figure>

리소스 관리자에서 png 파일을 선택해 스프라이트 편집기로 이름 위치, 충돌, 주변광을 설정합니다.\
\*스케일, 테두리 기능은 스파인 리소스에 적용 되지 않습니다.\
\
\ <br>

***

* ## 아이템 등록

1. 아이콘, 아이템 png 이미지를 **Icons** 폴더에 넣어줍니다.

<figure><img src="/files/rYHXProE2t20ayUQ7QcP" alt=""><figcaption></figcaption></figure>

2. 데이터 베이스> 아이템에서 아이콘 이미지, 스파인 이미지를 선택해줍니다.

<figure><img src="/files/I8QCjtaxPeGGg2wysSFE" alt=""><figcaption></figcaption></figure>

\* 아이콘: 상점, 인벤토리에서 보이는 아이템 아이콘 이미지입니다.\
&#x20;스파인 이미지: 스파인 캐릭터 위에 씌워지는 아이템 이미지 입니다.

3. 아이템의 종류를 선택해줍니다.

<figure><img src="/files/7v5xd7rud6zRkuQFWm3U" alt=""><figcaption></figcaption></figure>

\*장착하고자 하는 아이템의 종류와 스파인에서의 슬롯 이름을 동일하게 설정해야 스파인 아이템으로 적용 가능합니다.<br>

| 모자   | hat          |
| ---- | ------------ |
| 갑옷   | armor        |
| 무기   | weapon       |
| 방패   | shield       |
| 날개   | wing         |
| 신발   | shoes\_left  |
|      | shoes\_right |
| 반지   | ring\_left   |
|      | ring\_right  |
| 액세서리 | acc\_left    |
|      | acc\_right   |

***

* ## 예제 활용 tip

예제 파일의 스파인 아이템을 직접 수정하여 사용하실 경우 이미지의 크기와 객체 위치를 동일하게 맞춰야 합니다.

<figure><img src="/files/b0KFjnB22MkqP6DK5MrS" alt=""><figcaption></figcaption></figure>

<br>

\ <br>

<br>

<br>


# 스크립트 튜토리얼


# 사용 방법

`도구`를 클릭하고, `스크립트(혹은 툴 바에 있는 스크립트 아이콘)`를 클릭하면,&#x20;

`클라이언트 스크립트` 및 `서버 스크립트`를 열어 편집 할 수 있습니다.&#x20;

아래 스크린샷을 참조 바랍니다.

<figure><img src="/files/aIwaHDgGnbHYVEtTo5I0" alt=""><figcaption></figcaption></figure>

&#x20;


# \[스크립트 도움말]

\[스크립트 도움말]을 클릭하면, 스크립트 작성에 필요한 각종 내용을 참조 가능합니다.

<figure><img src="/files/Zy1iIB3JMFuLDCArgP5a" alt=""><figcaption></figcaption></figure>


# 서버 스크립트

## 서버 스크립트 <a href="#undefined" id="undefined"></a>

* 서버 스크립트는 프로젝트 폴더 혹은 Scripts에 Hello.lua와 같은 파일 이름으로 존재해야 읽힙니다.

| 스크립트                                                                        | 설명                               |
| --------------------------------------------------------------------------- | -------------------------------- |
| **Server.onJoinPlayer(unit)**                                               | 새로운 플레이어가 접속                     |
| **Server.onLeavePlayer(unit)**                                              | 특정 유저가 게임 퇴장                     |
| **Server.SendCenterLabel(text)**                                            | 가운데 라벨 표시                        |
| **Server.SendSay(text, color)**                                             | 채팅 창에 메시지 표시                     |
| **ScriptEventPublisher Server.GetTopic(topic)**                             | 클라이언트와 메시지를 주고받기 위해 특정 주제를 등록한다. |
| **Server.FireEvent(topic, args…)**                                          | 클라이언트에게 특정 topic으로 메시지를 전송한다.    |
| **Server.players**                                                          | 플레이어 목록을 가져온다.                   |
| **Server.fields**                                                           | 전체 맵 목록을 가져온다.                   |
| **Server.CreateEventUnit(name, imageID)**                                   | 이벤트 유닛을 만든다.                     |
| **Server.GetField(dataID)**                                                 | 특정 아이디의 맵을 가져온다.                 |
| **ScriptUnit**                                                              | 몬스터나 플레이어와 같은 객체다.               |
| **Server.playerLeavePartyCallback(scriptRoomPlayer,scriptParty)**           | 플레이어가 파티를 떠날 때 호출됩니다.            |
| **Server.playerJoinPartyCallback(scriptRoomPlayer,scriptParty)**            | 플레이어가 파티에 들어갈 때 호출됩니다.           |
| **Server.onAddItem(scriptUnit,titem)**                                      | 유저가 아이템을 획득할 때 호출됩니다.            |
| **Server.onRemoveItem(scriptUnit,titem)**                                   | 유저의 아이템을 제거 및 사용할 때 호출됩니다.       |
| [**ScriptClan**](/punkland/punkland-studio/script/undefined-1/scriptclan)   | 유저가 속한 클랜을 가져온다.                 |
| [**ScriptColor**](/punkland/punkland-studio/script/undefined-1/scriptcolor) | 색상 정보를 가져온다.                     |

* unit.type = 유닛의 타입 (0=플레이어, 1=이벤트, 2=몬스터)

**예) 서버 스크립트 - 플레이어 레벨업 시 메시지 출력 및 특정 레벨 달성 시 아이템 지급**

{% code title="Scripts/Servers/Hello.lua" overflow="wrap" lineNumbers="true" %}

```lua
function onUnitLevelUp(target, level)
    if target.level == 50 then --타겟이 레벨 50 달성 시 서버 전체에 알림을 띄우고 1번 아이템을 지급한다.
        Server.SendCenterLabel(target.name .. '님이 ' .. level .. '이 되었습니다!')
        target.AddItem(1) 
    elseif target.level == 55 then  --타겟이 레벨 55 달성 시 5번 스킬과 5,000게임 머니를 지급한다. 
        target.AddSkill(5)
        target.AddGameMoney(5000)
    end
end
 
Server.onUnitLevelUp.Add(onUnitLevelUp)
```

{% endcode %}

**예제) 서버 스크립트 - PVP로 플레이어 처치 시 서버 전체 메시지 출력 및 보상 지급**

{% code title="Scripts/Servers/Hello.lua" overflow="wrap" lineNumbers="true" %}

```lua
function onUnitDead(target, attacker) --target은 죽 은자, attacker는 공격 자
    if (target.type==0 and attacker.type==0) then --PlayerUnit일 경우
        Server.SendCenterLabel(target.name..'을(를) \n'..attacker.name..'이(가) 죽였다.')
        attacker.AddGameMoney(100) --공격자에게 100골드을 준다.
        if rand(1, 100) <= 50 then
            attacker.AddItem(100) --공격자에게 50% 확률로 1번 아이템을 준다.
        end
    end
end
Server.onUnitDead.Add(onUnitDead) -- Server.onUnitDead에 onUnitDead 함수를 추가한다.
```

{% endcode %}

**onJoinField 활용 방법 - 특정 맵에 입장 시 이름 출력 및 서버 전체 메시지 보내기**

{% code overflow="wrap" lineNumbers="true" %}

```lua
function onJoinField()
    function onJoinField_1(Field,unit)
        unit.SendCenterLabel(Field.name) -- 유닛에게 잠시 필드 이름을 표시한다.
        if #Field.playerUnits > 10 then -- #은 테이블의 길이를 의미한다.
            Server.SendSay(Field.name.."에 11명 이상의 플레이어가 모였습니다!")
        end
    end
        local map = Server.GetField(1)
        if map ~= nil then
                map.onJoinField.Add(onJoinField_1)--1번 필드에 입장 시 onJoinField_1 함수를 호출한다. 
        end
end
Server.RunLater(onJoinField,1) -- 1초 후 onJoinField 함수를 실행한다.
-- 1초 후 실행하는 이유는 서버 실행 후 맵이 생성되지 않았을 수 있기 떄문에 nil을 참조하는 것을 방지하기 위함입니다.
```

{% endcode %}

**onLeaveField -특정 맵 퇴장 시 처리**

> 인자 map - ScriptField
>
> 인자 unit - ScriptUnit

파일: 해당 맵에서 스크립트로 작성 사용 예시) 맵 퇴장 시 월드 변수의 값이 1 감소한다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
function onLeaveField(map,unit)
  print('떠난다: ' .. map.name .. ' ' ..unit.name)
  Server.SetWorldVar(10, Server.GetWorldVar(10)-1)
end

Server.GetField(5).onLeaveField.Add(onLeaveField)
```

{% endcode %}

**예) 아이템 사용(onUseItem), 구매(onBuyGameMoneyItem), 판매(onSellGameMoneyItem)시 발생하는 이벤트**

{% code overflow="wrap" lineNumbers="true" %}

```lua
Server.onUseItem.Add(
function(unit,item)
    print(unit.name)
    print(item.dataID)
  end)
  
Server.onBuyGameMoneyItem.Add(
  function(unit,itemID,count)
    print(string.format("%s ,%s ,%s",unit.name,itemID,count))
  end)
  
Server.onSellGameMoneyItem.Add(
  function(unit,itemID,count)
    print(string.format("%s,%s,%s",unit.name,itemID,count))
  end)
```

{% endcode %}

**예) 아이템 옵션 추가, 제거, 변경(ScriptUtility 참고)**

* 코드에 적용된 주석(--)을지워가면서 테스트 해보시길 바랍니다. 밑의 스크립트는 터치 시 이벤트 - 스크립트로 실행했습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
-- 인벤토리에서 첫번째 아이템의 정보를 가져옵니다.
local item = unit.player.GetItems()[1]
local option1 = item.options[1]
--Utility.SetItemOption(option1,option1.type,option1.statID,option1.value+1)
--Server.SendItemUpdated(item)
Utility.AddItemOption(unit.player.GetItems()[1],1,3,5)
--unit.player.RemoveItemOption(item,1)
unit.player.SendItemUpdated(item)
```

{% endcode %}

**예) 파티 입장 시 발생하는 이벤트(playerJoinPartyCallback)**

{% code overflow="wrap" lineNumbers="true" %}

```lua
Server.playerJoinPartyCallback =
function(scriptRoomPlayer,scriptParty) 
        print(scriptRoomPlayer.unit.name)
        print(scriptParty.maxPlayer)
        -- return 을 true 로해야 파티가 생성됩니다. 조건에 따라서 return true,false를 지정하면 됩니다.
        return true
end
```

{% endcode %}

**예) 파티 퇴장 시 발생하는 이벤트(playerLeavePartyCallback)**

```lua
Server.playerLeavePartyCallback = 
function(scriptRoomPlayer,scriptParty) 
        print(scriptRoomPlayer.unit.name)
        print(scriptParty.maxPlayer)
end
```

**예) 아이템 획득 시 이벤트(onAddItem)**

{% code overflow="wrap" lineNumbers="true" %}

```lua
Server.onAddItem.Add(
function(scriptUnit,titem) 
        print(scriptUnit.name)
        print(titem.dataID)        
end)
```

{% endcode %}

**예) 아이템 제거 시 이벤트(onRemoveItem)**

{% code overflow="wrap" lineNumbers="true" %}

```lua
Server.onRemoveItem.Add(
function(scriptUnit,titem) 
        print(scriptUnit.name)
        print(titem.id)
        print(titem.dataID)        
end)
```

{% endcode %}

**예) 피해 적용 시 발생하는 이벤트(damageCallback)**

{% code overflow="wrap" lineNumbers="true" %}

```lua
-- 피해량이 0일 경우 피해량 출력 안 됨
-- a,b ScriptUnit
Server.damageCallback = function(a, b, damage, skillDataID, critical, visible)
        damage = a.atk - b.def
        if damage <= 0  then
                visible = false
        end
        return damage, critical, visible;
end
```

{% endcode %}

**예) 거래 완료 시 발생하는 이벤트(onTradeDone)**

{% code overflow="wrap" lineNumbers="true" %}

```lua
function Trade(sender,receiver,senderItems,receiverItems)
print("sender: ")
print(sender.unit.name)
print("receiver: ")
print(receiver.unit.name)
print("senderItems: ")
print(senderItems)
for i=1 , #senderItems do
        print(i..": ")
        print(Server.GetItem(senderItems[i].dataID).name)
end
print("receiverItems: ")
print(receiverItems)
for j=1 , #receiverItems do
        print(j..": ")
        print(Server.GetItem(receiverItems[j].dataID).name)
end
end

Server.onTradeDone.Add(Trade)
```

{% endcode %}


# ScriptClan

## 설명 <a href="#undefined" id="undefined"></a>

게임 내의 한 클랜과 대응하며, 해당 클랜에 대한 정보를 제공하는 클래스입니다.

## 속성 <a href="#undefined" id="undefined"></a>

| 형식                             | 설                                                                                                                                                                                                                                      |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| DateTime createdAt { get; }    | 클랜이 생성된 시점입니다. [예제](https://nekoland.atlassian.net/wiki/spaces/nekoland/pages/457113621/ScriptClan#%ED%81%B4%EB%9E%9C%EC%9D%B4-%EC%83%9D%EC%84%B1%EB%90%9C-%EC%8B%9C%EC%A0%90-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0)                    |
| long id { get; }               | 클랜의 고유 ID 입니다. [예제](https://nekoland.atlassian.net/wiki/spaces/nekoland/pages/457113621/ScriptClan#%ED%81%B4%EB%9E%9C%EC%9D%98-ID-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0)                                                                |
| long masterPlayerID { get; }   | 클랜 마스터 플레이어의 ID 입니다.                                                                                                                                                                                                                   |
| long\[] memberIDs { get; }     | 클랜의 모든 맴버들의 ID를 배열 형식으로 가져옵니다. [예제](https://nekoland.atlassian.net/wiki/spaces/nekoland/pages/457113621/ScriptClan#%EB%AA%A8%EB%93%A0-%ED%81%B4%EB%9E%9C-%EB%A7%B4%EB%B2%84%EB%93%A4%EC%9D%98-ID-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0) |
| Table customData { get; set; } | 클랜의 커스텀 데이터입니다.                                                                                                                                                                                                                        |
| string name { get; }           | 클랜의 고유 이름입니다. [예제](https://nekoland.atlassian.net/wiki/spaces/nekoland/pages/457113621/ScriptClan#%ED%81%B4%EB%9E%9C%EC%9D%98-%EC%9D%B4%EB%A6%84-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0)                                                 |

## 함수 <a href="#undefined" id="undefined"></a>

| 형식                            | 설명                                |
| ----------------------------- | --------------------------------- |
| string GetMemberName(long id) | 클랜 맴버들 중 아이디가 id 인 유저의 이름을 가져옵니다. |
| void Invalidate()             | 클랜 정보를 갱신합니다.                     |

## 사용 예제 <a href="#undefined" id="undefined"></a>

### **클랜이 생성된 시점 출력하기**

{% code overflow="wrap" lineNumbers="true" %}

```
local myClan = unit.player.clan; 
print(myClan.createdAt.ToLocalTime());
```

{% endcode %}

### **클랜의 ID 출력하기**

{% code overflow="wrap" lineNumbers="true" %}

```
local myClan = unit.player.clan; 
print(myClan.id);
```

{% endcode %}

### **모든 클랜 맴버들의 ID 출력하기**

{% code overflow="wrap" lineNumbers="true" %}

```
local memberIDs = unit.player.clan.memberIDs;

for i = 0, #memberIDs do
  print(memberIDs[i]);
end
```

{% endcode %}

### **클랜의 이름 출력하기**

{% code lineNumbers="true" %}

```
local myClan = unit.player.clan;
print(myClan.name);
```

{% endcode %}


# ScriptColor

## 설명 <a href="#undefined" id="undefined"></a>

색을 나타내는 클래스입니다.

## 속성 <a href="#undefined" id="undefined"></a>

| 형식                  | 설명                |
| ------------------- | ----------------- |
| int a { get; set; } | 투명도 (0 \~ 255) 예제 |
| int r { get; set; } | 빨강 (0 \~ 255)     |
| int g { get; set; } | 초록 (0 \~ 255)     |
| int b { get; set; } | 파랑 (0 \~ 255)     |

## 함수 <a href="#undefined" id="undefined"></a>

| 형식                                                       | 설명                                                                                                                                                                                                                                |
| -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| static ScriptColor New(int r, int g, int b, int a = 255) | 새 ScriptColor 객체를 생성합니다. [예제](https://nekoland.atlassian.net/wiki/spaces/nekoland/pages/457113660/ScriptColor#%EB%B9%A8%EA%B0%84%EC%83%89%EC%9D%84-%EA%B0%80%EC%A7%84-ScriptColor-%EA%B0%9D%EC%B2%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0) |

## 사용 예제 <a href="#undefined" id="undefined"></a>

**빨간색을 가진 ScriptColor 객체 만들기**

```
local red = Color(255, 0, 0);
```


# 클라이언트 스크립트

## 클라이언트 스크립트 <a href="#undefined" id="undefined"></a>

* 클라이언트 스크립트는 프로젝트 폴더 혹은 Scripts에 `Hello.lua`와 같은 파일 이름으로 존재해야 읽힙니다.

<table><thead><tr><th width="355">스크립트</th><th>설명</th></tr></thead><tbody><tr><td><strong>Client.width</strong></td><td>화면의 가로 크기를 가져온다.</td></tr><tr><td><strong>Client.height</strong></td><td>화면의 세로 크기를 가져온다.</td></tr><tr><td><strong>Client.ShowAlert(text, callback)</strong></td><td>알림 메시지를 띄운다.</td></tr><tr><td><strong>Client.ShowYesNoAlert(text, callback)</strong></td><td>알림 Yes/No 메시지를 띄운다.</td></tr><tr><td><strong>Client.ShowBuyItem(id, amount, callback)</strong></td><td>특정 아이템을 구매하는 메시지를 띄운다.</td></tr><tr><td><strong>Client.Quit()</strong></td><td>클라이언트를 닫는다.</td></tr><tr><td><strong>ScriptEventPublisher Client.GetTopic(topic)</strong></td><td>서버와 메시지를 주고받기 위해 특정 주제를 등록한다.</td></tr><tr><td><strong>Client.FireEvent(topic, args…)</strong></td><td>서버에게 특정 topic으로 메시지를 전송한다.</td></tr><tr><td><strong>Client.RunLater(callback, t)</strong></td><td>t초 이후에 callback 함수를 실행한다.</td></tr><tr><td><strong>Camera</strong></td><td>카메라를 컨트롤하는 객체</td></tr><tr><td><strong>Point</strong></td><td>x, y 좌표를 담은 클래스</td></tr><tr><td><strong>Rect</strong></td><td>x, y, width, height 사각형을 담은 클래스</td></tr><tr><td><strong>Image</strong></td><td>이미지를 출력하는 클래스</td></tr><tr><td><strong>Text</strong></td><td>글씨를 출력하는 클래스</td></tr><tr><td><strong>Slider</strong></td><td>조절 컨트롤러를 출력하는 클래스</td></tr><tr><td><strong>Button</strong></td><td>버튼을 출력하는 클래스</td></tr><tr><td><strong>Panel</strong></td><td>패널을 출력하는 클래스</td></tr><tr><td><strong>ScrollPanel</strong></td><td>스크롤 되는 패널을 출력하는 클래스</td></tr><tr><td><strong>GridPanel</strong></td><td>Grid로 배열되는 패널을 출력하는 클래스</td></tr></tbody></table>


# 예제

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>인터페이스</td><td><a href="/pages/1DdgpuTeyZtm5DAgluYF">/pages/1DdgpuTeyZtm5DAgluYF</a></td></tr><tr><td>몬스터 AI</td><td><a href="/pages/8oBkvQJqgz1otQ2gmZrH">/pages/8oBkvQJqgz1otQ2gmZrH</a></td></tr><tr><td>펫 AI</td><td><a href="/pages/4GIYWvnnCmr1Wu7bAaGp">/pages/4GIYWvnnCmr1Wu7bAaGp</a></td></tr><tr><td>파티클</td><td><a href="/pages/zUchBpG1sUmOA3hLAgCZ">/pages/zUchBpG1sUmOA3hLAgCZ</a></td></tr></tbody></table>


# 인터페이스 스크립팅

* `Scripts` 폴더 안에 `Client.lua` 파일을 만든 후 아래 내용을 넣습니다.
* 리소스 관리자 Pictures 폴더에 `test.jpg` 이미지 파일을 추가합니다.
* 이미지 띄우기 (X=10, Y=10, 가로=100, 세로=100)

{% code overflow="wrap" lineNumbers="true" %}

```lua
image = Image("Pictures/test.jpg", Rect(10, 10, 100, 100))

-- 이미지 변경
-- ex1
image.image = "Icons/01.png"
--ex2
image.SetImage("Icons/05.png")
```

{% endcode %}

* 버튼 띄우고 클릭 후 메시지 팝업 띄우기 (X=200, Y=200, 가로=100, 세로=100)

{% code overflow="wrap" lineNumbers="true" %}

```lua
button = Button("안늉", Rect(200, 200, 100, 100))
button.onClick.Add(function()
  Client.ShowAlert("방가워")
end)
```

{% endcode %}

* 패널 만들고 패널 안에 텍스트 띄우기

{% code overflow="wrap" lineNumbers="true" %}

```lua
panel = Panel()
panel.rect = Rect(300, 200, 50, 50)
text = Text("야호", Rect(0, 0, 40, 20))
panel.AddChild(text)
```

{% endcode %}

* 버튼 클릭 후 띄운 버튼 삭제하기

{% code overflow="wrap" lineNumbers="true" %}

```lua
button = Button("안늉", Rect(200, 200, 100, 100))
button.onClick.Add(function()
  button.Destroy()
end)
```

{% endcode %}

* 버튼 색깔 바꾸기

{% code overflow="wrap" lineNumbers="true" %}

```lua
button = Button("안늉", Rect(200, 200, 100, 100))
button.color = Color(r, g, b, 투명도)
```

{% endcode %}

* 버튼 띄우고 클릭 후 전체 서버에 메시지 띄우기

{% code overflow="wrap" lineNumbers="true" %}

```lua
button = Button("안늉", Rect(200, 200, 100, 100))
button.onClick.Add(function()
  Client.FireEvent("HELLO", "얘들아! 내 목소리 들리니?")
end)
```

{% endcode %}

* Scripts/Servers 폴더 안에 Server.lua 파일을 만들어 아래 내용을 넣습니다.
* HELLO라는 이벤트가 왔을 때 처리하기

{% code overflow="wrap" lineNumbers="true" %}

```lua
Server.GetTopic("HELLO").Add(function(text)
  Server.SendCenterLabel(text)
end)
```

{% endcode %}

* 기본 UI 스크립트로 조정하기

{% code overflow="wrap" lineNumbers="true" %}

```lua
function DefaultUI()
-- 콘트롤러 설정
controller = Client.controller
-- 배경 이미지 변경
controller.backgroundImage = "Icons/01.png";
-- 볼 이미지 변경
controller.ballImage = "Icons/05.png";
-- 첫 번째 경로 배경 이미지 및 두 번째 경로 볼 이미지 변경
controller.SetControllerImage("Icons/01.png","Icons/05.png");

-- 더 많은 속성값은 ScriptBaseControl 참고 (기본 위칫값은 레이아웃 관리자를 참고해 주세요.)
controller.x = 300 -- 배경 위치 설정
controller.y = -100
controller.width = 100 -- 크기 변경
controller.height = 200

--볼 위치 조정 가능 (더 많은 속성은 ScriptBaseControl를 참고해 주세요.)
controller.ball.x = 100
-- 퀵 슬롯 설정 (예제는 1개만 다루지만 퀵 슬롯은 4개가 존재합니다.) 
slot1 = Client.quickSlots[1]

--이미지 변경 
-- ex1
slot1.slotImage = "Icons/01.png"
-- ex2
slot1.SetSlotImage("Icons/05.png")

-- 더 많은 속성값은 ScriptBaseControl 참고 (기본 위칫값은 레이아웃 관리자를 참고해 주세요.)
slot1.x = -297
slot1.y = -176
slot1.width = 50
slot1.height = 50

-- 스킬 스롯 안의 아이콘의 위치, 크기 등 변경 가능 (더 많은 속성은 ScriptBaseControl를 참고해 주세요.)
slot1.icon.x = -297

-- 교체 슬롯 설정
changeSlot = Client.changeSlot;

-- 교체 슬롯 이미지 변경
-- ex1
changeSlot.slotImage = "Icons/01.png"
-- ex2
changeSlot.SetSlotImage("Icons/05.png")

-- 더 많은 속성값은 ScriptBaseControl 참고 (기본 위칫값은 레이아웃 관리자를 참고해 주세요.)
changeSlot.x = -297
changeSlot.y = -105
changeSlot.width = 70
changeSlot.height = 70

-- 교체 슬롯 안의 아이콘의 위치, 크기 등 변경 가능 (더 많은 속성은 ScriptBaseControl를 참고해 주세요.)
changeSlot.icon.x = -297
end
```

{% endcode %}

* 기본 ScreenUI 조정하기

{% code overflow="wrap" lineNumbers="true" %}

```lua
-- 모든 값을 true or false로 지정하면 스크린에서 값이 사라집니다.
ScreenUI.visible = false;

ScreenUI.hpBarVisible = false
ScreenUI.mpBarVisible = false
ScreenUI.levelVisible = false
ScreenUI.gameMoneyVisible = false
ScreenUI.bagVisible = false
ScreenUI.expBarVisible = false
ScreenUI.chatViewVisible = false
ScreenUI.chatInputVisible = false
ScreenUI.buffPanelVisible = false;
```

{% endcode %}

* 이미지 파일 이름 출력하기

{% code overflow="wrap" lineNumbers="true" %}

```lua
print(Client.GetImageName(Client.GetItem(0).imageID))
```

{% endcode %}


# 몬스터 AI 스크립팅

* **몬스터 AI 스크립트는 프로젝트 폴더/ServerScripts에 위치한** `Hello.lua`와 같은 파일 이름으로 저장되어야 읽힙니다.

<table><thead><tr><th width="211">스크립트</th><th>설명</th></tr></thead><tbody><tr><td><strong>enemy</strong></td><td>몬스터의 ScriptUnit을 나타냅니다.</td></tr><tr><td><strong>ai</strong></td><td>ScriptEnemyUnitAI에서 실행할 AI 행동을 나타냅니다.</td></tr><tr><td><strong>event</strong></td><td>실행될 로직을 확인합니다.</td></tr><tr><td><strong>AI_INIT(-1)</strong></td><td>몬스터 AI 등록 시 최초 실행</td></tr><tr><td><strong>AI_UPDATE(0)</strong></td><td>2초마다 계속 실행</td></tr><tr><td><strong>AI_ATTACKED(1)</strong></td><td>공격 시 한 번 실행</td></tr><tr><td><strong>AI_DEAD(2)</strong></td><td>사망 시 한 번 실행</td></tr><tr><td><strong>data</strong></td><td>공격 시에만 사용 가능하며 (event == 1)일 때 damage, 스킬 ID, 크리티컬 여부(true, false) 정보를 확인할 수 있습니다.</td></tr></tbody></table>

**예제) 서버 스크립트 - 몬스터의 AI 설정**

{% code overflow="wrap" lineNumbers="true" %}

```lua
 Server.SetMonsterAI(
        22, --AI를 적용할 몬스터의 인덱스
        function(enemy,ai,event,data)
        -- 최초 몬스터 AI 등록 시 실행
        if(event == AI_INIT) then
                 ai.customData.test = 1;
        end
        if (event == AI_UPDATE) then
                --현재 필드의 유닛들 중에서 조건에 해당하는 유닛 반환
                --예) 유닛 hp가 100보다 적은 적이 있을 시 가져온다
                --ai.SetTargetUnit(
                --        enemy.field.FindUnit(enemy.x, enemy.y, 200,
                --       function(u)
                --                return u.hp <= 100
                --        end
                --, 0,enemy))
                
                --현재 필드의 유닛들 중에서 가장 작은 조건에 해당하는 유닛 반환
                --예) 플레이어 유닛 중에서 hp가 가장 적은 적을 가져온다
                --ai.SetTargetUnit(
                --        enemy.field.FindMinimumUnit(enemy.x, enemy.y, 200,
                --        function(u)
                --                return u.hp
                --        end
                --, 0,enemy))

                --현재 필드의 유닛들 중에서 가장 큰 조건에 해당하는 유닛 반환
                --예) 플레이어 유닛 중에서 hp가 가장 많은 적을 가져온다
                --ai.SetTargetUnit(
               --        enemy.field.FindMaximumUnit(enemy.x, enemy.y, 200,
                --        function(u)
                --               return u.hp
                --        end
                --, 0,enemy))
                
               --타깃이 정해지지 않았을 경우 가장 가까운 플레이어를 타깃으로 지정
                if( ai.GetTargetUnit() == nil) then
                        ai.SetNearTarget(0,200)
                end
                
                --맵에 플레이어가 하나도 없을 경우 null로 세팅
                if( enemy.field.playerCount <=0) then
                        ai.SetTargetUnit(nil)
                        
                --타깃이었던 플레이어가 맵을 나갈 경우 타깃 다시 지정
                elseif(enemy.field.GetUnit(ai.GetTargetUnitID()) == nil) then
                        ai.SetNearTarget(0,200)
                end
                
                --타깃이 있을 경우 타깃 방향으로 공격
                ai.UseSkill(22);

                --왼쪽 공격
                ai.UseSkill(22,Point(-1,0))

                --오른쪽 공격
                ai.UseSkill(22,Point(1,0))

                --위쪽 공격
                ai.UseSkill(22,Point(0,1))

                --아래쪽 공격
                ai.UseSkill(22,Point(0,-1))

                --해당 위치로 공격
                ai.UseSkillToPosition(24,Point(150,-150))
                
                --타겟이 없을 경우 예외 처리
                if(ai.GetTargetUnit() == nil) then
                        return
                end
                
                --타깃의 hp에 따른 추적 활성화/비활성화
                if(ai.GetTargetUnit().hp <=150) then
                        ai.SetFollowTarget(false)
                else
                        ai.SetFollowTarget(true)
               end
                
        end

       if (event == AI_ATTACKED) then
                enemy.Say('공격당했다. \n대미지: ' .. data.damage 
                .. '\n스킬ID: '..data.skillDataID
                .. '\n크리티컬여부: '..(data.critical and 'true' or 'false'))
                
                --공격한 유닛이 없을 경우 예외 처리
                if(ai.GetAttackedUnit() == nil) then
                        return
               end
                 --공격한 적의 hp를 확인하여 100보다 적을 경우 타깃 변경
                if(ai.GetAttackedUnit().hp <= 100) then
                        ai.SetTargetUnit(ai.GetAttackedUnit()) 
                end

        end

        if (event == AI_DEAD) then
                Server.SendSay('사망')
                --사망 후 특정 위치에서 부활
                enemy.RespawnAt(150,-150)
        end

end)
```

{% endcode %}

**예제) 서버 스크립트 - 몬스터 AI 선공격 몬스터**

{% code overflow="wrap" lineNumbers="true" %}

```
function firstAttack(enemy,ai,event,data)
    if (event == 0) then -- 2초마다 실행되는 이벤트
    
        --맵에 플레이어가 하나도 없을 경우 null로 세팅
        if enemy.field.playerCount <=0 then
            ai.SetTargetUnit(nil)
            
        -- 타깃이 없거나 기존 타깃이던 유닛이 맵을 나갔거나 x 또는 y값 차이의 절댓값이 300을 넘어서면
        -- 타깃을 nil로 초기화하고 200 범위 내에서 타깃을 설정
        elseif (ai.GetTargetUnit()==nil)
               or (enemy.field.GetUnit(ai.GetTargetUnitID())==nil)
               or (math.abs(enemy.x-enemy.field.GetUnit(ai.GetTargetUnitID()).x) >= 300) 
               or (math.abs(enemy.y-enemy.field.GetUnit(ai.GetTargetUnitID()).y) >= 300) then
            
            if ai.GetTargetUnit() ~= nil then
                enemy.say('타깃이 사라졌군...')
            end
            
            ai.SetFollowTarget(false) --타깃이 사라지면 추적 비활성화
            ai.SetTargetUnit(nil)
            ai.SetNearTarget(0,200)

            -- 주변 탐색 후 타깃 발견 시(nil이 아니면), 추적 활성화(true), 메세지 출력
            if ai.GetTargetUnit() ~= nil then 
                ai.SetFollowTarget(true) 
                enemy.say('타깃' 발견! \n추적 시작!')
            end
        end
        
        --타깃 존재 시 타깃을 향해 스킬 10번 발사
        if ai.GetTargetUnit() ~= nil then
            ai.UseSkill(10)
        end
        
        --타깃 부재 시 예외 처리
        if ai.GetTargetUnit() == nil then
            return
        end
        
    end
    
    if (event == 1) then -- 몬스터가 공격을 받을 때마다 실행되는 이벤트
        --공격한 유닛이 없을 경우 예외 처리
        if ai.GetAttackedUnit() == nil then
            return
        else
            --기존 타깃 유닛과 공격 유닛이 같지 않을 경우 공격한 유닛을 타깃으로 지정 또는 변경하고 추적
            if ai.GetTargetUnit() ~= ai.GetAttackedUnit() then 
                ai.SetTargetUnit(ai.GetAttackedUnit())
                ai.SetFollowTarget(true)
                enemy.say('새로운 공격자를 추적한다...')
            end
            
            -- 몬스터 피격 시 10% 확률로 특수 공격 기술을 5번 시전 후 서버 전체에 메시지 출력
            if math.random(0,99) <= 9 then
                ai.UseSkill(5)
                Server.SendCenterLabel('<color=#FF0000>크롸롸!!</color>\n멍청한 보스 배던이 울부짖습니다!')
            end
        end
    end
        
end

Server.SetMonsterAI(1, firstAttack) -- 1번 몬스터에게 firstAttack 적용
```

{% endcode %}


# 펫 AI 스크립팅

* 펫 AI 스크립트는 서버 스크립트와 같이 프로젝트 폴더/ServerScripts에 Hello.lua와 같은 파일 이름으로 존재해야 읽힙니다.

| 스크립트              | 설명                                 |
| ----------------- | ---------------------------------- |
| **pet**           | 해당 펫의 유닛(ScriptUnit)을 나타낸다.        |
| **ai**            | ai가 실행할 행동(ScriptPetUnitAI)을 나타낸다. |
| **event**         | 실행될 로직을 확인한다.                      |
| **AI\_INIT(-1)**  | 최초로 펫 AI 등록 시 실행                   |
| **AI\_UPDATE(0)** | 2초마다 계속 실행                         |

**예제) 서버 스크립트 - 펫 AI 설정**

{% code overflow="wrap" lineNumbers="true" %}

```lua
Server.SetPetAI(
        21, --펫이 될 캐릭터 id
        function(pet,ai,event)

                -- 최초 펫 AI 등록 시 실행
                if(event == AI_INIT) then
                        ai.customData.timer = 1;
                end

                --2초마다 실행
                if(event == AI_UPDATE) then
                        --거리가 200만큼 멀어지면 주인을 따라감 
                        --거리가 400만큼 멀어지면 주인의 위치로 순간이동
                        --ai.SetFollowMaster(true,200,400)

                        --타깃이 없으면 주인을 따라다님
                        if(ai.GetTargetUnit() == nil) then
                                ai.SetFollowMaster(true,200,400)
                        end

                        --기본 100, 200
                        --ai.SetFollowMaster(true)

                        --가장 가까운 적 유닛을 타깃으로 지정
                        ai.SetNearTarget(2,200) 

                        --펫의 타깃 존재 시 스킬 사용
                        --기본적으로 스킬은 타깃을 향해 발사
                        if(ai.GetTargetUnit() ~=nil) then
                                --타깃이 정해지면 따라다니는 것을 멈춤
                                ai.SetFollowMaster(false)
                                ai.StopMove()

                                -- 타깃이 정해지면 타깃을 따라다니면서 공격
                                ai.MoveToPosition(ai.GetTargetUnit().x,ai.GetTargetUnit().y)
                                -- 주인에게 버프 추가
                                ai.AddMasterBuff(15)
                                -- 타깃을 향해 발사
                                ai.UseSkill(23) 
                                -- 펫의 주인 위치에서 타깃을 향해 발사
                                ai.UseSkill(
                                22
                                ,nil
                                ,Point(ai.GetMasterUnit().x,ai.GetMasterUnit().y))
                        end

                        --커스텀 데이터를 이용한 타이머 6초에 한 번씩 주위의 드롭된 아이템 획득                        
                        ai.customData.timer = ai.customData.timer + 1;
                        if(ai.customData.timer == 3) then
                                -- 반경 100의 거리 안에 들어오는 드롭 아이템 획득
                                ai.AcquireNearDropItem(100)
                                ai.customData.timer = 0;
                        end
                end

        end
)
```

{% endcode %}


# 파티클 스크립팅

* Scripts 폴더 안에 Client.lua 파일을 만들어 아래 내용을 넣습니다.

예) 파티클을 이용한 불 오브젝트 생성

{% code overflow="wrap" lineNumbers="true" %}

```lua
function fireParticleUnitID(posx,posy,id)
  local p = ParticleSystem();
  p.AttachToUnitID(Point(posx,posy),id)

  p.shape = 4
  p.sortOrder = 499

  p.material = 0
  p.startLifetime = 1.5
  p.startSpeed = 1
  p.startSize = 25
  p.gravityModifier = -10
  p.angle = 50
  p.radius = 7
  p.shapeRotX = -90
  p.shapeScaleZ = 13.5
  p.scale = 3
  p.sizeOverLifeTime = true
  p.sizeoVerLifeTimePrefab = 2

  -- 파티클 불 설정
  p.colorOverLifeTime = true
  p.SetColorOverLifeTimeColor(0,Color(255,0,0,255))
  p.RemoveColorOverLifeTimeColor(1);
  p.SetColorOverLifeTimeColorAlpha(0,0)
  p.AddColorOverLifeTimeAlpha(0.5,255)

  p.SetMaterialTexture("Pictures/fireEffect.png","Pictures/fireEffect.png")

  local p2 = ParticleSystem();
  p.AddChild(p2)
  p2.visible = true

  p2.shape = 4
  p2.sortOrder = 500

  p2.material = 4
  p2.startLifetime = 1.5
  p2.startSpeed = 1
  p2.startSize = 20
  p2.gravityModifier = -10
  p2.angle = 50
  p2.scale = 3
  p2.radius = 7
  p2.shapeRotX = -90
  p2.shapeScaleZ = 13.5
  
  p2.sizeOverLifeTime = true
  p2.sizeoVerLifeTimePrefab = 2

  -- 파티클 불 설정
  p2.colorOverLifeTime = true
  p2.SetColorOverLifeTimeColor(0,Color(255,255,0,255))
  p2.RemoveColorOverLifeTimeColor(1);
  p2.SetColorOverLifeTimeColorAlpha(0,0)
  p2.AddColorOverLifeTimeAlpha(0.5,255)

  --불 그림 설정
  p2.SetMaterialTexture("Pictures/fireEffect.png","Pictures/fireEffect.png")
end
```

{% endcode %}

> 클라이언트 스크립트에 해당 코드 내용 넣기 → 네코랜드 스튜디오상 자동 시작이나 버튼 입력 이벤트를 만들기 → 스크립트 이벤트 등록하기 → fireParticleUnitID(0,0,event.id) 넣기

위 순서를 거치면 해당 이벤트의 위치에 불 파티클이 생성됩니다.

event.id 대신 unit.id를 넣으면 플레이어 위치에 생성됩니다. 0,0은 생성될 위치입니다.


# 유튜브 튜토리얼


# 펑크랜드 유튜브 강좌

Cha yong 님

\[[기초강좌](https://www.youtube.com/playlist?list=PLeA7uW8bsgEppdndHWcVJ24OYqHxxYXnG)] 동영상 13개

\[[중급강좌](https://www.youtube.com/playlist?list=PLeA7uW8bsgEolhqisQ4ZMjL4ZrHR0oOQn)] 동영상 16개

\[[요청강좌](https://www.youtube.com/playlist?list=PLeA7uW8bsgErxhaG0GWcKnCtF8u_Q5cwD)] 동영상 26개

Cording Bear 님

네코랜드 게임만들기 : <https://youtube.com/playlist?list=PLLxzktboPCPC90lJe8KGiUIyCm-waqtTJ>

네코랜드 스크립팅 : <https://youtube.com/playlist?list=PLLxzktboPCPBlMkXTxv6DaLm41E70A-Yk>

PROG 님

네코랜드 : <https://youtube.com/playlist?list=PLiTHsvg_m920vnNbBKQqBtFi8E70-z6ll>

​

펑다 님

네코랜드 기초강의 : <https://youtube.com/playlist?list=PLJcp6JTw9G_Bicd7K0h_JjLp2XtopENpp>


# Web3 튜토리얼

펑크랜드에서 게임 제작 시 다양한 방법으로 Web3 기능을 이용할 수 있습니다.


# NFT 민팅하기

펑크랜드에서는 쉽고 빠르게 NFT를 민팅할 수 있습니다.

네코랜드 스튜디오 메인 메뉴에서 데이터베이스 아이콘을 클릭하고 \[아이템] 탭을 클릭합니다.

<figure><img src="/files/REXG8F19rJzGw6GejKsp" alt=""><figcaption></figcaption></figure>

팝업창에서 미설정 상태의 아이템을 선택한 후 아이템 정보를 입력합니다.

아이템의 아이콘, 종류, 애니메이션 등을 설정하고 “NFT 거래 가능”이 활성화되어 있는지를 반드시 확인합니다. 설정이 완료되면 \[적용]-\[확인]을 차례대로 누릅니다.

이 과정을 거치면 게임 데이터베이스에 NFT 아이템이 생성되어 플레이어가 해당 아이템을 획득할 때마다 인게임 창고에서 아이템을 NFT 창고로 옮기고 오픈씨로 또 옮길 수 있습니다.

플레이어에게 이 NFT 아이템을 줄 캐릭터를 만들어 볼까요?

<figure><img src="/files/iQXHhez5kX0eZ0A1dqSZ" alt=""><figcaption></figcaption></figure>

먼저, 캐릭터가 나타날 맵으로 갑니다. 메인 메뉴에서 빨간 깃발 모양의 아이콘을 눌러 \[이벤트 레이어]를 선택하세요. 캐릭터가 나타날 타일을 더블클릭하면 이벤트를 설정할 수 있는 \[이벤트 만들기] 팝업창이 나타납니다.

이벤트의 이름을 짓고 캐릭터를 선택하세요. 커맨드 목록에서 비어 있는 슬롯을 더블클릭합니다.

더블클릭 시 이벤트 창이 열립니다. 첫 번째 항목 “대사”를 클릭하면 캐릭터의 대사를 입력할 수 있습니다. 그 다음으로 비어 있는 커맨드 슬롯을 더블클릭한 후 \[페이지 2] 탭으로 이동합니다. 항목 중 “아이템 획득”을 클릭하고 데이터베이스에 추가한 NFT 아이템의 수동을 입력한 후 \[확인] 버튼을 누르세요. 이벤트 만들기 팝업창 하단의 \[적용]-\[확인]을 누릅니다.

이제 플레이어에게 메시지를 전달할 NPC가 생성되어 플레이어의 NFT 창고로 옮길 수 있는 인게임 아이템을 제공할 수 있습니다.

플레이어 시점으로 해당 기능을 확인하려면 이곳을 클릭하세요.

다음 페이지에서는 외부 NFT를 펑크랜드 프로젝트에 연결하는 방법을 알아보겠습니다.

* NFT 전환하기 기능은 국가별 규제 상황등에 따라 제한될 수 있습니다.


# 게임에 외부 NFT 연결하기

펑크랜드 게임에서 민팅되지 않은 NFT를 연결하려면 해당 NFT의 메인넷, 컨트랙트 주소, 토큰 ID를 알아야 합니다.

펑크랜드와 제휴 상태가 아닌 Kazuha NFT를 예시로 들어보겠습니다.

<figure><img src="/files/G7fwT5BJggqTvZ6Bmxru" alt=""><figcaption></figcaption></figure>

먼저, 해당 NFT와 호환되는 데이터베이스에 아이템을 추가합니다. 이 아이템은 NFT가 아닌 기존 NFT가 게임 내에서 표현된 모습이기 때문에 “NFT 거래 가능” 기능을 활성화하지 않도록 주의하세요. 해당 NFT를 나타내기 위해 선택한 아이템은 취향에 따라 원본과 외관 유사 정도를 조정할 수 있습니다.

완료 후 이벤트를 생성합니다.

이벤트에 사용되는 캐릭터의 이름을 “전사”로 설정하고 네코랜드 스튜디오에 포함되어 있는 네코랜드 샘플 RPG 내 주어진 캐릭터의 기본 스프라이트를 사용합니다.

첫 번째 커맨드로 “대사”를 선택한 후 입력합니다. “Kazuha 있나요?”를 예시로 사용하였습니다.

다음 커맨드로는 페이지 2 탭의 “조건 분기” 항목을 선택합니다. 조건 분기 팝업창이 나타나면 “NFT” 탭을 선택한 후 “현재 플레이어가 NFT 보유 중” 항목을 체크합니다.

해당 예시의 NFT 정보는 다음과 같습니다.

> Kazuha NFT
>
> * 메인넷: Ethereum
> * 컨트랙트 주소: 0x842cBC5e2531BFF9860CaCAfcebb0d923F630642
> * 토큰 ID: 503

\[확인] 버튼을 누르면 “조건 분기” 커맨드 하위 커맨드로 추가된 “참일때”가 생성됩니다. “참일때” 하단의 비어 있는 커맨드 슬롯을 더블클릭한 뒤 이벤트 팝업창 \[페이지 2] 탭으로 이동하여 “아이템 획득”을 클릭합니다. “아이템 획득” 창에서 생성한 아이템을 선택합니다.

아이템 정보 설정이 완료되면 NPC와 상호작용 시 NPC가 플레이어에게 특정 NFT를 가지고 있는지 묻고 그에 맞는 아이템을 제공하는 결과가 도출됩니다.

플레이어 시점으로 해당 기능을 확인하려면 이곳을 클릭하세요. 네코랜드 스튜디오의 기본 조작에 대한 설명은 네코랜드 스튜디오 위키에서 확인할 수 있습니다.


# 게임에 ERC-20 토큰 연결하기

펑크랜드 게임에 ERC-20 토큰을 연결하여 여러 혜택과 기능을 추가할 수 있습니다.

[펑크랜드 게임에 외부 NFT 연결하기](https://nekoland.atlassian.net/wiki/spaces/nekoland/pages/1838710787)에서와 같이 ERC-20 토큰을 연결하려면 이벤트를 생성해야 합니다. 이벤트 생성이 완료되면 이벤트 팝업창 \[페이지 2]에서 “조건 분기” 커맨드를 선택한 후 맨 끝에 “ERC-20 Token”이라고 적혀 있는 탭으로 이동합니다.

“현재 플레이어가 ERC-20 보유 중” 항목을 체크합니다. 토큰의 메인넷과 컨트랙트 주소, 최소 웨이 수량을 입력하여 조건을 설정합니다. 수량이 정해지지 않으면 조건이 실행되지 않으니 반드시 수량 정보를 입력하세요.

조건 설정 완료 후 플레이어가 이벤트를 실행하면 해당 토큰이 플레이어가 연동한 월렛에 확인되어 다음으로 참일 때나 거짓일 때 중 어느 커맨드가 실행되는지 결정됩니다.


# Effective Punkland


# 서버와 통신하기

이 장에서는 펑크랜드의 핵심 기능 중 하나인 서버와 메세지로 통신하는 기능에 대해서 알아봅니다.

## FireEvent와 GetTopic의 이해

***

펑크랜드는  FireEvent와  GetTopic 메소드를 이용해 서버와 클라이언트간 통신을 지원합니다. 내부적으로 동작하는 방식은 GetTopic 메소드를 이용해 키와 함수를 등록 해 둔 뒤, 해당 키를 FireEvent로 호출하면 저장되어있던 함수를 호출하는 식으로 작동됩니다.

GetTopic은 특정 주제에 대한 이벤트를 처리하기 위해 사용되는 함수입니다. 이 함수를 사용하여 클라이언트에서 보낸 특정 Topic에 대한 이벤트를 처리할 수 있습니다. 예를 들어, "Apple"이라는 주제로 FireEvent를 발송했을 때, 해당 주제에 대한 이벤트를 처리하는 함수를 등록할 수 있습니다.

```lua
-- 클라이언트에서 "Apple" 이란 주제로 FireEvent를 발송했을 때
-- 모든 클라이언트들에게 "Apple" 이란 메시지 표시하기
Server.GetTopic("Apple").Add(function()
  Server.SendCenterLabel("Apple")
end)

Client.FireEvent("Apple")
```

{% hint style="info" %}
`GetTopic`과 `FireEvent`를 사용하여 특정 주제에 대한 이벤트를 처리하고, 클라이언트에게 메시지를 전송할 수 있습니다. 반대로, 클라이언트에서도 `GetTopic` 메소드를 이용하여 이벤트를 처리할 수도 있습니다.
{% endhint %}

## 직렬화 문제

***

GetTopic과 FireEvent를 사용하여 통신할 때, 고급 개체의 직렬화는 지원되지 않습니다. 이는 Lua 스크립트에서 기본적으로 제공되는 기능이 아니기 때문입니다. 따라서, 고급 개체 혹은 타입을 직렬화하여 통신하는 경우에는 몇 가지 추가적인 처리가 필요합니다.

이를 위해, 펑크랜드에서는 `Utility.JSONParse`, `Utility.JSONSerialize`, 문샤프의 Json 라이브러리인 `json.parse`, `json.serialize`를 제공 하고 있습니다. Utility클래스의 Json메소드들도 내부적으로 문샤프의 Json 변환 라이브러리를 사용하고 있습니다.

### 1. string과  number 타입 처리

Lua스크립트의 string과 number타입은 별도의 추가적인 처리 없이 FireEvent를 이용해 전송할 수 있습니다.

아래는 string과 number타입을 서버로 전송하는 예시입니다.

```lua
Client.FireEvent("PlainData", "Hello", 1, 2, "World")

Server.GetTopic("PlainData").Add(function(...)
  print(...) -- Hello 1 2 World 출력
end)
```

### 2. table 타입 처리

테이블은 Lua에서 다양한 데이터를 저장하고 구조화 하는데 사용되는 유용한 데이터 구조입니다. 예를 들어, 테이블에 여러 개의 값을 저장하고 이를 직렬화 하여 FireEvent를 사용하여 전송할 수 있습니다.

아래는 테이블을 직렬화 하여 통신하는 예시입니다.

```lua
-- 클라이언트에서 테이블을 직렬화하여 FireEvent로 전송하기
local data = {name = "John", age = 25, score = 100}
local serializedData = Utility.JSONSerialize(data) -- 테이블을 직렬화하여 문자열로 변환

Client.FireEvent("TableData", serializedData) -- 직렬화된 데이터를 FireEvent로 전송

-- 서버에서 직렬화된 데이터를 받아 테이블로 변환하여 처리하기
Server.GetTopic("TableData").Add(function(serializedData)
  local data = Utility.JSONParse(serializedData) -- 직렬화된 데이터를 테이블로 변환
  print(data.name) -- "John" 출력
  print(data.age) -- 25 출력
  print(data.score) -- 100 출력
end)
```

위 예시에서는 테이블을 직렬화하여 문자열로 변환한 후, FireEvent로 전송합니다. 서버에서는 받은 직렬화된 데이터를 다시 테이블로 변환하여 처리할 수 있습니다. 이렇게 테이블을 직렬화 하여 통신하는 방법을 사용하면 고급 개체의 직렬화를 우회할 수 있습니다.

{% hint style="warning" %}
이 방법은 테이블과 같은 Lua의 기본 타입에만 적용됩니다. 펑크랜드에서 class형태로 제공하는 userdata타입은 직렬화 하지 못합니다. 만약 테이블 안에 다른 고급 개체가 포함되어 있다면, 해당 개체를 직렬화하고 통신하기 위해서는 개체의 속성을 개별적으로 추출하여 직렬화 해야 할 수 있습니다.
{% endhint %}

### 3. UserData 타입 처리

userdata타입은 속성을 개별적으로 추출하여 직렬화 해야 합니다. 이렇게 추출된 속성들을 테이블로 구성하여 직렬화 하고 통신할 수 있습니다.

```lua
-- 유닛 개체 가져오기
local me = Client.myPlayerUnit() 

-- 유닛 개체에서 필요한 속성을 테이블에 넣기
local serializedData = {
  name = me.name,
  exp = me.exp
}

-- 테이블을 직렬화하여 문자열로 변환
local serializedString = Utility.JSONSerialize(serializedData)

-- 직렬화된 데이터를 FireEvent로 전송
Client.FireEvent("UnitData", serializedString) 

-- 서버에서 직렬화된 데이터를 받아 유닛 개체로 변환하여 처리하기
Server.GetTopic("UnitData").Add(function(serializedString)

  -- 직렬화된 데이터를 테이블로 변환
  local unitData = Utility.JSONParse(serializedString) 
  print(unitData.name)
  print(unitData.exp)
  
  --
  -- 유닛 데이터 처리
  --
end)
```

위 예시에서는 유닛 개체 name, exp 속성을 추출하여 테이블로 구성한 후, 직렬화하여 통신합니다. 서버에서는 받은 직렬화된 데이터를 다시 테이블로 변환한 후, 유닛 개체의 속성에 할당하여 처리할 수 있습니다.

이렇게 테이블을 활용하여 고급 개체의 직렬화와 통신을 구현할 수 있습니다.


# RunLater 주의사항

펑크랜드에서 자주 사용되는 메소드인 RunLater의 주의사항에 대해 알아봅니다.

## RunLater 사용

***

RunLater함수는 실행 순서를 순차적으로 제어하는데 사용 됩니다. 아래는 예시 코드입니다.

```lua
--2초 뒤 Hello, World 출력하기
Client.RunLater(function()
 print("Hello, World") 
end, 2)
```

위와 같이 n초 뒤 첫번째 파라미터로 넘겨진 익명함수를 실행하게 됩니다. 이를 사용하여 특정 시간이 지난 후에 원하는 작업을 수월하게 제어할 수 있습니다.

### 시간 간격 보장 문제

***

RunLater 함수는 시간이 경과한 후에 함수를 실행하기 때문에, 게임의 프레임 속도에 영향을 받지 않습니다. 따라서, 정확한 시간 간격을 보장하지 않습니다. 아래 예시를 살펴보겠습니다.

```lua
-- 1초마다 메시지 출력
local startTime = os.time()

local function printMessage()
    local currentTime = os.time()
    local elapsedTime = currentTime - startTime
    print("경과 시간: " .. elapsedTime .. "초")
end

local function runLaterExample()
    Client.RunLater(function()
        printMessage()
        runLaterExample()
    end, 1)
end

runLaterExample()
```

위의 예제에서는 1초마다 경과 시간을 출력하는 함수를 RunLater를 사용하여 반복적으로 실행하도록 설정하였습니다. 하지만 RunLater 함수는 정확한 시간 간격을 보장 받지 않기 때문에, 실제로는 1초 보다 조금 더 긴 시간이 경과할 수 있습니다.

### 성능 문제

***

RunLater 함수는 게임의 메인 스레드에서 실행되므로, 오래 걸리는 작업을 실행하면 게임의 성능에 영향을 줄 수 있습니다. 만약 RunLater를 이용해 오래 걸리는 작업을 해야 한다면, 별도의 처리가 필요할 수 있습니다.

```lua
-- 5초 후에 오래 걸리는 작업 실행
Client.RunLater(5, function()
    -- 오래 걸리는 작업
    for i = 1, 1000000000 do
        -- 작업 수행
    end
end)
```

위의 예제에서는 5초 후에 오래 걸리는 작업을 실행하도록 설정하였습니다. 이 작업은 매우 오래 걸리는 작업이므로, 게임의 성능에 부정적인 영향을 줄 수 있습니다.&#x20;

아래 예제에서는 그 중, 오래 걸리는 작업을 여러 단계로 나누어 처리하고, 각 단계마다 짧은 시간 동안 작업을 수행한 후 다음 단계로 넘어가는 예제를 확인해 보겠습니다.

```lua
local totalIterations = 1000000000
local iterationsPerFrame = 1000000
local currentIteration = 0

local function performWork()
    for i = 1, iterationsPerFrame do
        -- 작업 수행
        currentIteration = currentIteration + 1
        if currentIteration >= totalIterations then
            -- 작업 완료
            print("작업이 완료되었습니다.")
            return
        end
    end

    -- 다음 프레임에 작업 계속 수행
    Client.RunLater(performWork, 0)
end

-- 첫 번째 프레임에서 작업 시작
performWork()
```

{% hint style="info" %}
Lua스크립트는 별도로 다중 스레드 기능을 제공하지 않음으로, 다른 방법을 사용하여 오래 걸리는 작업을 처리할 수 있습니다.&#x20;
{% endhint %}

위의 예제에서는 오래 걸리는 작업을 100만 번씩 나누어 처리하도록 설정하였습니다. 각 프레임마다 100만 번의 작업을 수행하고, 작업이 완료되지 않았다면 다음 프레임에 작업을 계속 수행하도록 설정합니다.

### 유효성 보장 문제

***

n초 뒤에 실행되는 RunLater는 대기 이후 동작의 유효성을 보장할 수 없습니다. 예를 들어, 내가 접근하려는 개체가 n초 뒤에는 파괴되었을 수 있기 때문입니다.

```lua
local text = Text()
Client.RunLater(function()
    text.text = "Hello, World"
end, 2)

text = nil
print(text.text)
```

위 예제는 2초 뒤에 Text 개체의 속성에 접근합니다. 하지만, 2초 사이에 Text 개체가 파괴되었다면 에러가 날 수 있습니다. 따라서, RunLater 안에서 개체에 접근하려면 유효성 검사를 해주는 것이 좋습니다.

```lua
local text = Text()
Client.RunLater(function()
    if text ~= nil then
        text.text = "Hello, World"
    end
end, 2)
```

위와 같이 객체가 파괴된 후에도 RunLater 함수가 실행되는 경우를 대비하여 유효성 검사를 해주는 것이 좋습니다. 이러한 방법을 사용하여 객체가 파괴되는 경우에도 유효성을 보장할 수 있습니다.


# HTTP 요청 보내기

Lua 스크립트를 이용해 아래와 같이 Http 요청을 보낼 수 있습니다.

## GET 요청 보내기

Server.HttpGet(url, callback)

예제)

{% code overflow="wrap" lineNumbers="true" %}

```lua
-- http://naver.com URL로 GET 요청 보내고, res로 데이터 받기
Server.HttpGet('http://naver.com', function(res)
  print(res) -- 웹페이지가 반환한 결과 텍스트가 출력됩니다.
end)
```

{% endcode %}

## POST 요청 보내기

Server.HttpPost(url, data, callback)\
\
예제)

{% code overflow="wrap" lineNumbers="true" %}

```lua
-- t 라는 테이블을 만들고, 보낼 POST 요청 데이터 넣기
t = {}
t.id = 1234
t.name = "Hello"

-- http://naver.com URL로 요청 보내고, res로 데이터 받기
Server.HttpGet('http://naver.com', t, function(res)
  print(res) -- 웹페이지가 반환한 결과 텍스트가 출력됩니다.
end)
```

{% endcode %}

## 웹 서버에서 데이터 받기

POST로 요청을 받을 경우, 아래와 같이 데이터를 출력할 수 있습니다.

이 데이터를 MySQL과 같은 데이터베이스에 넣어, 영구보관할 수 있습니다.

{% code overflow="wrap" lineNumbers="true" %}

```lua
<?php
echo $_POST["id"];
echo $_POST["name"];

echo "잘 받았습니다!";
?>
```

{% endcode %}

`Server.HttpGet` 에서 보낸 데이터가 웹 서버에 잘 도착하였는지를 확인하기 위한 코드입니다.

위 서버 스크립트 예재의 `print(res)` 에 의해 “1234Hello잘 받았습니다!” 가 출력됩니다.


# 개발자 가이드라인


# 정산정보 등록 및 변경

펑크랜드 게임의 수익화를 위해서는 개발자 정산정보를 등록해야 합니다.

신청 페이지 :[ 펑크랜드 공식 홈페이지](https://punkland.io/) > 마이페이지 > 계정설정 > 정산정보 등록

## **1인 개발자로 수익화가 가능한가요?**&#x20;

네. 가능합니다. 1인 개발자로 정산정보를 등록하기 위해서는 아래의 서류가 필요합니다.

* 본인은행 계좌 사본
* 본인신분증 사본

만 14세 이상 미성년자는 추가로 [법정대리인 동의서 2종](/punkland/punkland-studio/developerguide/undefined/undefined)이 필요합니다.

## **개인/법인사업자로 수익화가 가능한가요?**&#x20;

네. 가능합니다. 사업자로 정산정보를 등록하기 위해서는 아래의 서류가 필요합니다.

* 사업자등록증 사본
* 법인 명의 은행 계좌 사본
* 대표 신분증 사본

## **1인 개발자로 운영하다가 개인/법인사업자로 전환하려고 합니다. 가능한가요?**&#x20;

네. 가능합니다. 하지만 1인 개발자에서 개인/법인사업자로 변경했다가 다시 1인 개발자로 되돌릴 수는 없습니다. 때문에 개인/법인사업자로 전환하기 전에 신중하게 검토해주세요.

1인 개발자에서 개인/법인사업자로 전환할때는정산 정보 신청 관리 메뉴 에서 사업자 형태를 개인 또는 법인사업자로 변경해주시면 됩니다.&#x20;

## **개인/법인사업자로 신청해서 정산받으려면 어떻게 해야 하나요?**

제출하신 서류가 확인되면, 매월 10일 전까지 세금계산서를 발행해 주셔야 합니다.

## **개인/법인사업자로 전환한 후에는 세금계산서를 발행해야하나요?**&#x20;

네 그렇습니다. 펑크랜드를 통해 이체받으실 수익만큼 슈퍼캣을 상대로 세금계산서를 발행해 주셔야 정산이 가능합니다. 단, 사업자로 신청을 한 경우 한합니다.

## **세금계산서는 어디서 어떻게 발행하나요?**&#x20;

[국세청 홈텍스](https://www.hometax.go.kr/) 에서 세금계산서를 발행하면 됩니다. 세금계산서는 익월 10일 안으로 발행해야 합니다. 세금계산서 발행하는 방법은 아래 pdf 파일을 참고하세요.

{% file src="/files/tZBG1qFph3paqfOZLlA9" %}

## **세금계산서를 발행하지 않으면 어떻게 되나요?**&#x20;

세금계산서를 발행하지 않을 경우, 지연 발행가산세를 부담하게 됩니다. 자세한 내역은 국세청([www.nts.go.kr](http://www.nts.go.kr/)) 혹은 세무서에 문의해 주셔야 정확한 답변을 받으실 수 있습니다.

## **개인/법인사업자로 변경하면 정산지급액이 줄어들거나 늘어나나요?**&#x20;

법인사업자로 변경할 경우, 정산 지급액에서 부가세액(10%)만큼 추가하여 지급받습니다. 기존 정산총액은 사업소득세를 공제한 금액이기 때문에 사업소득세를 공제하지 않은 금액에 부가세 10% 가 합산됩니다.

## **정산일자는 언제인가요?**&#x20;

전월 1일부터 \~ 전월 말일까지 매출 분을 익월 10일에 입금하고 있습니다.

## **정산정보 신청은 어디에서 하나요?**&#x20;

신청 페이지 :[ 펑크랜드 공식 홈페이지](https://punkland.io/) > 마이페이지 > 계정설정 > 정산정보 등록


# 미성년자 법정대리인 동의서

만 14세 이상 미성년자의 개발자 등록을 위해서는 법정대리인 동의서가 필요합니다.

## **동의서 양식 작성하는 방법**

1. 사본 문서를 인쇄하여 스캔하는 방법 : 문서를 프린터로 인쇄한 후, 정보를 기입하고 서명한 후 스캔하여 파일로 저장
2. 사본 문서 내 서명 파일을 삽입하는 방법 : 문서 내 필요 정보를 기입하고, 서명란에 서명한 이미지 파일을 삽입하여 문서를 저장

## **동의서 양식 제출하는 방법**

1. 우측 동의서 2종을 다운로드 합니다. **(**[**법정대리인 동의서**](https://nekoland.net/_assets/docs/%EB%B2%95%EC%A0%95%EB%8C%80%EB%A6%AC%EC%9D%B8_%EB%8F%99%EC%9D%98%EC%84%9C_%ED%8E%91%ED%81%AC%EB%9E%9C%EB%93%9C.docx)**) (**[**법정대리인 개인정보 수집 동의서**](https://nekoland.net/_assets/docs/%EB%B2%95%EC%A0%95%EB%8C%80%EB%A6%AC%EC%9D%B8_%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4_%EC%88%98%EC%A7%91_%EB%B0%8F_%EC%9D%B4%EC%9A%A9_%EB%8F%99%EC%9D%98%EC%84%9C_%ED%8E%91%ED%81%AC%EB%9E%9C%EB%93%9C.docx)**)**
2. 동의서 내용을 모두 작성한 후, 신분증 및 은행계좌 사본과 함께 신청합니다.
3. 신청 페이지 :[ 펑크랜드 공식 홈페이지](https://punkland.io/) > 마이페이지 > 계정설정 > 정산정보 등록


# 매출 및 수익금 정산 가이드라인

## **펑크랜드 수익 정산**

펑크랜드에서 발생한 수익큐브는 등록된 개발자 정산정보를 통해 입금받을 수 있습니다.

제작한게임에서 발생한 수익큐브는 1큐브당 4원, 리소스마켓에서 발생한 수익큐브는 1큐브당 7원을 지급하고 있습니다.

펑크랜드에서 발생하는 수익은 아래와 같이 사용되고 있습니다.

<figure><img src="/files/wJ9zFk5oOpHFhz69Hy0R" alt=""><figcaption></figcaption></figure>

### **개발자 정산 (47%)**

펑크랜드 개발자의 수익큐브 정산 수익을 의미합니다. 펑크랜드 플랫폼에서 발생하는 프로모션성 큐브의 경우에도 동일한 금액으로 정산하고 있으며 리소스마켓 수익의 경우70%, 광고수익의 경우 100%를 개발자에게 지급하며 최고 수준의 정산비율을 지키고 있습니다.

### **앱스토어 및 결제수수료 (21%)**

펑크랜드는 결제 시스템을 관리하며 각 개발자를 대신해서 앱스토어(Google, Apple)와 PG 수수료를 납부하고 있습니다.&#x20;

### **플랫폼 호스팅 및 지원 (17%)**

온라인 게임 서비스를 위한 서버와 DB 유지 관리와 호스팅비용에 사용됩니다. 개발자는 서버, 호스팅 등을 신경쓰지 않고 게임 제작에만 집중할 수 있습니다.

### **마케팅 및 고객지원 (5%)**

펑크랜드 플랫폼과 각 게임들의 마케팅 비용을 분담하고 있으며, 유저 문의대응과 각종 법률 문제 등 개발자지원에 사용되는 비용입니다.

### **펑크랜드팀 (10%)**

수익의 일부로 지속적인 서비스 및 운영 비용을 충당하는 데 사용합니다.

## **준수 사항**

* 이용 약관에 명시된 수익 관련 조항을 반드시 준수 하셔야 합니다. 이용약관을 위반하고 서비스하여 분쟁이 발생할 경우 게임이 강제로 내려갈 수 있는 점 유의바랍니다.
  * (필수)확률 표기
    * 확률형 아이템에서 얻을 수 있는 아이템들을 백분률로 표기해야 하며, 상품 설명에 표기 하거나, 확률을 볼 수 있는 링크를 해당 상점 NPC 정보에 반드시 명시해두어야 합니다.
    * 확률 표기 예시

#### 확률형 아이템 A

| 등급 | 이름       | 확률   |
| -- | -------- | ---- |
| 전설 | 전설 아이템   | 0.2% |
| 고급 | 고급 아이템 A | 1.9% |
| 고급 | 고급 아이템 B | 1.9% |
| 희귀 | 희귀 아이템 A | 20%  |
| 희귀 | 희귀 아이템 B | 20%  |
| 희귀 | 희귀 아이템 C | 20%  |
| 일반 | 일반 아이템   | 36%  |
| 합  |          | 100% |

* 예시 : 무분별한 가챠 시스템, 저작권 위반 등의 경우 법적 조치가 취해질 수 있음.
* 참고 : 이용약관 : <https://supercat.co.kr/ko/terms-of-service.html>

## **수익금 정산 기본 정보**

* 펑크랜드 앱 내 명시된 금액 기준에 따라 내 게임의 매출액이 정산됩니다.
  * 입금 금액 = 총 수익금 - 10% 부가세 - (환불금액 + 3.3% 사업소득세)
    * 내 게임에서 큐브가 환불되었을 경우, 해당 큐브만큼 차감되어 정산(이체)되는 점 참고 바랍니다.
    * 개발자 계좌에 실제로 입금되는 금액은 총 수익금에서 환불금액과 3.3% 사업소득세가 제외된 금액입니다.
    * 수수료는 변동될 수 있습니다.
  * 수익금 정산날짜 : 매달10일(10일이 공휴일 또는 주말인 경우에는 돌아오는 가장 빠른 영업일에 지급)
  * 계정 : 등록된 은행 / 계좌 번호로 지급됩니다.
    * 개발진이 1인 이상의 팀으로 구성된 경우 등록된 계정 정보 1곳으로만 정산 절차가 진행되니, 참고 바랍니다.
    * 개발진 1인(or사업자)에 여러 아이디/게임을 소유하고 있을 때에도 대표로 등록된 계정 정보 1곳으로만 정산 절차가 진행됩니다.
  * 수익금 정산 구분
    * 1인 개발자 : 등록 신청한 정산 계좌로 이체 처리 (사업소득세 공제 후)
    * 개인/법인 사업자 : 등록 신청한 정산 계좌로 이체 처리 (부가세 포함)
    * 해외거주자/외국인 : 시티은행 or 페이팔 계좌로 이체 처리 (시티은행/페이팔만 가능)
    * 해외에 있는 개발자가 비거주자(국내 거소가 없거나 국내183일 이하거주)인 경우 22%원천징수하고, 아닌 경우 3.3% 징수 후 이체합니다 (필요할 경우 증빙을 요청할 수도 있음)
    * 비거주자인 경우 정산 전에 슈퍼캣에 통보해 주셔야 하며, 상세 내용은 아래 세무사님 연락처로 문의해 주세요.
  * 통화
    * 기본적으로 KRW 으로 정산됩니다.
* 계정정보를 입력하지 않았을 경우, 해당 월의 수익금을 정산받을 수 없습니다.&#x20;
* 정산 시 세금 관련 정보
  * 연간 수천만원 이상 매출 발생하면, 다음 해 5월에 많은 금액의 종합소득세가 발생할 수 있습니다.\
    정산받은 계좌의 명의자 앞으로 소득 신고를 진행하며, 개발자와 계좌 명의자가 다를 경우에도 소득 신고의 변경은 불가합니다 (처음 정산 정보 등록 시, 반드시 소득 신고를 할 계좌로 신청해 주세요)
  * 소득금액 확인을 위한 문의의 경우, 저희 펑크랜드 팀에서 성실히 답변 드리고 있으니 언제든지 말씀주시기 바랍니다.(e-mail : <account@supercat.co.kr>)
  * 개발자분들의 절세관련 아래와 같이 간단하게 설명을 드리오니 참고하시어 종합소득세 신고시 활용부탁 드립니다.

## 1. 종합소득 계산

종합소득 = 발생 매출(귀속연도 소득) – 필요경비

* 매출의 경우, 이미 원천세or부가세 신고가 되었기 때문에 개발자분께서 직접적으로 수정할 내용이 많지 않습니다. 다만 필요경비(게임을 제작, 운영하는데 소요된 비용)의 경우, 개발자님들 스스로 관련 증빙을 확보해야 하므로 해당 적격증빙(영수증등)을 갖추어 신고하는 것이 가장 중요합니다.

## 2. 과세표준 산출

과세표준 = 종합소득금액 – 소득공제

* 종합소득세는 1년동안 벌어들인 소득을 기준으로 과세하기 때문에 많은 소득공제 제도가 존재합니다. 따라서, 관련 소득공제 항목들을 홈택스(국세청)에서 꼼꼼히 살피시어 추가 공제 받으시기 바랍니다. Ex) 기부금, 경조비, 금융자산 및 비용, 미수채권등

## 3. 산출세액 계산

산출세액 = 과세표준 X 세율

* 과세표준은 개발자님의 종합소득 구간에 따라 적용됩니다. 따라서 세액 산출 후 개발자님의 납부세액을 확인하시기 바랍니다.

<table><thead><tr><th width="308.3333333333333">과세표준</th><th width="210">적용세율</th><th>누진공제</th></tr></thead><tbody><tr><td>1천 2백만원 이하</td><td>6%</td><td>없음</td></tr><tr><td>1천 2백만원 초과 4천 6백만원 이하</td><td>15%</td><td>108만원</td></tr><tr><td>4천 6백만원 초과 8천 8백만원 이하</td><td>24%</td><td>522만원</td></tr><tr><td>8천 8백만원 초과 1억 5천만원 이하</td><td>35%</td><td>1,490만원</td></tr><tr><td>1억 5천만원 초과 3억원 이하</td><td>38%</td><td>1,940만원</td></tr><tr><td>3억원 초과 5억원 이하</td><td>40%</td><td>2,540만원</td></tr><tr><td>5억원 초과</td><td>42%</td><td>3,540 만원</td></tr></tbody></table>

※   종합소득세 신고의 경우, 관련법상 전적으로 개발자분 본인 책임하에 신고/납부의무가 있으므로 당사에서 대행하여 진행할 수 없는 점 양해부탁드립니다.


# 유료 아이템 판매 관련 안내

게임 내 판매되는 유료 아이템에 관해 안내해드립니다.

모든 확률성 유료 아이템에는 확률이 표시되어야 합니다.

확률성 유료 아이템은 게임내 아이템 정보에 표시를 해주시는 방법을 가장 추천 드리며 아이템 정보에 불가피하게 추가 하지 못하는 경우, 관련 커뮤니티에 모든 유저가 볼 수 있도록 확률을 명시해주셔야 합니다.

또한 게임의 유료 아이템, 또는 유료 아이템과 연관된 아이템의 경우 가치 변동에 주의를 해주셔야 합니다.

만약 불가피하게 변동이 될 경우 최소 1주일 전 회원에게 사전 고지를 해주셔야 하며 서비스 이용 약관 제23조 4항에 의거 회원이 청약철회를 원한다면 청약철회를 할 수 있습니다.

{% hint style="info" %}
서비스 이용 약관 제23조 4항

회원은 제1항 및 제2항에도 불구하고 구매한 유료 콘텐츠의 내용이 표시․광고의 내용과 다르거나 구매계약의 내용과 다르게 이행된 경우에 해당 콘텐츠가 이용 가능하게 된 날부터 3개월 이내, 그 사실을 안 날 또는 알 수 있었던 날부터 30일 이내에 청약철회를 할 수 있습니다.

게임의 유료 아이템, 또는 유료 아이템과 연관 된 아이템이 회원에게 사전 고지 없이 변경 되는 경우 수익화 정지 또는 개발자 이용 약관 '제12조 1항 8호(게임이 회사 이미지를 손상시키거나 손상시킬 가능성이 있거나 서비스에 손해를 야기할 수 있다고 판단 될 경우)에 의거 게임 운영을 사전 통보 없이 중단 될 수 있음을 알려드립니다.
{% endhint %}


# 뒷거래 부정행위 관련 안내

개발자와 회원이 공모하여 회사가 정한 방법 이외의 방법으로 부정행위를 한 것이 적발되었습니다.

이용자가 개발자 계좌로 원 가격보다 할인된 금액을 이체하면 개발자가 이용자에게 아이템을 챙겨주는 뒷거래 담합 부정행위였습니다.

{% hint style="info" %}
서비스 이용약관

제3장 이용계약 당사자의 의무

제10조 (회원의 의무)

① 회원은 회사에서 제공하는 서비스의 이용과 관련하여 다음 각 호에 해당하는 행위를 해서는 안 됩니다.

1.회사가 제공하지 않는 서비스나 비정상적인 방법을 통해 사이버 자산(ID, 캐릭터, 아이템, 게임 머니 등)을 매매 또는 증여하거나, 이를 취득하여 이용하는 행위

2.회사의 서비스를 이용하여 얻은 정보를 무단으로 복제․유통․조장하거나 상업적으로 이용하는 행위, 알려지거나 알려지지 않은 버그를 악용하여 서비스를 이용하는 행위

3.타인을 기망하여 이득을 취하는 행위, 회사의 서비스의 이용과 관련하여 타인에게 피해를 입히는 행위

13.회사의서비스 정신 또는 서비스 의도에 반하는 것으로 슈퍼캣이 간주하는 행위 또는 회사의 지원 서비스를 부적절하게 이용하는 행위

23\. 회원이 본 약관을 준수하지 않거나 또는 서비스를 불법으로 또는 부적절하게 이용하거나, 또는 회사가 회원의 약관 미준수, 위법하거나 부적절한 이용행위를 의심할만한 사정이 있는 경우(이하 “이용자 의무위반 행위”라 합니다.)

24\. 그 밖에 관련 법령에 위반되거나 선량한 풍속 기타 사회통념에 반하는 행위
{% endhint %}

{% hint style="info" %}
개발자 이용약관

제 7 조 (회원의 의무)

① 회원은 관계법령, 본 약관의 규정, 이용안내 및 주의사항 등 회사가 통지하는 사항을 준수하여야 하며, 기타 회사의 업무에 방해되는 행위를 하여서는 안됩니다.

④ 회원은 서비스 이용과 관련하여 다음 각 호의 행위를 하여서는 아니되며, 다음 각 호의 어느 하나에 해당하는 행위를 하는 경우 회사는 해당 회원의 서비스 이용을 중지하거나 이용계약을 해지할 수 있습니다.

1.범죄행위를 목적으로 하거나 기타 범죄행위와 관련된 행위

2.회사가 정한 방법 이외의 다른 방법을 사용하여 서비스에 접근하는 행위

3.기타 서비스의 안정적인 운영에 지장을 주거나 줄 우려가 있는 일체의 행위
{% endhint %}

위 약관을 위반하였기에 해당 개발자는 계정 영구정지, 수익화된 큐브 몰수 및 수익화 정지된 상태입니다. 더불어 앞으로 펑크랜드에서 동일한 개인정보로는 활동을 못하게 조치할 것이며, 타인의 이름을 도용해서 개발하는 것이 적발될 경우에도 상응한 조치를 취할 예정입니다. 더불어 공모한 이용자 역시 상응하는 패널티를 받게 됩니다.

앞으로도 이러한 부정행위를 시도하거나 제안하는 개발자 및 이용자가 있을 경우, 펑크랜드 팀 앞으로 신고해주시길 바랍니다.

펑크랜드 팀 드림


# 마케팅 가이드라인

## **게임 출시 정보**

### 게임 출시

* 사용자는 게임 이미지와 설명, 순위, 평가 리뷰 등을 보고 게임을 시작할지 여부를 결정합니다. 본인 게임을 잘 나타내줄 수 있는 게임 아이콘과 설명을 써서 게임의 특징, 장점을 최대한 잘 보여주는 것이 중요합니다.
* 이메일 주소, 핸드폰 번호, 계좌 정보 등을 통해 본인 인증이 완료되어야 수익 창출이 가능한 게임을 출시할 수 있습니다.

### 게임 이름

* 너무 길지 않아야 합니다.
* 발음하기 쉽고 기억하기 쉬운 이름이 좋습니다.
* 게임 제목에 욕설이 포함 되어 있거나 보는 이로 하여금 불쾌감을 느끼게 하는 이름인 경우 사전 통보 없이 게임이 내려갈 수 있습니다.

### 게임 정보

* 펑크랜드는 모든 연령층이 이용하는 앱입니다. 닉네임, 커뮤니티, 채팅, 게임 제목, 게임 정보에 모든 연령대에 적합하지 않은 표현(비속어, 성적인 표현 등)은 사용하지 않습니다.

### 게임 아이콘 및 이미지

* 성적인 콘텐츠가 포함된 이미지나 동영상을 사용하지 않습니다. (등록 시 제재조치가 취해질 수 있습니다.)
  * 그림이나 사진에 가슴, 엉덩이, 성기, 기타 패티시의 대상이 되는 신체 일부나 콘텐츠가 포함된 외설적인 이미지를 사용하지 않습니다.
* 설명 문구
  * (필수) 아래 내용은 반드시 포함해야 합니다.
    * 게임을 설명할 주요 키워드 포함 ex. RPG, 아케이드, 전직, 육성 등
  * (선택) 아래 내용을 포함하면 최근까지 관리된 게임임을 보여줄 수 있습니다.
    * 가장 최근 업데이트 날짜
    * 이벤트 공지 등 운영 관련 공지
    * 게임 동영상 링크 추가
      * 어떤 게임인지 미리, 정확하게 보여줄 수 있습니다.
      * Mobizen 등의 프로그램으로 촬영 추천

### **신규 유저 확보**&#x20;

> #### \[추천] 인플루언서 마케팅
>
> * 적절한 인플루언서 마케팅을 활용하여, 아직 내 게임을 플레이 하지 않은 유저들에게 내 게임을 소개할 수 있습니다.

> #### 추천 채널
>
> * 인플루언서에 따라 Youtube / Twitch / Youtube + Twitch 등 적합한 유형을 선택합니다.

> #### Youtube
>
> * \[참고] 유튜브에 영상을 올리실 때, 제목 혹은 내용에 “#펑크랜드” 를 포함하여 올리면 펑크랜드 앱 내 “동영상” 탭에 해당 영상이 노출됩니다.
> * 해당 영상이 웹, 앱 내 다수에게 노출되기 때문에 유튜브에서 본 친구들은 내 게임을 하러 오기 편하고, 펑크랜드 내에서 영상을 접하는 유저들은 유명 BJ 영상을 보고 관심을 갖게 됩니다

> #### Twitch
>
> * 마케팅 유형 : 아래 3가지가 기본적인 영상 마케팅 유형이나, 인플루언서에 따라 다른 유형도 있을 수 있습니다.
> * 실시간 스트리밍
> * 녹화 영상 업로드
> * 스트리밍 + 이후 녹화 영상 업로드

> #### 진행 예시
>
> * 썩소 TV - 리얼 알피지 (약 16만 조회수 / 좋아요 약 1,000개)
> * 김왼팔 - 세인츠 오브 히어로즈 (약 16만 조회수 / 좋아요 약 2,400개)

> #### \[유료] 구글 애드워즈
>
> * web + app 두 환경 모두 내 게임 광고를 노출 시킬 수 있습니다.

### 광고 종류

> #### 검색 광고 : PC, 태블릿, 스마트폰에서 google 창에 입력한 단어가 내가 선정한 단어와 일치하면 검색 결과에서 상단에 내 게임 광고가 노출됩니다. 클릭을 통해 내 게임을 홍보할 수 있습니다.
>
> * 키워드 미리 선정, 예산 선충전 필요
> * 구체적인 트래킹이 가능하지만 높은 단가

> #### 디스플레이 광고 : PC, 태블릿, 스마트폰에서 google 을 이용하는 유저들에게 내 게임 광고 배너를 노출시킵니다.
>
> * 이미지를 별도로 미리 제작, 예산 선충전 필요
> * 구체적인 트래킹이 가능하지만 높은 단가

> #### 동영상 광고 : Youtube 에 내 게임 영상을 올리고 해당 영상 URL 로 광고를 진행할 수 있습니다.
>
> * 영상 제작 필요
> * 진성 유저 타켓이 가능하지만 높은 단가

> #### 앱 광고
>
> * 광고문구, 이미지, 영상 모두를 활용하여 모바일 디바이스에서만 게임 광고를 진행할 수 있습니다.
> * 에드워즈 광고 중 앱 광고로써는 가장 적합하고 진행하기 쉬운 광고입니다.

#### \[무료] 바이럴 마케팅 - 커뮤니티 홍보

> #### Facebook
>
> * 게임과 관련있는 페이스북 그룹들에 포스팅을 업로드해서 홍보. 일부 ‘광고 금지’ 조항이 있어, 삭제될 수 있으니 자세히 알아보고 진행합니다.
> * 페이지
> * 그룹

> #### 유사채널 : Facebook 과 유사한 기능의 SNS 로써 바이럴 마케팅할 수 있습니다.
>
> * 트위터
> * 인스타그램

> #### Youtube
>
> * 유튜브에 영상을 올리실 때, 제목 혹은 내용에 “#펑크랜드” 를 포함하여 올리면 펑크랜드 앱 내 “동영상” 탭에 해당 영상이 노출됩니다.
> * 해당 영상이 웹, 앱 내 다수에게 노출되기 때문에 유튜브에서 본 친구들은 내 게임을 하러 오기 편하고, 펑크랜드 내에서 영상을 접하는 유저들은 내 게임이 어떤 게임인지 알 수 있어 양측에 도움이 됩니다.

> #### 블로그 리뷰
>
> * 유명 블로거들이 추천게임, 게임리뷰등을 올려주는 것도 도움이 됩니다.

> #### 커뮤니티 (네이버 카페, 헝그리 앱 등)
>
> * 게임 관련 카페들에게서 추천게임/게임 리뷰등이 올라오는 것도 마케팅에 도움이 됩니다.

> #### 펑크랜드 커뮤니티
>
> * 펑크랜드 커뮤니티에 내 게임 출시 및 업데이트를 홍보하여 기존 유저 재방문을 유도하거나 신규 유저를 끌어올 수 있습니다.

## **참고 사항**

* UTM 활용 : 채널/커뮤니티 등 마케팅 활동 시 개별 UTM을 만들어 URL 을 뿌리면 어떤 채널에서 가장 효과적으로 유입이 되었는 지 확인할 수 있습니다.
* UTM 이란? <http://blog.ab180.co/utm-code-olbareuge-sayonghagi/>
* UTM 제작 링크 : <https://ga-dev-tools.appspot.com/campaign-url-builder/>


# 게임 운영 가이드라인

## **내 게임 운영 관련**

* 내가 출시한 게임의 자세한 정보는 게임 관리자 페이지에서 확인할 수 있습니다.
  * 참고 공지 : <https://cafe.naver.com/nekolandgames/7692>
* 유저와의 소통 : 펑크랜드 앱 내 에서 내 게임에 달리는 리뷰와 기타 피드백들을 확인하면 빠르게 소통하고 업데이트 반응을 확인할 수 있습니다.
* 펑크랜드 이용약관을 준수하지 않는 문의 내용 혹은 약관에 어긋나는 운영 이슈 발생 시 펑크랜드가 100% 책임지지는 않습니다. 상황에 따라 원활한 운영을 위해 중재할 권리는 있습니다.
  * 예시 : 약관에 어긋나는 운영으로 인한 환불 요청 등
* 관리자 툴 : <http://nekoland.net/me>

<table><thead><tr><th width="130.33333333333331">구분</th><th width="183">메뉴명</th><th>내용</th></tr></thead><tbody><tr><td>계정 관련</td><td>내 게임들</td><td>내가 만든 게임 목록</td></tr><tr><td></td><td>공동작업 게임들</td><td>공동작업에 참여한 게임 목록</td></tr><tr><td><br>정산 관련</td><td>정산 정보</td><td>정산 전의 누적 큐브 확인 및 정산 정보 등록</td></tr><tr><td></td><td>수익 이력</td><td>기간별 매출 확인 및 환급 내역</td></tr><tr><td>게임 관련</td><td>홈</td><td>본인이 출시한 게임의 통계 자료 확인</td></tr><tr><td></td><td>플레이어</td><td>내게임을 플레이한 유저 조회</td></tr><tr><td></td><td>거래 로그</td><td>유저간 거래 내역</td></tr><tr><td></td><td>GM명령어 로그</td><td>게임내 GM 명령어 사용 이력</td></tr><tr><td></td><td>차단</td><td>유저 차단 관리</td></tr><tr><td></td><td>광고</td><td>내 게임에서 재생된 광고 관련 통계자료 확인</td></tr><tr><td></td><td>구매 목록</td><td>큐브아이템 판매 내역 (환불 내역 포함)</td></tr><tr><td></td><td>쿠폰</td><td>내 게임내 쿠폰 관리 페이지</td></tr><tr><td></td><td>우편</td><td>우편함 관리</td></tr></tbody></table>

* 관리자 툴에서 본인이 출시한 게임의 DAU 와 리텐션을 확인할 수 있습니다.
* 관리자 툴에서 ID 검색시 검색 확장하는 법 :
  * `홍길동` `홍 길동` `홍길 동` 과 같은 비슷하지만 서로 다른 닉네임의 유저들이 존재할때 `_` 와 `%` 를 와일드카드로 활용하여 검색을 확장할 수 있습니다.
* 이 기능을 활용하여 `%홍%길%동%` 과 같이 검색하게 되면 홍, 길, 동이 순서대로 박혀있는 모든 닉네임을 검색할 수 있습니다.
* `_`의 경우 : 1자리의 문자를 대체하는 와일드 카드로 활용 가능.\
  예시) 닉네임 검색창에 `홍_길동` 을 검색하게되면 `홍 길동`, `홍1길동`, `홍2길동` 등이 검색
* `%`의 경우 : 0개 이상의 문자열을 대체하는 와일드카드로 활용 가능.\
  예시) `홍%길동`을 검색하게 되면 `홍길동` (0개문자) , `홍 길동`, `홍1길동` (1개 문자열), `홍 길동`, `홍12길동` `홍홍홍길동`(2개문자열) 등이 검색

이러한 검색 기능을 활용하여 공백문자나 특수문자 등이 닉네임에 섞여있는 유저들을 검색하여 확인하는데 활용할 수 있습니다.&#x20;

## **내 게임 이벤트 운영 가이드**

* 게임내 이벤트는 운영자 및 개발자의 재량에 따라 언제든 진행 할 수 있으며 '현금'이 보상이 되는 이벤트는 금지됩니다.\
  단, 인게임 상품 또는 현금이 아닌 현물(문화상품권, 백화점상품권, 가전 제품 등)이 보상이 되는 이벤트는 진행 가능.
* 게임의 이벤트는 공정하게 진행 되어야 하며 이벤트 정보(이벤트 기간, 보상 등)를 유저에게 명확히 알려야 합니다.
* 현물 전달에 필요한 유저의 개인정보는 경품 전달을 목적으로 유저의 동의하에 수집을 해야 하며 경품 전달이 완료 된 후 즉시 폐기 처분을 합니다.
* 현물 상품 이벤트는 자유롭게 진행 하되 상품의 총 금액이 200만원을 초과 하는 경우, 펑크랜드 측에 상품 내역과 금액을 전달 해야 합니다.

{% hint style="info" %}
**\[개인정보 수집 동의서 작성 예시]**

* 이벤트 경품 전달을 위하여 개인정보(성명, 연락처, 주소)를 수집, 이용하고자 합니다.

&#x20;

* 개인정보 수집 내역 : 성명, 연락처, 주소
* 개인정보 이용 목적 : 이벤트 경품 전달
* 개인정보 보유 기간 : 이벤트 경품 발송 직후 즉시 파기

&#x20;

* 이용자는 동의를 거부하실 권리가 있으며 거부할 경우 경품전달에 제한이 될 수 있습니다
  {% endhint %}

* 현물 상품 이벤트 진행 중 발생되는 모든 책임은 개발자(이벤트 진행자)에게 있으며 펑크랜드는 일체 책임을 지지 않습니다. 단, 상황에 따라 원활한 운영을 위해 펑크랜드측에서 중재할 권리가 있습니다.
  * \> 불건전한 상품을 보상으로 진행하는 경우 등

## **내 게임 커뮤니티 운영 수칙**

* 각 게임 커뮤니티 개설 시 “펑크랜드 공지사항” 으로 연동되는 링크를 공지사항으로 추가합니다.
  * 펑크랜드 공지사항 링크 : <https://cafe.naver.com/ArticleList.nhn?search.clubid=29492275&search.menuid=3&search.boardtype=L>
  * 펑크랜드 전체 서버 이슈 / 결제 이슈 등을 원활히 공유하기 위함입니다.
  * 결제 및 계정 관련 이슈를 슈퍼캣 고객센터에서 해결해드리기 위함입니다.
* 고객센터 지원 관련 공지사항 참고 : <https://cafe.naver.com/nekolandgames/2599>
  * 각 게임 커뮤니티 운영 시 아래 링크의 운영규칙을 참고, 공지하여 건전하고 유익한 커뮤니티 운영 부탁드립니다.
* 참고 링크 : <https://cafe.naver.com/nekolandgames/4166>
  * 펑크랜드에서 제공하는 운영 규칙 또는 가이드를 따르지 않고, 개발자 자체적으로 운영해서 발생한 분쟁이나 손해, 손실에 대해서 펑크랜드는 책임지지 않습니다.

## **운영 시 주의 사항**

* 리뷰 인센티브 이벤트는 구글 플레이 정책에 걸립니다. 앱이 삭제될 수 있으니 참고하세요.
  * 참고 링크 : <https://play.google.com/intl/ko_ALL/about/developer-content-policy/#!?modal_active=none>
* 펑크랜드 게임 운영시, 아래 명시된 행위를 하여서는 아니되며, 아래 사항 중 어느 하나에 해당하는 행위를 하는 경우 회사는 해당 회원의 서비스 이용을 중지하거나 이용계약을 해지할 수 있습니다.
  * 다른 회원의 계정을 부정사용하는 행위
  * 범죄행위를 목적으로 하거나 기타 범죄행위와 관련된 행위
  * 타인의 지적재산권 등의 권리를 침해하는 행위
  * 해킹행위 또는 컴퓨터 바이러스 등의 유포행위
  * 회사가 정한 방법 이외의 다른 방법을 사용하여 서비스에 접근하는 행위
  * 성인물, 음란물 및 저작권 침해 등 법령을 위반하는 내용의 게임을 개발하는 행위
  * 제작자간 프로젝트 파일을 거래하는 행위


# 콜라보레이션 가이드라인

펑크랜드 Console에 콜라보레이션 기능이 추가 되었습니다.

## **콜라보레이션이란?**

콜라보레이션은 게임 제작이나 게임 마케팅/홍보를 위해 일정 기간동안 팀을 이루어 공동으로 협업하는 작업을 뜻합니다.

콜라보레이션 기간 동안 발생한 수익금에 대해서는 미리 상호 약속한 비율에 따라 수익배분 정산이 가능합니다. 아래는 수익 배분 설정에 관련된 내용입니다.

## **\[이메일], \[닉네임]**

\[이메일], \[닉네임] 입력 후 \[검색] 버튼을 클릭해서 펑크랜드 회원 여부를 확인합니다. 아래 스크린샷 참조.

<figure><img src="/files/QP2DzCpM3rq1gKtoDONz" alt=""><figcaption></figcaption></figure>

이미 펑크랜드 회원에 가입되어 있는 경우, “계정이 확인되었습니다. 나머지 정보를 입력해 주세요” 라는 팝업 메시지가 뜹니다. 아래 스크린샷 참조.

<figure><img src="/files/zZln80zOUOrylOwZ30b5" alt=""><figcaption></figcaption></figure>

\[확인]을 클릭하고, 콜라보레이션 관련 나머지 정보를 입력하는 페이지로 이동합니다. 아래 스크린샷에서 버튼이 \[검색] -> \[확인됨]으로 변경된 것을 보실 수 있습니다. 아래 스크린샷 참조.

<figure><img src="/files/DuSIal5iOWO8mC1uDUcq" alt=""><figcaption></figcaption></figure>

## **\[기간]**

* 지분율이 0%인 콜라보레이션 회원은, 시작일(등록 신청일 이후 날짜)과 종료일은 임의로 선택이 가능합니다.
* 지분율이 0% 이상인 콜라보레이션 회원을 등록할 때에는, 시작일을 등록 신청일로부터 7일 이후부터 등록 가능하며, 종료일은 임의로 선택 가능합니다.

{% hint style="info" %}
주의 1 : 신규 콜라보레이션을 등록하려는 회원과 현재 진행 중인 콜라보레이션 프로젝트가 있을 경우, 기간을 중복해서 등록 할 수 없습니다. 현재 진행 중인 콜라보레이션 기간을 연장하는 등 방식으로 조정해주세요.
{% endhint %}

{% hint style="info" %}
주의 2 : 종료일 변경 시, 펑크랜드 전체 환급용 정산 최신 날짜 이전으로 변경 불가한 점 유의 하시기 바랍니다. 즉, 콜라보레이션 정산이 완료된 부분이기에, 종료 날짜를 최신 정산 날짜 앞으로 돌릴수 없습니다.
{% endhint %}

## **\[잔여지분]**

\[잔여지분]이란, 각 콜라보레이션 회원에게 배정한 지분을 전체 지분(100%)에서 제한 나머지 지분을 의미합니다.

\[선택한 계정 제외] 란, 콜라보레이션 진행을 위해 검색 또는 수정을 통해 선택한 회원 이외의 콜라보레이터들의 지분을 전체지분(100%)에서 제한 지분을 뜻합니다.

이에 따라, \[지분율]을 등록할 시에, \[지분율] 값은 \[선택한 계정 제외] 값보다 커서는 안됩니다.

## **\[지분율]**

\[지분율]이란, 현재 콜라보레이션 등록 신청을 진행 중인(즉, 상기 이메일/닉네임으로 회원 인증을 완료한 회원) 회원에게 배정할 지분입니다. \[지분율]은 \[선택한 계정 제외]에서 표시된 수치보다 작아야 합니다. 그리고, 동일 콜라보레이션 프로젝트에서 배정한 지분의 합은 100%를 초과하지 않도록 주의 바랍니다.

## **\[역할]**

콜라보레이션 진행에 있어서, 해당 회원의 역할을 선택하면 됩니다. 역할에 따라 관리자 페이지에서 접근 가능한 권한이 다릅니다.

공동제작자의 경우 '공동작업 관리'를 제외한 모든 관리 페이지 접근 권한이 부여되고, 운영자는 '쿠폰' 및 '우편'을 제외한 기능에 대한 접근 권한, 마케터는 '홈' 의 통계 자료만 볼 수 있습니다.

예를 들면, 역할에서 “공동 제작자”를 선택하고, \[등록 신청]을 클릭하면 신청이 완료되고, 아래와 같은 팝업 메시지가 뜹니다. 아래 스크린샷 참조.

<figure><img src="/files/Cmb1z6zO1t37YASRVR4w" alt=""><figcaption></figcaption></figure>

그리고, \[Pending Collaborators]에서는 등록 신청이 완료 되었고, 승인을 기다리는 신청건이 있음을 확인할 수 있습니다. 아래 스크린샷 참조.

<figure><img src="/files/hGuIJ4puS5SJoq56Vgnr" alt=""><figcaption></figcaption></figure>

만약 신청건이 반려 되었을 경우, 아래와 같이 반려 사유를 확인할 수 있습니다. 아래 스크린샷 참조.

<figure><img src="/files/0ICdtReP38Xh76NSqhEk" alt=""><figcaption></figcaption></figure>

아래의 팝업 메시지에서 확인할 수 있듯이 해당 콜라보레이터와의 공동 작업을 다시 등록 또는 수정 신청 하기 위해서는 먼저 반려된 신청건을 삭제해야 합니다. 아래 스크린샷 참조.

<figure><img src="/files/U73AGgCvEW08HGAlTzGQ" alt=""><figcaption></figcaption></figure>

신청건이 승인 완료 되면, \[Approved Collaborators]에서 승인 완료된 신청건이 표시됩니다. 아래 스크린샷 참조.

<figure><img src="/files/UKHmX2txLg9xnWHRwaBh" alt=""><figcaption></figcaption></figure>

만약 신청 정보 수정이 필요하면, \[수정] 버튼을 클릭하여 수정을 진행하면 됩니다.

## **\[샘플용: 펑크랜드 콜라보레이션 표준계약서]**

{% hint style="info" %}
콜라보레이션을 이용하는 1인 개발자, 개인/법인 사업자 분들을 위해 펑크랜드 콜라보레이션 표준계약서 양식을 제공합니다.

아래 표준계약서 양식을 토대로 하여 편하신대로 수정/편집해서 이용하시면 되겠습니다. 단, 슈퍼캣은 표준계약서 양식만 제공할 뿐, 콜라보레이션에 참여한 당사자와의 계약에 대해서는 아무런 연관/관련이 없음을 알려드립니다.
{% endhint %}

{% file src="/files/xdtqLp04erPkmLAfnEt6" %}

{% file src="/files/QoKYqtxSshe45rwTH9IL" %}


# 공지사항/이벤트 & 푸시 안내

펑크랜드 게임 콘솔에 \[공지사항/이벤트 & 푸시] 기능이 추가 되었습니다. 접속 보상 이벤트와 같은 캠페인을 접목시켜 사용자 인게이지먼트와 리텐션을 끌어올릴 때 유용하게 쓰일 수 있습니다.

* **푸시 대상자 :** 푸시는 자신이 제작한 게임을 관심게임으로 등록한 유저들에게만 발송됩니다.
* **푸시 횟수 :** 계정당 푸시를 한 달에 총 10개까지 발송 (추후, 발송 횟수는 조정될 수 있습니다)
* **푸시 설정방법 :** \[이벤트 & 푸시] 버튼을 눌러 \[Add Event] 선택하면,

<figure><img src="/files/BWuwG1PsNu2b7hVnZETw" alt=""><figcaption></figcaption></figure>

신규 이벤트 등록 팝업창이 뜹니다. (아래 스크린샷 참조)

<figure><img src="/files/igkvHNOqQoTrvgsRD3UR" alt=""><figcaption></figcaption></figure>

\[Title] 과 \[Category] 는 필수 입력사항.

\[Title] 를 입력하고, \[Category] 에서 등록할 이벤트 종류를 선택합니다.

하단의 \[Add] 버튼을 선택하여 신규 \[이벤트 & 푸시]를 생성합니다. (아래 스크린샷 참조)

<figure><img src="/files/bV2AESM4F6Zz3rhrw3pa" alt=""><figcaption></figcaption></figure>

\[Edit Game Event]를 클릭하면, 이벤트를 수정할 수 있습니다.

현재, \[Category]에서 \[Notice] \[Custom Event] \[Item Event] 3가지 종류의 이벤트를 등록 가능합니다.

\[Notice]는 Activate(활성화)/ Deactivate(비활성화)가 선택 가능합니다.

활성화를 선택하면, 펑크랜드 앱 상세 페이지에 해당 공지사항이 노출 됩니다. 아래 스크린샷 참조.

<figure><img src="/files/o0njgufsvIG2bgwxUFsV" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/yTCWSlacpHq1IdIrk6QC" alt=""><figcaption></figcaption></figure>

&#x20;

비활성화를 선택하면, 펑크랜드 앱 상세 페이지에 해당 공지사항이 노출 되지 않습니다. 아래 스크린샷 참조.

<figure><img src="/files/DpftdEsq0gTsx9kGjXTb" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/pudxPadRWXoJHE0O9few" alt=""><figcaption></figcaption></figure>

\[Custom Event]와 \[Item Event]에는 따로 활성화/비활성화 선택이 없습니다. 해당 카테고리의 경우 기간 입력을 필수입니다. 현재 시간이 해당 이벤트 기간 내에 있을때만 출력이 되는 구조입니다.

\[Custom Event]와 \[Item Event]에서, \[Period(UTC)] / Mail Text / Item ID / Item Count를 설정 가능합니다.

\[Period(UTC)] : 이벤트 진행 기간, UTC는 협정세계시 입니다.

\[Period(local)] : 한국 시간으로 자동 환산한 이벤트 진행 기간

Mail Text : 우편함에 들어갈 내용

Item ID : 지급 예정 아이템 코드 (현지는 등록 이벤트 당, 한가지 아이템만 지급 가능)

Item Count : 지급 예정 아이템의 수량

<figure><img src="/files/fCH9fA7oCaqkQF5xObVr" alt=""><figcaption></figcaption></figure>

위 스크린샷 내용을 입력한 후, \[Edit]를 누르면 이벤트 내용이 변경된 것을 확인할 수 있습니다.

<figure><img src="/files/KIRMy6cKzO8IzpT8mEtZ" alt=""><figcaption></figcaption></figure>

\[Add Push] 버튼을 클릭하면, 푸시 설정 팝업창이 뜹니다.

<figure><img src="/files/Kd0wm2kUALEipdPs9GTh" alt=""><figcaption></figcaption></figure>

\[Publish at(UTC)]는 협정세계시로, 푸시 발송 예정 시간을 설정 합니다.

푸시 발송 시간을 현재 시간보다 이전으로 입력하면 푸시가 즉시 발송됩니다.

\[Publish at(local)]은 한국 시간으로 자동 환산한 시간이 표시됩니다.

\[Text]는 푸시와 함께 발송될 메시지를 입력합니다.

전부 입력후, \[Add] 버튼을 클릭하면, 푸시 발송이 예약됩니다.

&#x20;

***

## 관련 Q\&A

Q. Item Event 에서 기간 입력은 필수인가요?

A. 네. 필수입니다. 기간 입력은 필수 사항입니다.

&#x20;

Q. Item Event에서 지정한 기간동안 모든 유저에게 보상이 지급되는 건가요?

A. 그렇지 않습니다. 해당 기간에 접속하여 우편함을 확인한 유저에게만 보상이 지급됩니다.

&#x20;

Q. Item Event 에서 지정해둔 기간이 지난 후 접속하면 보상을 받을 수 있나요?

A. 그렇지 않습니다. 보상은 이벤트 기간에 접속해서 우편함을 확인한 유저에게만 지급됩니다.

&#x20;

Q. 보상을 받은 이후, 다시 접속하면 또 보상이 지급되나요?

A. 보상은 한 유저당 1번만 지급됩니다.

&#x20;

Q. Item Event를 등록한 후 푸시를 보낼 수 있도록 설정할 수 있나요?

A. 네 그렇습니다. Item Event를 등록하면 Add Push 라는 버튼이 보입니다. 푸시는 선택 사항입니다. 선택사항이긴 하지만 푸시를 보내야 더 효과가 있겠죠?Add Push 버튼을 눌러서 푸시 내용 및 푸시 발송시간을 지정할 수 있습니다.

&#x20;

Q. 푸시는 한 달에 몇 번 보낼 수 있나요?

A. 제작자 계정당 월 최대 10회까지 발송 가능합니다.


# 인게임 광고 가이드라인

펑크랜드 스튜디오에 `비디오 AD 보여주기` 기능이 추가되었습니다. 게임을 플레이하는 사용자의 대부분을 차지하는 무과금 사용자로부터 수익을 도출할 수 있는 수단으로써 유용하게 쓰일 수 있습니다.

**광고 시청 이벤트 :** 다른 이벤트와 마찬가지로 인게임 어느 부분에나 추가될 수 있지만, 광고를 시청함으로써 일정한 보상(버프, 소정의 아이템)을 획득하는 보상형 광고로써 활용될때 가장 효율적입니다.

## **광고 시청 이벤트 추가방법 :**

펑크랜드 스튜디오의 이벤트 만들기기능에서 아래 스크린샷과 같이 `비디오 AD 보여주기` 이벤트(4번째 페이지)를 추가하여 쉽게 구현할 수 있습니다.

광고가 성공적으로 시청되었다면 `참일때` 분기에 등록해 놓은 이벤트들이 추가로 실행되고, 광고 시청중 비정상 종료가 일어나거나 광고를 스킵한 경우에는 `거짓일때` 분기에 등록해 놓은 이벤트들이 추가로 실행되게 됩니다.

<figure><img src="/files/IqLSwW3qzpOWYeJ5BSUQ" alt=""><figcaption></figcaption></figure>

광고 시청 이벤트는 테스트 플레이어에서는 동작하지 않습니다.

## **광고 시청 이벤트 활용방법 :**

위의 예시 스크린샷과 같이 어떠한 안내사항이나 보상 없이 단순하게 광고 시청 이벤트만 실행되도록 구현한다면, 해당 이벤트를 통해 광고를 시청하는 유저의 입장에선 반발심이 생길 수 있습니다.

광고를 통해 수익을 창출하기 위해선, 광고 시청에 대한 반발심을 최소화 함으로써 많은 유저가 자발적으로 광고를 자주 시청하게 하는 것이 가장 좋습니다.

아래 스크린샷과 같이 적절한 안내사항과 광고시청을 성공적으로 완료하였을 시 보상을 지급하는 방법 등 다양한 방식으로 활용할 수 있습니다.

<figure><img src="/files/tjSF0WdkO2ubSzVgDaQd" alt=""><figcaption></figcaption></figure>

위의 예시용 스크린샷은 `아이템 획득` 이벤트(2번째 페이지 - 아이템 획득)를 활용하여 광고를 성공적으로 시청하였을 때 아이템을 지급하는 구조입니다.

광고가 성공적으로 시청되었을때 보상 아이템을 지급하고, 다른 상황에선 상황에 맞는 안내 대사를 출력해주어 유저가 광고시청 결과를 확인할 수 있도록 해주는 것이 좋습니다.

## **광고 시청 이벤트 제한하기 :**

광고 시청을 하였을 시 지급하는 아이템이 과도하게 지급됐을 때 게임의 밸런스에 영향을 줄 수 있다면, 유저별로 광고 시청에 조건을 두어 너무 자주 지급되지 않도록 만들 수 있습니다.

가장 대표적인 방법으로는 하루에 한번만 또는 일정 시간마다 한번만 광고보상을 수령할 수 있도록 하는 방법이 있습니다.

#### <예시 1 - 매일 1번씩만 수령가능한 광고 보상>

<figure><img src="/files/lMcKO75mSBqRtsKwlEob" alt=""><figcaption></figcaption></figure>

위의 예시 1은 매일 1번씩만 광고보상을 수령할 수 있는 예시 이벤트 구성입니다.\
변수 설정 이벤트(1번째 페이지 - 변수)를 통해 18번 변수에 오늘날짜(기타 - 오늘날짜YYYYMMDD)를 대입해놓고, 해당 변수와 마지막 광고보상 아이템을 수령했을 시 저장해놓은 당시의 날짜(19번 변수)와 비교해 오늘 이미 해당 보상을 받았는지 여부를 확인합니다.

#### <예시 2 - 3시간마다 수령가능한 광고 보상>

<figure><img src="/files/iLwfD5TsQpBN0e1OgcWO" alt=""><figcaption></figcaption></figure>

위의 예시 2는 3시간마다 광고보상을 수령할 수 있는 예시 이벤트 구성입니다.

위 예시에서는 현재의 날짜 및 시간을 초 단위로 환산해주는 os.time()이라는 스크립트를 사용합니다.

변수 설정 이벤트(1번째 페이지 - 변수)를 통해 20번 변수에 현재 시간(스크립트 - os.time())를 대입해놓고, 해당 변수와 마지막 광고보상 아이템을 수령했을 당시의 시간에 3시간을 더한(os.time() + 3 \* 60 \* 60)값을 저장한 21번 변수와 비교해 해당 보상을 받은후 3시간이 지났는지 여부를 확인합니다.

## **광고 시청 현황 확인하기 :**

펑크랜드 게임 콘솔([http://nekoland.net/me](http://nekoland.net/me/games/2211/advertisements))의 \[광고] 페이지를 통해 현황을 확인할 수 있습니다.

<figure><img src="/files/NF52guhbBX9apNkwdf5C" alt=""><figcaption></figcaption></figure>

해당 페이지에선 아래와 같은 데이터를 확인할 수 있습니다.

* 월별 - 플랫폼별 시청수 및 예상 수익 (환율 등의 요인으로 실제 정산받는 큐브와 다소 차이가 있을 수 있습니다.)
* 일별 - 플랫폼별 시청수
* 일별 접속자 대비 광고 시청자 비율
* 일별 광고 시청자 당 평균 시청 수
* 게임 플레이어별 누적 광고 시청수(내림차순)


# 지적재산권 권리 침해 관련 안내

펑크랜드 팀입니다.

일부 제작자가 타인 또는 다른 업체에게 지적재산권이 귀속되어 있는 정보를 사전 동의나 허가 없이 자신의 게임에 무분별하게 이용하는 경우가 있습니다.

**타인의 지적재산권 권리를 침해하는 것은 불법행위입니다.** &#x20;

개발자는 타인에게 지적재산권이 귀속된 정보를 제공업체의 사전 동의 없이 복제⋅전송 등의 방법(편집, 공표, 공연, 배포, 방송, 2차적 저작물 작성 등을 포함합니다.)에 의하여 영리목적으로 이용하거나 타인에게 이용하게 하여서는 안 됩니다.

펑크랜드는 지적재산권 금지행위에 해당된다고 판단되는 경우에는 사전 통지 없이 이를 삭제 또는 이동하거나 그 등록을 거절할 수 있습니다.

매일 신규 오픈되는 게임과 업데이트 되는 게임 수가 많은 관계로 펑크랜드 팀에서 모든 게임들을 검수하는 것에는 한계가 있습니다. 게다가, 일부 제작자는 지적재산권에 대한 이해가 없거나 침해하는 것이 불법이라는 것 조차도 모르는 분들이 있는 것이 사실입니다. 알면서도 침해한다면 더 문제입니다.  &#x20;

펑크랜드를 건강한 게임제작 공간으로 가꿔나가기 위해서는 제작자의 지적재산권에 대한 이해도를 높이고 타인의 지적재산권을 존중하는 문화가 필요합니다.

이에 따라, [지적재산권 신고 게시판](https://cafe.naver.com/ArticleList.nhn?search.clubid=29492275\&search.menuid=34\&search.boardtype=L)을 개설했습니다. 제작자 분들이 보시고 타인의 지적재산권을 침해한 것으로 의심되거나 보여지는 게임이나 리소스가 있다면 저작권 신고 게시판에 글을 게재해주시기 바랍니다.

* 게시판 링크 : [지적재산권 신고 게시판](https://cafe.naver.com/ArticleList.nhn?search.clubid=29492275\&search.menuid=34\&search.boardtype=L)

**펑크랜드 팀에서는 의심이 간다고 판단되는 게임이나 리소스에 대해서는 언제든지 사전통지 없이 일단 게임을 내리거나 이동/삭제하거나 등록을 거절할 수 있습니다. 지적재산권을 침해했다고 보여지는 게임의 후속 조치나 소명은 해당 제작자가 해야하며 조치나 소명 정도에 따라 복구와 재등록 가능합니다.**

고맙습니다.

펑크랜드 팀 드림

<br>


# 게임 라이브를 위한 심사 시스템

누구나 손쉽게 게임을 개발해서 서비스를 하게 한다. 이는 펑크랜드가 추구하는 비전입니다.

하지만 진입 장벽이 낮다 보니 완성도가 심하게 떨어지거나 유료화가 적용된 게임임에도 불구하고 가이드라인이 지켜지지 않는 게임이 과도하게 노출되게 되었습니다.

이로 인해 사용자는 일정 수준 이상이 되는 게임을 접하기 어렵게 됨에 따라, 만족도가 떨어지게 되었고, 개발자 또한 힘들게 만든 게임이 묻혀버리는 결과를 낳게 되었습니다.

제작자의 게임 퀄리티는 갈수록 높아져가고 롱런하는 게임들이 등장하고 있습니다. 이와 함께 이용자들의 눈높이 또한 더불어 올라가고 있는 것이 사실입니다.

이러한 이유로 누구나 쉽게 게임을 개발하고 서비스하는 환경은 유지하되 정식 라이브 되는 게임에 대해서는 신규 게임 출시를 위한 사전 심사 절차를 도입함으로써 제작자와 이용자 모두 만족이 되는 서비스 환경을 만들고자 합니다.

## **심사 목적**

심사 목적은 '플레이 할 가치가 있는 게임인가'에 있습니다. 재미 여부가 판단기준이 아닌, 이용자에게 서비스할 수 있는, 신뢰를 줄 수 있는 게임인지 객관적으로 판단하는 데에 목적이 있습니다.

## **심사 절차 추가에 따른 Live 등록 방법 변경**

신규 게임은 스튜디오에서 Live 출시할 때 심사 승인된 게임만 출시됩니다. Test\~Open Beta는 승인되지 않더라도 기존처럼 출시 가능합니다.

## **심사 절차 안내**

* Open Beta 또는 Closed Beta 게임을 출시 후 제작자 게임 관리 콘솔 페이지를 통해 신청서를 작성하실 수 있습니다.
* 신청서 작성이 완료 되면 심사 신청 버튼을 통해 신청을 완료할 수 있습니다.
* 심사 신청이 된 게임은 펑크랜드 팀에서 확인 후 심사를 진행 합니다.
* 심사 완료 후 심사 결과가(승인 또는 반려) 제작자에게 통보 됩니다.
* 승인된 게임은 제작자가 원하는 시점에 LIVE 출시가 가능해집니다.
* 반려된 게임은 재심사 신청을 통해 재검수를 받아야 합니다.

## **심사 상태 안내**

* 심사 대기 : 신청서를 제출한 상태입니다. 펑크랜드 팀에서 확인이 되면 다음 단계로 진행됩니다.
* 심사 중 : 펑크랜드 팀에서 신청서를 확인하고 심사를 진행하고 있는 단계입니다.
* 심사완료 : 게임의 심사를 통과한 상태입니다. LIVE 출시가 가능합니다.
* 반려됨 : 게임의 심사를 통과하지 못한 상태. 반려 사유를 확인해서 수정 후 재심사를 신청할 수 있습니다.

## **심사 신청시 주의사항**

* 무분별한 심사 신청을 막기위해 한 번에 심사를 신청할 수 있는 횟수는 1회로 제한합니다. 진행중인 심사가 있다면 해당 심사가 완료(승인 또는 반려)되어야 다른심사를 신청할 수 있습니다.
* 한번 작성된 심사 신청서는 수정이 불가능합니다.
* 심사가 진행중인 게임은 업데이트를 할 수 없습니다.
* 심사 신청은 정산정보가 등록된 계정만 가능합니다. [링크를 통해 정산정보를 신청해주세요.](https://nekoland.net/me/revenue)


# Introduction to Punkland

**"If you love games, you've probably had moments where you wanted to create one yourself"**

Punkland offers you the opportunity to turn your passion for gaming into reality. You can create games using just your ideas and imagination, without complex coding processes. Experience the thrill of playing your self-created games with other users, and even earn revenue from them! Come and unfold your own gaming world in Punkland!

Punkland evolved from 'Nekoland', a mobile RPG development tool, into the world's most user-friendly game development tool & platform. It integrates modern Web3 technology with PC, web, and mobile cross-play capabilities, building upon years of experience in the field.

<figure><img src="/files/ZUEzkf7L8f4pqqZJhU1r" alt=""><figcaption></figcaption></figure>

**"Turn Your Online Game Development Dreams into Reality with Punkland!"**

Punkland is a platform that supports the entire game development process without complex coding. Built on specialized MMORPG expertise gained from Supercat's hit games 'Winds of Manga: Yeon' and 'Stone Growing Online', Punkland enables you to easily create games across various genres, from clickers to online MMORPGs. Our mission is to empower anyone interested in gaming to create their own online games with ease.

<figure><img src="/files/n5HJKMbBYMZg5JsXp7gh" alt=""><figcaption></figcaption></figure>

## Punkland's Achievements

Since its launch in 2018, Punkland has shown consistent growth. Initially, game enthusiasts, job seekers, and office workers started creating games as a hobby. As their games gained attention, they began generating revenue. This success led many to transition into becoming Punkland developers, with some even becoming game operators earning over 100 million won annually. More remarkably, even elementary and middle school students are creating games and generating income through Punkland, growing into future developers.

* **Top 10 Games Performance**: Average annual revenue of 110 million won per game as of 2022
* **Cumulative Revenue**: Exceeded $6.5 B within 5 years of service
* **App Popularity**: Over 1,000,000 cumulative downloads
* **Game Diversity**: More than 12,000 games uploaded
* **Creators Community**: Over 10,000 Game creators

<figure><img src="/files/sEzIgESjlVizbdpjqz0o" alt=""><figcaption></figcaption></figure>

## What is Punkland Studio?

'Punkland Studio' is a free game development tool that anyone can download. Using Punkland Studio on PC, you can create games and easily publish them as cross-play titles that can be enjoyed on the Punkland APP, official website (WEB), or both platforms.

* Punkland PC Studio currently supports Windows version only.
* In the \[Publish] menu within Punkland Studio, games can be automatically uploaded and serviced through the Punkland app with just a button click. Punkland Studio requires the latest .Net framework. If you encounter errors when running Punkland Studio, please install the[ **.Net Framework** ](https://www.microsoft.com/ko-kr/download/details.aspx?id=49982)and restart your system.
* [Punkland studio downloar (PC windows)](https://get.nekoland.net/)


# Update History

***

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>Studio </td><td><a href="/pages/o8tnuDZ183OThWEaYowO#studio-app-v-2.277-v2.312">/pages/o8tnuDZ183OThWEaYowO#studio-app-v-2.277-v2.312</a></td></tr><tr><td>APP</td><td><a href="/pages/1eNfO8p4OpPc5YCccKcT#studio-app-v-2.239-v2.275">/pages/1eNfO8p4OpPc5YCccKcT#studio-app-v-2.239-v2.275</a></td></tr><tr><td>Server</td><td><a href="/pages/lJuHjukVx8yLd4lHS7pp#2.3.1-23.07.05">/pages/lJuHjukVx8yLd4lHS7pp#2.3.1-23.07.05</a></td></tr></tbody></table>

***


# Studio

**Version 2.407 (December 4, 2024)**

* **Dark Mode Added**: You can now choose a color mode in **\[Tools] > \[Options]**.

***

**Version 2.399 (November 7, 2024)**

* **ChatBox Class**: Added a new `ChatBox` class for managing dialogue boxes.
* **Item Trade Checkbox Removed**: The "Item Trade Allowed" checkbox has been removed.

***

**Version 2.398 (October 28, 2024)**

* **Bug Fixes**:
  * Fixed issues in the item tooltip comparison feature.
  * Added a function to control the maximum number of clan members under **\[Database > System]**.

***

**Version 2.393 (October 17, 2024)**

* **Export Map Data**: Added the ability to export map data in XML or JSON formats (can be selected when exporting a map).

***

**Version 2.385 (August 21, 2024)**

* **Item Tooltip Comparison**: Added an item tooltip comparison feature (supports horizontal resolution only).

***

**Version 2.382 (August 16, 2024)**

* **Bug Fixes**:
  * Fixed issues where upload failure messages were not displayed properly.
  * Added a checkbox to enable the NavMesh movement system under **\[Database > System]**.
  * Added `Camera.useFadeEffectOnTeleport` to configure the presence of fade effects during map loading.

***

**Version 2.379 (August 8, 2024)**

* **Ranking Cap Increase**: Increased the maximum ranking and clan ranking to 200.

***

**Version 2.378 (August 7, 2024)**

* **Developer Help Updates**:
  * Improved strings in the script help documentation.
  * Adjusted layout manager sizing and removed the toolbox.

***

**Version 2.377 (July 31, 2024)**

* **Improvements**:
  * Added items to the selected index when pasting shop commands.
  * Adjusted alignment in the main form navigation bar.
  * Sprite Manager now saves image sheet sizes.
  * Error messages are displayed on release failure.
  * Coordinates are now saved when modifying map transitions.

***

**Version 2.363 (May 20, 2024)**

* **GUI Settings**: Added an option to enable or disable skill usage under **\[Database > System > GUI Settings]**.
* **Bug Fix**: Resolved intermittent errors in the test play console.

***

**Version 2.362 (May 13, 2024)**

* **Bug Fixes**:
  * Resolved issues where AI image generator items and skills were not displayed.
  * Fixed memory leaks when `Commons.Server.Scripts.ScriptField` was removed.
  * Added a `Commons.Server.Scripts.ScriptField.IsValid()` function for field validation.
  * Added "Copy Settings" and "Paste Settings" options in the Resource Browser.
  * Redesigned the drop item addition window.

***

**Version 2.360 (March 20, 2024)**

* **Improvements**:
  * Item descriptions can now include `{{tag}}` to call `TItem.tag`.
  * Added `visible` functionality to controls in the layout manager.
  * Items with a quantity of 1 in the shop can no longer have quantities adjusted.
  * Fixed an issue where components were missing during `Control.Clone`.

***

**Version 2.359 (March 11, 2024)**

* **Bug Fixes**:
  * Script errors no longer throw exceptions during execution.
  * Fixed resolution-related issues with `Camera.ScreenToWorldPoint` and `Camera.WorldToScreenPoint`.
  * Updated developer center URL for older versions.

***

**Version 2.356 (March 8, 2024)**

* **Bug Fix**: Resolved issues with the `Game.Scripts.UI.Control.Clone` function not properly copying child elements.

***

**Version 2.351 (March 7, 2024)**

* **Bug Fixes**:
  * Fixed issues with selecting subpath images in the layout manager.
  * Resolved name changes when cloning `Game.Scripts.UI.Control`.
  * Fixed listener omissions when cloning `Game.Scripts.UI.Button`.
  * Added `Game.Scripts.EventSystems` namespace and `Game.Scripts.EventSystems.PointerEventData` class.
  * Changed `onClick` event parameters to `Game.Scripts.EventSystems.PointerEventData`.

***

**Version 2.347 (February 29, 2024)**

* **Bug Fixes**:
  * Fixed error logs not displaying in client callback functions and top menu settings.
  * Resolved `.nekox` file access issues when the studio was open.

***

**Version 2.345 (February 21, 2024)**

* **New Features**:
  * Added `Game.Scripts.Unit.SetStun(float time, bool allowUseSkill)`.
  * Fixed issues with `Commons.Server.Scripts.MakeStun` not applying correctly.

***

**Version 2.343 (February 16, 2024)**

* **New Features**:
  * Added `Game.Scripts.Unit.PlayOneShotAction(string name, int delay)`.
  * Fixed errors with OGG file playback in the studio.

***

**Version 2.340 (February 8, 2024)**

* **Improvements**:
  * Updated `Client.damageCallback` to allow tuple returns.

***

**Version 2.338 (February 7, 2024)**

* **New Features**:
  * Added `Client.alertScale { get; set; }` to configure alert UI scaling.
  * Fixed issues where `onChat` events were not triggered across maps.

***

**Version 2.337 (January 24, 2024)**

* **Improvements**:
  * Enhanced item tooltip positioning and removed buttons from trade-registered items.

***

**Version 2.334 (January 11, 2024)**

* **New Features**:
  * Added critical damage parameter to `ScriptClient.damageCallback`.
  * Introduced shortcut creation in the sprite editor.

***

**Version 2.333 (December 6, 2023)**

* **New Features**:
  * Added the `ScriptRoomPlayer.isChatBanned` property to check a player's chat ban status.
  * Added a `notify` parameter to `Server.Chatban`, `Server.Ban`, and `Server.Unban` functions.

***

**Version 2.332 (November 22, 2023)**

* **Bug Fixes**:
  * Fixed an issue where item tooltip windows displayed empty spaces when no option type was present.
  * Prevented clicks and drags outside the border of the tileset.

***

**Version 2.330 (November 8, 2023)**

* **New Features**:
  * Added `ScriptClient.UseCube(int amount, string itemID)`.
  * Added `ScriptServer.playerUseCubeCallback(Func<ScriptRoomPlayer, int, string, boolean> callback)`.
  * Introduced `Game.Scripts.Diagnostics` namespace and `Game.Scripts.Diagnostics.StatMonitor` class.
  * Fixed term display issues under **\[Database > System > Terms]**.
  * Updated the default value for `borderColor` in the Layout Manager's Text component.
  * Fixed a bug causing the game to freeze when the mailbox operated during test play.

***

**Version 2.327 (October 25, 2023)**

* **New Features**:
  * Added `Client.defaultKeySettingsEnabled { get; set; }` to toggle default key settings.
  * Added the `allowSkill` parameter to `ScriptUnit.MakeStun` for enabling skill usage during stuns.
  * Introduced several clan-related methods:
    * `ScriptClan.Join(long id, ScriptRoomPlayer player)`
    * `ScriptClan.Kick(long id)`
    * `ScriptClan.SetClanMaster(long id)`
    * `ScriptClan.SetClanSubmaster(long id)`
    * `ScriptClan.GetMembersName()`
  * Added `ScriptServer.SetClanRanking(long clanId, long value)`.
  * Enhanced `ScriptServer.GetClans` with support for start and count parameters.
  * Added `ScriptServer.GetClan(string name)` and `ScriptServer.GetClan(long id)`.
  * Added the "Set Status" feature under **\[Event Commands]**.
* **Bug Fix**: Fixed intermittent reference errors when accessing `DropItem`.

***

**Version 2.325 (October 13, 2023)**

* **New Features**:
  * Added `Game.Scripts.StartChat.SetChatType(int chatTarget, string whisperTo, long whisperToID)` to change chat types.
  * Added `Game.Scripts.Unit.HPBarVisible { get; set; }` to toggle unit HP bar visibility.
  * Introduced `Game.Scripts.Graphics.SpriteAction` for sprite actions.
  * Added methods for managing sprite actions:
    * `Game.Scripts.ScriptClient.GetSpriteAction(string path)`
    * `Game.Scripts.ScriptClient.GetSpriteActions()`
  * Added `Commons.Server.Scripts.ScriptUnit.IsStun { get; }` to check stun status.
  * Added `Commons.Server.Scripts.ScriptRoomPlayer.SortBagItems(Func<TItem, TItem, boolean> callback)` for sorting bag items.
* **Bug Fix**: Resolved an issue where new stuns with shorter durations than the current stun would cancel the stun prematurely.

***

**Version 2.323 (October 11, 2023)**

* **New Features**:
  * Added `Game.Scripts.Field.SetFog(string path, int transparency, int speedX, int speedY)`.
  * Added `Game.Scripts.Field.SetPanorama(string path)`.
  * Introduced ambient and color transition effects with:
    * `Game.Scripts.Field.DOAmbientLight(Color color, float duration)`
    * `Game.Scripts.Field.DOColor(Color color, float duration)`
* **Bug Fixes**:
  * Resolved issues with `Camera.DOColor` and `Camera.DOShake`.
  * Added `Server.Scripts.ScriptServer.GetMaps()` for retrieving map data.
  * Added a right-click option in the **\[Resource Manager]** to copy the UUID of image files.
  * Added a "Developer Center" button under **\[Studio Help]**.

***

**Version 2.320 (September 27, 2023)**

* **Improvements**:
  * Updated VSCode extensions to display default values for parameters.
  * Fixed an issue where variadic method parameters were not displayed in the VSCode extension.

***

**Version 2.318 (September 22, 2023)**

* **Improvements**:
  * Enhanced grammar support in the latest VSCode extension.

***

**Version 2.317 (September 22, 2023)**

* **New Features**:
  * Added a `tag` property to `network.TItem` (string type).
  * Introduced the `Commons.Server.Scripts.Proxy.TItem` type.
  * Added `Utility.TranslateText(string text, Closure callback, string sourceLanguage)` for text translation.
  * Added `Client.autotranslateEnabled { get; }` for automatic translation support.
  * Improved internal structure of `Game.Scripts.UI.Control.style`.
  * Resolved an issue where errors were not logged for `Game.Scripts.UI.Control.style`.

***

**Version 2.314 (September 15, 2023)**

* **New Features**:
  * Added `TDropItem.ownerUnitID` to track the owning unit of dropped items.
  * Added functions for input fields:
    * `Scripts.UI.InputField.Focus()`
    * `Scripts.UI.InputField.isFocused`
  * Introduced `Scripts.UI.Button.raycastTarget` and `Scripts.UI.Text.raycastTarget`.
* **Bug Fix**: Resolved an issue where closing the first test play window would close all test play windows.

***

**Version 2.290 (August 2, 2023)**

* **New Features**:
  * Added guided projectile functionality for skills using `myPlayerUnit.UseGuidedProjectileSkill(int, Unit, int, Point, Point, bool)`.
  * Added the `Client.isTrading` property to check if the client is in a trade.


# APP

**Version 2.374 (February 7, 2024)**

* **Bug Fixes**:
  * Resolved an issue where the game list popup was being called multiple times.
  * Fixed scrolling bugs in the lobby and cash shop.
  * Improved visibility of item tooltips.
  * Enhanced usability of the inventory and trade windows.

***

**Version 2.368 (January 11, 2024)**

* **Improvements**:
  * Updated animations for lobby screen popups.
* **Bug Fixes**:
  * Fixed an issue where custom stat names after the 32nd entry were displayed as `StringValue_Custom{n}`.
  * Resolved button-related issues in the character window.

***

**Version 2.342 (September 15, 2023)**

* **New Features**:
  * Added AI automatic translation functionality.
  * Reset the default language of the game list to include all languages.
  * Reordered the "My Games" list in reverse order.
* **Bug Fixes**:
  * Improved UX for trade confirmations.
  * Fixed a bug causing random trade failure messages post-completion.
  * Prevented additional items from being added after confirming trade items.
  * Fixed an issue where `ScreenUI.gameMoney` did not apply in portrait mode.
  * \[WebGL]:
    * Fixed missing audio output.
    * Fixed issues with special characters and Korean input in InputFields.
    * Resolved unrecognized uppercase file extensions in script files.

***

**Version 2.331 (August 2, 2023)**

* **Improvements**:
  * Inventory and item tooltips no longer interrupt movement when opened.
  * Removed frame rate caps in the lobby scene.
  * Updated the developer support center URL to point to the GitBook.

***

**Version 2.329 (July 20, 2023)**

* **New Features**:
  * Added methods for applying stun and knockback effects to player units:
    * `MyPlayerUnit.SetStun(float time)`
    * `MyPlayerUnit.SetKnockback(Point distance, float time)`
* **Bug Fixes**:
  * Ensured proper application of `loop` and `pivotY` values in the Sprite Manager.
  * Fixed an issue where the main window opened in a minimized state upon project loading.

***

**Version 2.323 (July 5, 2023)**

* **New Features**:
  * Added `ScriptSlider.direction` property to set slider direction:
    * `0`: Left to right
    * `1`: Right to left
    * `2`: Bottom to top
    * `3`: Top to bottom
  * Added `ScriptUnit.collisionWidth` and `ScriptUnit.collisionHeight` properties for unit collision dimensions.
  * Added `Client.useAttachAudioToMyPlayer` to toggle audio listener attachment to `MyPlayerUnit`.
  * Introduced `Client.onStartMoveWithIUserInput(bool mouseClicked)` event, triggered when the player's movement starts due to user input.
  * Added `Camera.ScreenToWorldPoint(float x, float y)` for converting screen coordinates to world coordinates.
  * Introduced new callback:
    * `Client.unitClickCallback(Point pt, ScriptUnit[] clickedUnits)` to handle unit click events.

***

**Version 2.277 (July 5, 2023)**

* **New Features**:
  * Added events for managing item drag, unit death, unit clicks, and field transitions:
    * `ScriptClient.onDragPointerEvent(string event, int itemID)`
    * `ScriptClient.onUnitDead(ScriptUnit unit)`
    * `ScriptClient.damageCallback(ScriptUnit target, long damage, int skillDataID, ScriptUnit from)`
    * `ScriptClient.onUnitClicked(ScriptUnit unit)`
    * `ScriptClient.onFieldJoined()`
    * `ScriptClient.onUnitCreated(ScriptUnit unit)`
    * `ScriptClient.onUnitDestroyed(ScriptUnit unit)`

***

**Version 2.275 (June 7, 2023)**

* **New Features**:
  * Added `StartChat.isChatInputEnabled` property to check chat input activation.
  * Added `Control.masked` property for masking UI controls.
  * Introduced animation control methods:
    * `ScriptUnit.ShowAnimation(int animationID, Point position, Point direction)`
    * `ScriptUnit.StopAnimation(int animationID)`
* **Bug Fixes**:
  * Resolved issues where missing menu images were displayed as blank white.
  * Fixed advertisement feature functionality.

***

**Version 2.270 (May 24, 2023)**

* **New Features**:
  * Added a parameter to `ScriptClient.onJoinDropItem` to check if an item was dropped immediately.
  * Enhanced chat colors based on chat targets:
    * Global/Nearby: White (Admin: Sky blue)
    * Party: Yellow
    * Clan: Light green
    * Whisper: Light pink
* **Bug Fixes**:
  * Allowed unrestricted input of "/script" commands.
  * Refined genre filters for game details.

***

**Version 2.266 (May 10, 2023)**

* **New Features**:
  * Added `onMyPlayerUnitCreated` callback for `MyPlayerUnit` creation.
  * Introduced `onLeaveDropItem` callback for item removal notifications in `ScriptClient`.
  * Added methods for managing `DropItem`:
    * `SetScale` to adjust item scale.
    * `Acquire` to signal item acquisition.
* **Bug Fixes**:
  * Fixed functionality issues with `UseSkill` methods.
  * Resolved `ShowOnTop` property bugs in `Control`.
  * Prevented storage and dialogue popups from opening simultaneously.

***

**Version 2.263 (May 10, 2023)**

* **New Features**:
  * Added `raycastTarget` property to `UI.Panel`.
* **Bug Fixes**:
  * Fixed issues where loading progress during game updates and installations was not displayed properly.

***

**Version 2.256 (April 26, 2023)**

* **New Features**:
  * Added stat monitoring functionality.
* **Bug Fixes**:
  * Updated `Client.onChat` to support whisper and clan chat information retrieval.
  * Made the `visible` property in `Client.onChat` settable.

***

**Version 2.251 (April 12, 2023)**

* **Bug Fixes**:
  * Fixed an issue where experience (EXP) information was not displayed in the profile.

***

**Version 2.248 (March 29, 2023)**

* **Improvements**:
  * Removed the banner at the top of the favorites and game list views.

***

**Version 2.244 (March 15, 2023)**

* **New Features**:
  * Added `sliceBorder`, `horizontalOverflow`, and `verticalOverflow` properties to `UI.Button`.
  * Added sound effects to the Punkland app intro screen.
* **Bug Fixes**:
  * Resolved an issue where the "What is Punkland?" button under **Lobby > Account Settings** did not link to the correct address.
  * Fixed rendering issues with the loading UI gauge bar during game launch.
  * Fixed a bug where `Client.RequestTrade` could not reference users.

***

**Version 2.239 (February 28, 2023)**

* **New Features**:
  * Added `imageType`, `lineSpacing`, and `fontStyle` properties to `UI.Button`.
  * Added `color` property to `UI.Image`.
  * Added `cashMoney` property to `Client.MyPlayerUnit` for displaying cube balance.
* **Bug Fixes**:
  * Restricted account registration and email changes to specified domain formats.


# Server

**Version 2.4.2 (September 15, 2023)**

* **Bug Fixes**:
  * Ensured the user UI language is applied when browsing curated or featured games.
  * Fixed an issue causing abnormal termination of web game servers.

***

**Version 2.3.4 (July 20, 2023)**

* **New Features**:
  * Added `Unit.MakeKnockbackWithDir(float distance, float time, float dirX, float dirY)` method to knock back a unit in a specified direction.

***

**Version 2.3.1 (July 5, 2023)**

* **New Features**:
  * Added the following callbacks for managing fields:
    * `ScriptServer.onAddField(scriptField field)` - Triggered when a field is added.
    * `ScriptServer.onRemoveField(scriptField field)` - Triggered when a field is removed.
  * Introduced `ScriptServer.calculateStatsCallback(ScriptUnit unit, float[] stats)` for handling unit stat calculations.

***

**Version 2.2.3**

* **Improvements**:
  * Added a parameter to `ScriptUnit.SetJob` to specify whether equipped items should be retained.

***

**Version 2.1.3**

* **New Features**:
  * Added `ScriptRoomPlayer.isGuest` property to check whether a player is using a guest account.

***

**Version 1.0.14**

* **Improvements**:
  * Added `chat type` and `target ID` parameters to the `Server.sayCallback`.


# Getting Started


# How to Download Punkland Studio

#### How to Download Punkland Studio

* **Direct Download**: Clicking the ["Download Punkland Studio"](https://get.nekoland.net/) button allows you to download it directly.
* **Introduction Page**: You can also download the studio from the [Punkland introduction page](https://punkland.io/about).
* **PC Support**: Punkland Studio for PC is only available for Windows.
* **Requirements**: Punkland Studio requires the latest version of the[ .Net Framework.](https://www.microsoft.com/ko-kr/download/details.aspx?id=49982)
  * If you encounter any errors when launching the studio, please install the [.Net Framework](https://www.microsoft.com/ko-kr/download/details.aspx?id=49982) and reboot your system.

<figure><img src="/files/wL1Ecl6Whf6xfELtS33M" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/tSMZgdsZOWcd7n4v2MyF" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ebdK74SWDZdxHTC3F7nH" alt=""><figcaption></figcaption></figure>


# Checking Version and Updates

When you launch Punkland Studio, a popup will appear notifying you of any available updates to the latest version.

<figure><img src="/files/A3vu7tE8dyWtCIyoo3fp" alt=""><figcaption><p>Update 버튼 클릭</p></figcaption></figure>

* When you click the **\[Update]** button, a software update popup will appear, allowing you to monitor the update progress.
* Once the update is complete, Punkland Studio will automatically launch.
* For further clarification, refer to the screenshot below.

<figure><img src="/files/tYV9RxXT0IOOoXs5PVR7" alt=""><figcaption></figcaption></figure>


# New Project

After completing the latest version update, the initial screen of Punkland Studio will appear as shown below.

<figure><img src="/files/7HVXSHLR8qrNFVKQAzfC" alt=""><figcaption></figcaption></figure>

* **Click \[New Project]**: Start by clicking the **\[New Project]** button to create a new project.
* **Configure Settings**: Enter the following details:
  * **Project Name**
  * **File Path**
  * **Target Platform**
  * **Resolution**
* **Click \[Create]**: After configuring the settings, click the **\[Create]** button. The new project will be created and automatically launched.

<figure><img src="/files/trw6qhSK2F8ip5E60DWJ" alt=""><figcaption></figcaption></figure>


# Map Making

## &#x20;<a href="#undefined" id="undefined"></a>


# Add Map

### Creating a New Map

Maps serve as stages for player interactions, such as intro scenes, hunting grounds, or towns. Follow these steps to create a new map:

1. **Right-Click the \[NekoSample] Folder**: Locate the **\[NekoSample]** folder in the file explorer and right-click it.
2. **Select \[New Map]**: From the context menu that appears, click on **\[New Map]**.

This will initiate the creation process for a new map.

<figure><img src="/files/mFH2epvJgfiDNwMZVBCG" alt=""><figcaption></figcaption></figure>

#### Configuring a New Map

When the **\[New Map]** popup window appears (refer to the screenshot below), configure the following settings:

1. **Name**: Enter a unique name for the map.
2. **Size**: Specify the dimensions of the map.
3. **Tileset**: Choose a tileset for the map's visual theme.
4. **BGM Change**: Set the background music for the map.
5. **BGS Change**: Configure the background sound effects.
6. **Single Play**: Enable or disable single-player mode.
7. **Instance Map**: Toggle the instance map setting.
8. **Gravity**: Define the gravity level for the map.
9. **Channel Count**: Specify the number of channels available for the map.
10. **Maximum Players**: Set the maximum number of players allowed on the map.

After entering the desired settings, click **\[Confirm]** to create the map.

<figure><img src="/files/s0AOLUSn245EpLeHf7x3" alt=""><figcaption></figcaption></figure>

#### Configuring Map Details

When setting up a new map, you can customize the following fields:

1. **Name**:
   * Set the name of the map being edited. This name is unrelated to the game's content and is purely for organizational purposes. Choose a name that clearly indicates the map's purpose.
2. **Size (Width/Height)**:
   * Specify the map's dimensions (in tiles).
3. **Tileset**:
   * Select the tileset to use for creating the map.
     * Example: Choose **\[002: Background Tiles]** for a background map or **\[000: Town]** for creating a village map.
     * Pick a tileset appropriate for the map's intended design.
4. **BGM Change**:
   * Set the background music for the map.
5. **BGS Change**:
   * Configure the background sound effects.
6. **Single Play**:
   * Enable or disable single-player mode.
7. **Instance Map**:
   * Check this option to make the map an instance map.
8. **Gravity (X, Y)**:
   * Set the gravity values for the map's environment.
9. **Channel Count**:
   * Define the number of channels available for the map.
10. **Maximum Players**:
    * Specify the maximum number of players allowed in the map simultaneously.

&#x20;

#### Example: Creating a Map

For example, if you set the following:

* **Name**: `test`
* **Size**: Width 16 / Height 16
* **Tileset**: `000: Town`
* **Instance Map**: Checked

Click **\[Confirm]**, and the newly created map will resemble the screenshot below.

<figure><img src="/files/4yoOzEoFumaA3LAhzlms" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/rSdIr0KTZTfvJrBCU6PD" alt=""><figcaption></figcaption></figure>


# Sub Map Creation

To create a submap for more detailed editing, follow the same steps as creating a new map:

1. **Right-Click the Parent Map**: For example, if you want to create a submap named **\[test1]** under the **\[test]** map, right-click the **\[test]** map in the file explorer.
2. **Select \[New Map]**: From the popup menu, click **\[New Map]**.

This will open the **\[New Map]** configuration window, allowing you to create a submap.

The process of setting the map's **Name**, **Size**, **Tileset**, and other options is the same as for creating a standalone map. Once completed, the submap will be nested under the parent map.

<figure><img src="/files/n2mi86D8hPUYildKus1A" alt=""><figcaption></figcaption></figure>

When creating a submap under an existing map, a **\[Create Map]** popup window will appear. Follow these steps:

1. **Set the Map Details**:\
   Configure the following options in the popup window:
   * **Name**: Enter the name of the submap.
   * **Size**: Specify the width and height of the map.
   * **Tileset**: Choose the appropriate tileset for the map’s design.
   * **BGM Change**: Set background music for the submap.
   * **BGS Change**: Configure background sound effects.
   * **Single Play**: Enable or disable single-player mode.
   * **Instance Map**: Select whether this is an instance map.
   * **Gravity**: Adjust the gravity settings for the map.
   * **Channel Count**: Define the number of available channels.
   * **Maximum Players**: Set the maximum number of players allowed in the map.
2. **Click \[Confirm]**:\
   After entering the settings, click the **\[Confirm]** button to create the submap.

<figure><img src="/files/XbNrUznKeARvL1dKOqWu" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/KJVmG5E0ZHIYE5xvAPzN" alt=""><figcaption></figcaption></figure>

Similarly, you can create the \[test\_2] map using the same method.

<figure><img src="/files/sVfwqwMzTA7H0dkh93d6" alt=""><figcaption></figcaption></figure>


# Edit Map

#### Editing the Map

* Select the tile(s) you want to place on the map by clicking or dragging multiple tiles in the Tile Palette.
* Use one of the four drawing tools to place the tiles on the map as desired.

<figure><img src="/files/9lOBeXttD3RRsiZonHiT" alt=""><figcaption></figcaption></figure>

#### Drawing Tools Overview

The tools in the screenshot, in order, are **\[Pen Drawing]**, **\[Rectangle Drawing]**, **\[Circle Drawing]**, and **\[Fill]**.

**1. \[Pen Drawing]**

Here’s how to use the **\[Pen Drawing]** tool to place tiles:

1. **Select a Tile**:
   * In the Tile Palette on the left, click or drag to select the tile(s) you want to use.
   * The selected tile(s) will be highlighted with a red border.
2. **Activate the \[Pen Drawing] Tool**:
   * Click the **\[Pen Drawing]** tool to confirm it is selected.
3. **Draw Freely**:

   * Click or drag on the map to place the tiles in any shape or pattern you desire.
   * This tool allows for precise, freehand placement of tiles.

   <figure><img src="/files/JQJ5yJCpxY1O7Mjr1uhS" alt=""><figcaption></figcaption></figure>

#### 2. **\[Rectangle Drawing]**

Here’s how to use the **\[Rectangle Drawing]** tool to place tiles:

1. **Select a Tile**:
   * In the Tile Palette on the left, click or drag to select the tile(s) you want to use.
   * The selected tile(s) will be highlighted with a red border.
2. **Activate the \[Rectangle Drawing] Tool**:
   * Click the **\[Rectangle Drawing]** tool to confirm it is selected.
3. **Draw Rectangles**:

   * Click and drag on the map to create a rectangular area.
   * The selected tile(s) will fill the rectangle in the area you define.

   <figure><img src="/files/nR5eSFWh8R447pwl7j1a" alt=""><figcaption></figcaption></figure>

#### 3. **\[Circle Drawing]**

Here’s how to use the **\[Circle Drawing]** tool to place tiles:

1. **Select a Tile**:
   * In the Tile Palette on the left, click or drag to select the tile(s) you want to use.
   * The selected tile(s) will be highlighted with a red border.
2. **Activate the \[Circle Drawing] Tool**:
   * Click the **\[Circle Drawing]** tool to confirm it is selected.
3. **Draw Circles**:

   * Click and drag on the map to create a circular area.
   * The selected tile(s) will fill the circular shape you define.

   <figure><img src="/files/9ObICm5kTftLpTBnc7uB" alt=""><figcaption></figcaption></figure>

#### 4. **\[Fill]**

Here’s how to use the **\[Fill]** tool to place tiles:

1. **Select a Tile**:
   * In the Tile Palette on the left, click or drag to select the tile(s) you want to use.
   * The selected tile(s) will be highlighted with a red border.
2. **Activate the \[Fill] Tool**:
   * Click the **\[Fill]** tool to confirm it is selected.
3. **Fill Areas**:

   * Click on the desired area of the map to fill it with the selected tile(s).
   * The fill will apply to contiguous tiles of the same type in the selected area.

   <figure><img src="/files/Xs1idYtWGUZz6T6hHvr9" alt=""><figcaption></figcaption></figure>

#### 5. **\[Cut]**

Here’s how to use the **\[Cut]** tool to edit a map:

1. **Select the Area to Cut**:
   * On the map, use the selection tool to highlight the area you want to cut.
2. **Activate the \[Cut] Tool**:
   * Click the **\[Cut]** tool to remove the selected tiles from their current position.
3. **Reposition the Cut Area**:
   * Move to the desired location on the map and paste the cut area using the appropriate tool.

This example demonstrates cutting a section of a village map and moving it to the right.

<figure><img src="/files/XnxQuJmDzlKfZS6MpCQa" alt=""><figcaption></figcaption></figure>

6\. **\[Zoom In or Out]**

<figure><img src="/files/2DZlFsOqxYOSonIn63NB" alt=""><figcaption></figcaption></figure>




---

[Next Page](/llms-full.txt/1)

