[[분류:Roblox Studio]] [include(틀:Roblox 하위 문서)] ||<-2>
{{{#!wiki style="margin: -10px -10px; word-break: keep-all" ||
[[파일:Roblox Studio 아이콘.svg|width=128]]||'''{{{+3 로블록스 스튜디오}}}'''[br]Roblox Studio ||}}} || || '''개발''' ||[[Roblox Corporation]] || || '''플랫폼''' ||[[Microsoft Windows]] | [[macOS]] || || '''출시''' ||[[2005년]] || || '''프로그래밍 언어''' ||[[Lua]][* 정확히는 Luau] || || '''한국어 지원''' ||지원 || || '''관련 사이트''' ||[[https://developer.roblox.com|[[파일:Roblox Studio 아이콘.svg|width=20]]]]^^로블록스 개발자 허브^^[br][[https://education.roblox.com/|[[파일:Roblox Studio 아이콘.svg|width=20]]]]^^로블록스 교육 허브^^[* [[Lua]] 스크립트 강좌도 초보자들이 이해하기 쉽게 적혀져 있으니 배우고 싶거나 관심 있으면 검색창에 Script라 쳐서 둘러보자. 구글 자동 번역으로 번역하면 번역이 깔끔하게 된다. 영어가 서툴다면 자동 번역을 키자.][br][[https://developer.roblox.com/en-us/onboarding|[[파일:Roblox Studio 아이콘.svg|width=20]]]]^^로블록스 스튜디오 자습서^^[br][[https://devforum.roblox.com/|[[파일:Roblox Studio 아이콘.svg|width=20]]]]^^로블록스 개발자 포럼^^ || || '''다운로드''' ||[[https://www.roblox.com/create|[[파일:Roblox Studio 아이콘.svg|width=20]]]] || [목차] [clearfix] == 개요 == [[Roblox]] 플랫폼의 게임 개발 도구. [[https://www.roblox.com/create|여기]]에서 다운로드받아 설치할 수 있다. 개발 도구 내에서 게임을 개발하며 테스트해 볼 수 있으며, 게임을 발행(Publish)하면 개발한 게임을 다른 친구들과 함께 플레이할 수 있다. [[https://developer.roblox.com|로블록스 개발자 허브]] 다양한 공지와 API문서를 한꺼번에 볼 수 있다. 기본적으로 API문서가 여기에 다 있으니 참조를 할 수 있다. [[https://education.roblox.com/|로블록스 교육 허브]] 사이트에서 개발 관련 자료를 찾아볼 수 있으며, 일부 자료는 한글화되어 있는 걸을 볼 수 있다. 유튜브에서도 "로블록스 스튜디오"로 검색하면 로블록스 개발 관련 영상을 찾아볼 수 있다. 하지만 현재 구할 수 있는 대부분의 개발 자료가 영어로 되어 있으므로 진입장벽은 감안해야 한다. 그래도 국내 일부 로블록스 게임 개발자 유저들이 네이버 카페에 커뮤니티를 만들어서 개발을 하면서 어려움 점이나 자신의 지식을 공유할 서로 서로 공유를 할 수가 있다. 링크 : [[https://cafe.naver.com/robloxstudio]] 2021년 1월 패치로, 스튜디오 자체 툴 메뉴 대부분이 한글화되었다. 번역 수준은 매우 깔끔한 편이다. 2021년 2월에 로고가 바뀌었다. 2021년 10월 29일 서버 다운사태 때문에 당시 접속이 불가능 '''했었다'''. 2022년 9월에 UI 개편이 있었다..만, 9월 말~10월 초에 원래 UI로 롤백되었다. 아마 가독성 문제 때문에 그런 듯. == [[Roblox Studio/템플릿|템플릿]] == [include(틀:상세 내용, 문서명=Roblox Studio/템플릿)] == Tool Box == [[파일:toolbox robloxstudio.gif|width=200]] 필요한 에셋을 검색을 통해 꺼내와 사용할 수 있는 곳이다. 검색을 하여 필요한 에셋을 꺼내 사용할 수 있는데, 유저가 만든거나, ROBLOX가 자체적으로 만든[* 주로 기초적인 스크립트나 모델이다.] 것도 있다. 그리고 로블록스에서 인증된 모든 툴들은 노란색의 뱃지 표시가 있다. 툴박스에서 사용 가능한 툴은 Models, Images, Meshes, Audio로 분류되어 있다. 저작권에 걸리는 모델[* 현존 게임의 스크립트, 메쉬 등을 크래킹으로 뽑아내어 유포한 것 등.]은 웬만하면 쓰지말자. 바이러스의 위험도 있고 저작권법 위반이다. [* 특히 이건 처벌이 될 수 있기 때문에 진짜 하지마라. 남한테 피해주는 행동인 것도 문제이다.] 간혹 모델중에 가끔 '''유료로 판매하는 모델을 허가없이올려서 무료로 판매'''하는 사람들도 있어 조심해야한다.[* 잘못하면 일부 게임을 '''이용하는데 제한'''이 생길수도 있다.] === Model === [[파일:Models roblox studio.png|width=200]] 여러 오브젝트를 묶어 한 곳에 모은 일종의 폴더이다. 종류 상관없이 작품을 만들 때 사용된 여러 부품을 하나의 Model로 정리할 수 있다. Roblox Studio에서 가장 큰 비중을 차지한다고 볼 수 있으며, 게임을 제작할 때 가장 유용하게 사용된다. 그러나 비슷하게 사용되는 Folder는 모델처럼 부품들을 묶지만 화면에서 선택하면 모두 선택되는 모델과는 다르게 화면에서 각각 선택이 가능하므로 시간을 절약 하고 싶다면 폴더가 훨씬 유리하다.(키보드의 Alt 키를 누르면서 모델을 눌러도 된다) === Image(구 Decal) === Image는 모델에 씌울 수 있는 사진이나 그림이다. 이미지는 자신이 직접 업로드할 수 있다. 글씨가 작게 적힌 파일을 업로드하면 검열에 걸릴 가능성이 높으니 주의.(크게 적혀있으면 잘 통과한다) 이 외에도 다른사람의 얼굴이 나온 사진, 혐오스러운 사진, 총기 사진, 피가 나오거나 잔인한 사진, 링크가 걸린 QR코드, 사이트 링크,[* 유튜브, 디스코드, 페이스북, 트위터, 트위치등 로블록스 내에서 지원하는 링크가 아닌 다른사이트 링크는 바로 제제를 때린다.--근데 지원하는 사이트 링크여도 제제를 때린다!-- ] 수 분 이내에 경고를 먹게 된다.이러한 경고를 여러 차례 먹게 될 경우 계정 제재의 원인이 되므로 주의하자.[* 고양이 사진도 영정먹는다 --이상한 로블--] 기존엔 Decals라는 분류였다가 Images로 바뀌었다. === Video === '''게임 안에서 영상을 볼 수 있게 해주지만''' 현재는 베타 버전인지 인증된 사용자만이 올린 극소수의 Roblox 오리지널 동영상만이 존재하며, 이 때문에 활용도가 극히 제한적이다. 무엇보다 최적화가 덜 된 상태라서 많이 사용하면 프레임이 떨어진다. === Mesh === Mesh는 [[Blender]] 등의 3D모델링 프로그램으로 만들어진 파일의 정보를 담은 것으로, 만든 3D 파일을 Mesh를 이용해 Roblox에 불러올 수 있다. MeshPart를 이용해 불러온다. 당연히 단독으로는 작동하지 않는다. MeshPart가 충돌 인식이 안 좋다.[*해결 이건 CollisionFidelity에서 Default를 PreciseConvexDecomposition로 바꿔주면 된다.] 좀 복잡하다 싶은 구조물(주로 총이나 자동차. 특히 현실의 것을 모티브로 한 경우)은 십중팔구 Mesh를 이용한 것이라고 보면 된다. === Audio === Audio는 적용 가능한 소리 파일이다. 2022년 3월부터 '''오디오를 무료로 업로드할 수 있다.''' (최대 7분)[[https://devforum.roblox.com/t/action-needed-upcoming-changes-to-asset-privacy-for-audio/1701697/7|#]][* 영어로 되어 있는 페이지이므로 [[Chrome]] 사용자들의 경우 자동 번역을 사용하는 것을 추천한다.] 다만 제약사항이 있는데, 한 계정당 30일에 10개의 오디오밖에 업로드할 수 없다.[* ID가 인증된 계정은 30일에 100개를 업로드할 수 있다.] 또한 기존에 올린 6초이상 오디오들이 3월 22일부로 모두 비공개 처리되었다 자세한 건 [[Roblox/사건 사고#s-2.5]] 참고. == 문제점 == === [[Rule 63|R63]] 관련 문제[* 로블록스에서 굉장히 성적이라 많은 사람들이 혐오하는 것들이다.] === 일부 유저들은 이상한 아이템들을 개발하여 모델로 내놓는다.[* 대부분 검열을 피하기 위해 큰 상자에 넣어 올린다.][* 이런 것들을 방지하기 위해 일부러 트롤 사진을 올려놓는 사람들도 있다.] 사실상 거의 '''해결'''된 문제이다, 로블록스의 대대적인 제재와 더불어 유저들이 R63 이란 이름을 대고 테러 아이템[* 전혀 다른게 들어있는 낚시 아이템이나 사운드 파트가 지우면 재생되는 것을 악용하여 R63 모델을 지우면 귀갱을 하는 등 여러가지 방법]을 넣는 등 제 3자의 활동으로 거의 해결되었다. …라곤 하지만 그래도 여전히 R63은 남아있다. 이 문제가 심각한 것을 인지한 로블록스는 12월 3일 R63 관련 제작자들은 '''법적 소송'''할 것이라 밝혔으며 12월 6일 '''16살'''[* [[Ruben Sim]]을 소송한 이후로 굉장히 이례적인 일이다.] R63 제작자 대상으로 법적으로 위협까지 감행했다. === 버그 === 자체 엔진을 사용하는 만큼 버그도 많다. * 유니온이 안보이거나 유니온 해제가 안될때가 있다. 스튜디오를 재시작하면 다시 보이기도 하는데 재시작 후에도 안보이고 유니온 관련 시스템이 안먹힐 경우에는 복구가 불가능하다. 복구 할 수 있는방법은 참조바람.[* [[https://devforum.roblox.com/t/how-to-recover-invisible-corrupt-unions/398711|#]]] 복구 원리는 간단하다. 로블록스 스튜디오에서 유니온으로 바꿀 때 유니온 데이터가 자산id로 이동하여 그 데이터가 문서에 그대로 남겨있어서 복구를 할 수 있다. *유니온으로 구멍을 뚫더라도 파츠가 투명하게 남아있다.[*예시 사각형에 원통으로 구멍을 꿇어지만 빈공간에 투명하게 파츠가 있어서 공중에 뜨거나, 공간이 있어도 실제로 들어갈수 있는 공간이 훨씬 적다. 게다가 일정한것도 아니다.] [*해결법 CollisionFidelity => PreciseConvexDecomposition 이렇게하면 사실상 없어진다. ] * 일부 극소수의 사람들은 모든 생성된 파트가 고정이 풀려있어도 이동시키거나 크기를 키우려고 하면 자동고정이 걸리는데 원인 불명. [*만약 하지만 studs 가 지나치게 커져있으면 안움직이기도 하니 확인 할 것] * 모델을 생성했는데도 불구하고 먹통일때가 있다. 집 또는 킬러 모델이 주로 걸린다. * 메시파츠가 안보이는 버그. 이걸 해결할려면 아예 다시 만드는것 말고는 방법이 없다. === Lua 바이러스 === 일부 유저는 스튜디오로 악성 스크립트를 개발[* 개발이라 하기도 뭐하고, 구글에 검색하면 그런 코드는 널린데다 아예 다른 악성 모델에서 스크립트 자체를 뜯어오든 하는게 극히 대부분.]해서 그 스크립트(이하 바이러스)가 심어진 모델을 배포한다. [*주의 루아 바이러스를 많은 사람들은 컴퓨터를 해킹하거나 게임을 해킹한다고 하지만 사실은 아니고, 게임에 골치를넣는다고 보면된다. 강제로 다른게임으로 끌거나 사용자에게 강제로 로벅스템을 구매하게하거나. 즉 루아바이러스는 해킹을 하는것은 아니다. 그래도 주의 ] 일반적으로 바이러스는 다음과 같은 경로로 감염된다. * '''툴박스에서 바이러스가 심어진 악성 모델을 불러온다.''' * 정상 플러그인을 사칭한 악성 플러그인을 설치한다. * 팀 크리에이트나 다른 개발자가 있는 그룹 게임에서 다른 사람이 이를 감염시킬 수 있다. 바이러스는 다음과 같은 모델에 자주 들어가있다. * 툴박스에서 노란색 인증 뱃지가 달리지 않은 상단의 모델. * 예전에는 없었는데 갑자기 툴박스 상단으로 나온 모델들. 봇을 이용한 조작으로 순식간에 인기모델로 상단에 노출되게 한다. * 이름이 한 단어 도배로(예시: NOOB NOOB NOOB NOOB) 이루어진 대부분의 모델. * 검색 키워드랑 전혀 관련 없어보이는 뜬금없는 모델. 자전거를 검색했더니 대관람차가 나온다거나. * Anti-Exploit, Anti Lag Script 등 핵 방지나 최적화를 해준다는 스크립트라 주장하는 '''모든''' 모델. 애초에 그런건 모델로 구현이 불가능하고 플러그인으로 구현해야 한다. * 툴박스에서 같은 이름을 가진 동일 모델이 여러개 있는 모델들. * 모자 없애는 발판이나 속도 발판, 자판기, 총 지급 장치, '''아이템 지급기'''[* Item Giver라고 흔히 알려져있다.] 등 많은 사람이 사용하는 모델의 '''복제품들.'''[* 단순히 프리 모델을 꺼내와서 손 쉽게 게임을 만들려고 하는 유저들을 도와주기 위해 복제품을 만드는 유저도 있지만, 대부분은 상위권을 노리려고 만들거나 바이러스를 심어놓는 경우가 많다.] 비슷한게 널려서 구별도 쉽지 않다. * 표지판이나 의자같은 단순한 물건에 스크립트가 덕지덕지 붙어있는 경우. 다음과 같이 행동하면 게임에 바이러스가 창궐하는 걸 예방할수 있다. * 툴박스에서 '''노란색 인증 뱃지가 붙은 모델'''만을 불러온다. 정 안되면 1200표가 넘는 모델을 불러온다[* 정 이것도 뭐한게 요즘엔 봇으로 표를 늘린다.되도록이면 밑과 위 항목을 실천하자.] * 툴박스를 건드리지 않고 혼자서 모델과 스크립트를 전부 직접 만든다. * 툴박스에선 이미지나 오디오, 메쉬만을 불러와 사용한다. * 툴박스에서 불러온 모델에 수상한 스크립트 파일은 없는지 꼼꼼히 검사 후 게임에 넣는다. 이 바이러스는 컴퓨터 자체에는 영향을 끼치지 않는, 보통 '''Lua 바이러스'''라고 불리는 바이러스다. 백도어의 경우에도 컴퓨터 자체에는 영향을 끼치지 않지만, 게임을 발행하고 사람이 좀 많아지면 백도어를 유포한 사람한테 기록이 가고[* 디스코드 등] 그 사람이 특정 조건을 만족한 (부)계정[* 누구랑 친구를 추가했거나, 일정 명령어를 입력했거나, 그룹에 가입했거나 등]으로 게임에 접속하면 게임안에 특정 GUI가 나오고 그 사람은 그걸로 각종 나쁜 짓을 할수 있게 된다. '바이러스' 종류에서 주로 발생하는 일은 * 게임이 시작하자마자 FREE ROBUX같은 다른 게임으로 옮겨버린다. * [[눈뽕|화면이나 GUI를 계속 깜빡거리게 하여 눈을 아프게 만든다.]] * 의미 없는 모델[* 주로 의자, 나무 등 의미 없는게 많다.]을 구매하라고 계속 구매창이 나와 게임을 불편하게 한다. * '''무한 루프를 이용한 서버/클라이언트의 엄청난 렉을 유발한다.''' * 더 나아가, 로블록스가 게임을 잘못 판단하면 게임 또는 계정이 제재를 당할 수 있다. '백도어' 종류에서 주로 발생하는 일은 * 루아 바이러스나 백도어를 만든 사람에게 각종 도구와 기능, 좋은 예시로 '''어드민'''을 제공한다. * GUI를 이용한 각종 팝업 메세지를 띄운다. * 불이나 파트등 물체를 소환한다. * 데이터스토어[* 게임 내의 플레이어 정보를 저장하는 곳. 인게임 돈이 대표적이다. 단 대부분의 게임이 서버에 정보를 저장하기 때문에 눈에 보이는 값만 바꾸는 것은 나갔다만 와도 소용이 없어진다.]를 변형한다. * 스크립트나 물체의 이름을 바꾸거나 지워 '''게임을 망가뜨린다.''' * 게임내에서 일반적으로 불가능한 [[콘솔 스크립트|'''Star glitcher같은 스크립트''']]를 사용한다. 스튜디오 내의 서버 스크립트를 사용한 백도어를 심어 콘솔 스크립트를 사용하는 것. *여담으로 백도어 중에서는 Ro-Sync이라는 것이 있는데 이것이 당신의 게임에 있을 경우 각종 스크립트에 Last Synced (날짜 혹은 시간) 이 적혀 있으며 사용자가 당신의 게임에 각종 악성코드를 삽입할 수 있게 된다. 만일 스크립트에 "Last Synced (일렬의 숫자)" 가 적혀 있거나 RoSync Loader라는 이름의 오브젝트가 있을 시 백에는 백 툴박스표 에셋 사용 등의 경로로 게임이 감염된 것이니 그럴 때에는 아래 스크립트를 Command Bar에 입력하자: {{{#!syntax lua for i,v in pairs(game:GetDescendants()) do pcall(function() if v:IsA("Script") then if string.find(v.Source, "RoSync Loader") then local code = "" local splitted = string.split(v.Source, "\n") for lineNum, line in pairs(splitted) do print(type(string.find(line, "Last synced"))) print("removinga") if string.find(line, "Last synced") then else code = code.."\n"..line end end v.Source = code print(code) end end end) end }}} 바이러스를 찾는 방법은 대표적으로 다음과 같다. * 파트 내부를 작은 블럭 하나하나까지 뒤져보거나 "RotateP","RotateV","Fire","Weld"로 익스플로러에 검색한다. 그리고 그 안에 괴상한 이름을 가진 스크립트가 있다면, 절대다수가 바이러스다. Fire의 경우에는 횃불같은 의도한 불이면 바이러스가 아니지만, 전혀 불이 안들어갈만한 장소에 전혀 드러나지 않는 불이 있다면 무조건 바이러스성 불이니 바로 지우자. * Ctrl+Shift+F로 전체 스크립트를 검색해 getfenv, require, loadstring를 검색하자. require의 경우에는 A-chassis tune이나 Kohl's Admin 같은 많은 정상 스크립트가 이용해서 무턱대고 지우지 말고 좀 이상한 것을 찾자. 만약 의도하지 않은 스크립트라면 대부분이 '''백도어'''다. getfenv나 loadstring은 대다수가 백도어다. 과감히 지우자. * 너무 많거나 귀찮다면 플러그인에 Ro-Defender를 설치하여 렉 유발 바이러스를 없애주면 된다. 스크립트 내용이나 방식, 이름[*주의 virus같은 이름이 붙어있으면 지워버리기 때문에, 멀쩡한 모델같은것에 그런 이름을 붙여두면 같이 날아가버리는 참사가 발생한다.]같은걸 찾아서 대부분은 확실하게 없애주지만 간혹 놓치는것도 있으니 꼼꼼히 찾자. * 구매 유도 바이러스의 경우에는 PromptPurchase , MarketplaceService 를 전체검색으로 찾아보자. 첫 줄에 '''local wat='''이 있으면 이게 구매 유도 바이러스다! * 스크립트 이름이 검은 마름모 안에 물음표가 들어있는 기호[* [[�]]]가 도배된 것을 발견한다면 바이러스니 지우자. 이 기호는 유니코드 오류 시 뜨는 기호이기 때문에 검색에서도 뜨지 않으니 주의하자. === Terrain === 지형이 자연스럽게 다듬어지지 않을때가 있다. 위 문제는 23일자 업데이트로 거의 해결되었다. (물이 닿는 해안선의 지형이 자연스럽게 연결된다.) === 실행 관련 === [[파일:1654156364894.png]] 현재 일부 유저들에게 파일이 손상되었다면서 다시 깔으라고 한다. 하지만 다시까는것을 반복해도 안되고 있다.[* 6월 2일 기준 월요일까지만 해도 잘됐다.] 여러사람들이 겪고 있는걸 보면 이는 개개인의 문제가 아닌 서버상의 문제이거나 툴 자체에 뭔가 문제가 생긴것일 가능성이 높다. 하지만 우클릭 후, 관리자 권한으로 실행할 시에는 잘 작동한다. == 스크립트 == [[http://wiki.roblox.com/?title=Scripting|로블록스 Scripting 페이지(영문)]] 스크립트를 이용하여 각종 시스템이나 효과를 만들 수 있다. Roblox Studio의 스크립트 기능은 Lua 5.1을 기반으로 만든 Luau를 사용하고 있다. '프로그래밍 루아'라는 이름의 서적이 한국어로 번역되어 있으니 Lua 스크립팅을 공부하고 싶다면 관련 서적을 읽어보는 것도 좋다.[* 아니면 Lua 5.1 사이트를 들어가서 볼 수 있다.] === 스크립트 종류 === 로블록스에는 총 3개의 스크립트 종류들이 있다. ==== 로컬 스크립트 ==== '''로컬 스크립트''' '''[Local Script]''' 서버가 아닌 로컬[* 개인 컴퓨터]에서 구동 되는 스크립트다.[* 그렇기에 game.Players.LocalPlayer를 통해서 해당 로컬 스크립트가 구동중인 플레이어 값을 구할 수 있다] 로컬 스크립트에서 변동 된 항목들을 개인에게만 적용 되며, 모든 물리 연산은 개인 컴퓨터에서 계산 된다. [* 그러므로 대부분의 서버 측 처리가 불필요한 상황에서는 서버 렉 감소를 위해 로컬스크립트를 사용하는게 효율적이다.] 로컬 스크립트는 당연히도 클라이언트 측에서 작동되는 스크립트 이므로 클라이언트와 관련된 개체 밑에서만 작동을 한다. [* 예로 gui, player, character 안에서 작동이 된다.] 또한 로컬스크립트에서만 작동되는 서비스나 이벤트들이 있는데, 플레이어의 입력을 감지하는 UserInputService 와 함수가 프레임 마다 실행될수 있게 하는 RenderStepped 이벤트, 등이 있다. ==== 서버 스크립트 ==== '''서버 스크립트''' '''[Server Script]''' 거의 스크립트들의 기본값이라 봐도 무방. 서버에서 연동 되는 스크립트다. 로컬이 아닌 서버에서 모든 연산 및 물리 계산을 하기 때문에 개인 컴퓨터의 사양에 영향을 안받는다. 서버 스크립트에서 변동 된 항목들을 모든 플레이어에게 적용이 된다. 서버 스크립트는 로컬 스크립트와는 다르게 모든곳에서 작동 된다.[* 하지만 특정 플레이어에게만 적용을 원할 경우 로컬 스크립트를 쓰는게 사실상 필수다] ==== 모듈 스크립트 ==== '''모듈 스크립트''' '''[Module Script]''' 반복적인 코드들을 정리하고 재사용 할수 있게 하는 특별한 류의 스크립트이다. 모듈 스크립트는 기본적으로 테이블 형태로 되어있어 자동적으로 실행되지 않는다. 또한 서버와 로컬 공용으로 쓰이며 호환되지는 않는다. 모듈 스크립트 자체가 정적이라 특별한 이유없이는 잘 쓰이지 않았지만, 메타테이블 이라는 테이블을 클래스화 시켜주는 방법이 등장함으로써 모듈 스크립트도 동적으로 사용이 가능해졌고 사용률도 훨씬 올랐다. 다음은 모듈 스크립트의 기본 사용예제이다. {{{#!folding [ 모듈 스크립트 사용 예시 ] {{{#!syntax lua --모듈 스크립트 local module = {} module.a = 1 function module.b() print("b") end function module:c() print("c") end return module -- 모듈 스크립트는 값을 반환해야함. --서버 or 로컬 스크립트 local module = require(모듈_경로) -- 모듈 볼러오기 print(module.a) -- 1 출력 module.b() -- b 출력 module:c() -- c 출력 }}}}}} === 자주 쓰이는 함수와 명령 === 많이 쓰이는 함수와 명령 목록은 이렇다. * wait(숫자) = (숫자)초만큼 기다린다.[* 물론 완전 정확한건 아니고 오차는 있다. 그리고 최소가 좀 높아 느리므로 서버의 속도에 맞춘 wait를 사용하고 싶으면 task.wait를 사용하자.][* 괄호 안에 아무것도 안넣으면 기본값으로 1초를 기다린다] * print(문자열) = 문자열을 Console에 출력한다[* 사실 디버깅할때 말고는 별로 쓸모가 없다.] * end = 조건문이나 반복문, 함수를 끝낸다. * while 조건 do = 조건이 계속 충족되는 한 계속 실행한다. [* 하지만 이것만 사용하면 대부분 과부하가 되니 중간에 wait()을 넣어주자.] - 이때 while true do를 하면 게임이 시작되는 순간부터 끝날 때까지 계속 실행한다.[* while true do를 사용시 스튜디오와 게임 과부화가 심하게 될 정도로 반복 하니 while wait() do 처럼 변환해서 사용하자.] - while 조건 do를 치고 엔터를 누르면 아래에 Tab키를 눌렀을 때만큼의 띄어쓰기가 되어 있고 끝에 End가 자동으로 붙는다. * for i = val1, val2, val3 do = 조금 복잡하다. 간단히 요약하면, i가 처음 시작하는 수가 val1이고, 한번 반복하면 i가 val3씩 늘어난다. for 반복문은 i가 val2보다 큰지 계속 검사하여, 만약 i가 val2보다 크면 반복문을 빠져나간다. [* 이것 역시도 제일 끝에 wait()를 넣어주자. 아니면 과부하가 걸린다.] * for i, v in ipairs(배열) do = for i = val의 상위버전, 배열의 i 번째 개체를 자동으로 변수 v로 치환해주는거다. 이거를 이용하여 모델에 스크립트 하나만 넣어 모델의 어느 파트에만 닿아도 죽게 만들 수 있다. {{{#!folding [ 스크립트 예시 펼치기 · 접기 ] * 아무 파트나 닿으면 죽는 모델 스크립트 {{{#!syntax lua local Cooldown = false --쿨다운 변수 만드는 부분 local Model = script.Parent:GetDescendants() -- 모델 지정후 모델의 모든 개체 지정 local parts = {} -- 빈 배열 생성(파트들을 담기위한 배열) for a=1, #Model do if Model[a]:IsA("BasePart") then table.insert(Model[a], parts) end end for i, v in ipairs(parts) do v.Touched:Connect(function(part) if part.Parent:FindFirstChild("Humanoid") and Cooldown == false then Cooldown = true local humanoid = part.Parent:FindFirstChild("Humanoid") humanoid.Health = 0 task.wait(1) Cooldown = false end end end }}} }}} * if 조건 then = 만약 조건이 충족되면 안에 있는걸 실행한다. - (숫자) = (숫자) 로 조건을 쓰면 오류 난다.[* 등호 하나는 앞의 값에 뒤의 값을 덮어쓰겠다는 뜻이다.] 같은지 비교할 땐 (숫자) == (숫자) 를 쓰도록 하자. * repeat wait(숫자) until 조건 = 조건일 때 까지 계속 반복한다. - 이것도 조건에서 (숫자) == (숫자)와 같이 써야된다. === 자료형 === 로블록스에는 수많은 자료형들이 있지만 그 많은 자료형중 몇몇만 자주 사용된다. 많이 쓰이는 자료형 목록은 이렇다. * boolean (참/거짓) * nil (아무것도 없는 값 [* 타 언어의 null 과 같다.]) * number (숫자) * string (문자열) * table (테이블 [* 다차원 테이블(테이블 안에 있는 테이블)도 가능하며 key-value 형의 딕셔너리(for i, v in ipairs(테이블) do)도 가능하다.][*주의할점 [[Lua|루아 스크립트]]에서는 테이블의 번호를 1번 부터 샌다.]) * Instance (개체 [* 스튜디오에서 만들수 있는 대부분의 것들이라고 봐도 무방하다.]) * script (스크립트 [* 사실상 스크립트도 자료형이다. 이 자료형은 스크립트 개체를 가르킨다.]) * Vector3 (3차원 위치 단위 [* 로블록스에서 CFrame 과 함께 위치를 나타내는 단위이다.]) * CFrame (Vector3 처럼 위치를 나타내는 스크립트지만 CFrame은 개체의 피펏의 기준으로 한다.] * Color3 (색) * Udim2 (2차원 위치 단위 [* gui 상에서 많이 사용된다.]) * Enum (거의 모든 자료형의 담고있는 자료) === 이벤트 === ==== BasePart[* 파트, 웨지, 메시 등 로블록스의 모든 밟을수 있는 것들을 포함한 넓은 개념이다.] 관련 ==== * BasePart 개체.Touched : 플레이어가 닿았을때 상호작용하는 이벤트. 쿨다운을 설정 안하면 한번에 여러번 호출되니 조심. 인자엔 닿은 개체가 들어온다. {{{#!folding [ 스크립트 예시 펼치기 · 접기 ] * 닿으면 죽는 KillPart 스크립트 {{{#!syntax lua local Cooldown = false --쿨다운 변수 만드는 부분 script.Parent.Touched:Connect(function(hit) local Humanoid = hit.Parent:FindFirstChild("Humanoid") --변수 만드는 부분 if Humanoid and not Cooldown then --휴머노이드 개체가 있는지 확인하는 부분 + 쿨다운이 아닌지 확인하는 부분 Cooldown = true Humanoid.Health = 0 --닿은 플레이어의 체력 wait(1) --1초 기다림 Cooldown = false end end) }}} }}} * BasePart 개체.TouchEnded : Touched의 반대로 플레이어가 더이상 닿지 않을 때 상호작용하는 이벤트.이것도 쿨다운을 설정 안하면 한번에 여러번 호출되니 조심. 인자엔 더이상 닿지 않는 개체가 들어온다. {{{#!folding [ 스크립트 예시 펼치기 · 접기 ] * 더이상 닿지 않을 때 죽는 스크립트(Touched 예시 스크립트에서 이벤트만 바꾼 버전이다) {{{#!syntax lua local Cooldown = false --쿨다운 변수 만드는 부분 script.Parent.TouchEnded:Connect(function(hit) local Humanoid = hit.Parent:FindFirstChild("Humanoid") --변수 만드는 부분 if Humanoid and not Cooldown then --휴머노이드 개체가 있는지 확인하는 부분 + 쿨다운이 아닌지 확인하는 부분 Cooldown = true Humanoid.Health = 0 --닿은 플레이어의 체력 wait(1) --1초 기다림 Cooldown = false end end) }}} }}} ==== Players 관련 ==== * Players 개체.PlayerAdded : 플레이어가 들어왔을때 호출되는 이벤트. 인트로나 로딩 화면에 이용된다. 인자엔 들어온 플레이어 개체가 들어온다. {{{#!folding [ 스크립트 예시 펼치기 · 접기 ] * 플레이어가 게임을 들어왔을때 플레이어 ID를 출력하는 스크립트 {{{#!syntax lua game.Players.PlayerAdded:Connect(function(plr) print(plr.."님이 게임에 참여했습니다.") end) }}}}}} * Players 개체.PlayerRemoved : 플레이어가 나갔을때 호출된다. 인자엔 나간 플레이어 이름이 들어온다. {{{#!folding [ 스크립트 예시 펼치기 · 접기 ] * 플레이어가 나갔을때 플레이어 ID를 출력하는 스크립트 {{{#!syntax lua game.Players.PlayerRemoved:Connect(function(plr) print(plr.."님이 게임을 나갔습니다.") end) }}}}}} ==== ProximityPrompt 관련 ==== * ProximityPrompt 개체.Triggerd : ProximityPrompt 개체가 있고, 그 개체를 상호작용 했을때 호출되는 이벤트, 인자에는 플레이어가 들어온다. {{{#!folding [ 스크립트 예시 펼치기 · 접기 ] * 상호작용 키를 끝까지 눌러서 상호작용이 되었을때 몬구 출력 {{{#!syntax lua script.Parent.Triggerd:Connect(function(plr) --plr에는 해당 ProxximityPrompt를 상호작용을 한 플레이어가 들어온다 print(plr.." Triggered ProximityPrompt!") --상호작용한 플레이어의 이름과 함께 상호작용했다는 몬구 출력 end) }}}}}} * ProximityPrompt 개체.PromptButtonHoldBegan : 상호작용 키가 눌리기 시작했을때 호출 되는 이벤트. {{{#!folding [ 스크립트 예시 펼치기 · 접기] {{{#!syntax lua ProximityPrompt.PromptButtonHoldBegan:Connect(function() --괄호 안에는 누가 상호작용하기 시작했는지 출력 된다 print("Proximity Input has been began") --상호작용 키가 눌리기 시작했다는 몬구 출력 end) }}}}}} ==== Gui 관련 ==== * GuiButton 개체.MouseButton1Click : 모바일에서 Gui버튼을 누르거나 마우스로[* 좌클릭만 해당] Gui버튼을 누를때 호출 되는 이벤트. {{{#!folding [ 스크립트 예시 펼치기 · 접기] {{{#!syntax lua GuiButton 개체.MouseButton1Click:Connect(function() print("좌클릭이 감지 됐습니다!") --버튼을 좌클릭했다는 몬구 출력 end) }}}}}} * GuiButton 개체.MouseButton2Click : 유저의 마우스가 버튼 위에서 우클릭을 했을때 호출 되는 이벤트. {{{#!folding [ 스크립트 예시 펼치기 · 접기] {{{#!syntax lua GuiButton 개체.MouseButton2Click:Connect(function() print("우클릭이 감지 됐습니다!") --버튼을 우클릭했다는 몬구 출력 end) }}}}}} ==== 모든 개체 공통 ==== * 개체.AttributeChanged : 개체의 속성이 변경되었을 때 작동되는 이벤트. 인자엔 바뀐 속성이 들어온다. * 개체.Changed : AttributeChanged와 비슷한 개체의 속성이 변경되었을 때 작동되는 이벤트. 하지만 몇몇 속성에는 작동되지 않고 Value 개체는 무조건 Value의 값만 바뀌었을때 작동된다. 인자엔 바뀐 속성이 들어온다. * 개체.AncestryChanged : 개체의 Parent가 변경되었을 때 작동되는 이벤트. 인자엔 개체와 바뀐 Parent가 들어온다. {{{#!folding [ 스크립트 예시 펼치기 · 접기 ] * 스크립트의 Parent가 바뀌면 출력에 프린트하는 스크립트 {{{#!syntax lua script.AncestryChanged:Connect(function(Child, Parent) print(Child.Name .. "의 Parent는 이제" .. Parent.Name .. "입니다.") end) }}} }}} ==== 기타 ==== * Clickdetector 개체.MouseClicked : Clickdetector 개체가 있는 파트를 클릭했을때 호출하는 이벤트. 버튼을 만들때 활용한다. 인자엔 누른 플레이어가 들어온다. === 메서드 === * 개체:Destroy() : 개체를 삭제시킨다.[* 사실상 삭제가 아닌 개체의 Parent를 nil 값으로 변경해서 못찾게하는거지만, 그냥 편하게 삭제 시킨다고 보면 된다] * 개체:Clone() : 개체를 복사한다. * 개체:ClearAllChildren() : 개체의 모든 Children을 삭제시킨다. * 개체:GetChildren() : 개체의 모든 Child를 테이블에 담아 반환한다. * 개체:GetDescendants() : 개체 안에 있는 모든 개체를 선택해 테이블에 담아 잔환해준다.[* GetChildren의 상위호환이라고 보면 된다] * 개체:FindFirstAncestor(찾을 개체명) : 개체의 Parent중 찾을 개체명이랑 똑같은 이름을 가진 Parent를 반환한다. * 개체:FindFirstChild(찾을 개체명) : 개체의 Child중 찾을 개체명이랑 똑같은 이름을 가진 Child가 있을 경우 Child를, 없을 경우 nil을 반환한다. * 개체:FindFirstChildOfClass(찾을 개체의 ClassName) : 찾을 개체를 각 개체만의 고유의 ClassName으로 찾는다. * 개체:WatForChild(찾을 개체명) : FindFirstChild와 비슷하지만 이건 Child가 없으면 있을때까지 기다린다. * game:GetService("서비스 이름") : 게임 안에 있는 서비스를 사용 할 수 있게 해주는 명령어다. {{{#!folding [ 서비스 목록 펼치기 · 접기 ] * Debris 서비스 : 개체를 시간차를 주고 삭제시키는 서비스다. 그냥 wait을 한 다음 destroy를 하는것도 있지 않나 생각 할 수 있지만, 이 서비스는 스레드를 기다리게 만들지 않는다. * MarketplaceService 서비스 : 마켓플레이스 관련 서비스 * TweenService 서비스 : 파트, Gui, 카메라등을 부드럽게 움직이거나, 값에 숫자가 필요한 속성(Position, Orientation, Color, Size 등)을 자연스럽개 변경 할 수 있게 해주는 서비스다. * BadgeService 서비스 : 베지 관련 서비스다. * UserInputService 서비스 : 클라이언트의 기기에서 키보드를 누르거나 마우스를 클릭하는등 클라이언트의 기기에서 할 수 있는 것을 가져와주는 서비스다.[* 클라이언트의 기기라고 하였으므로 로컬스크립트에만 넣어야 한다. 서버는 마우스를 누르거나 키보드를 누를수 없다.] * RunService 서비스 : 플레이어가 스튜디오에서 플레이하는지 아니면 로블록스 게임으로 플레이 하는지와 프레임마다 이벤트를 보내는 서비스다. {{{#!folding [ 스크립트 예시 펼치기 · 접기 ] * 플레이어가 어디에서 플레이하는지 감지하는 스크립트[* 당연하겠지만 이거는 플레이어가 어디서 플레이 하는지에 관한 것이기 때문에 로컬스크립트에서만 싸야 한다.] {{{#!syntax lua if game:GetService("RunService").IsA("Studio") then print("스튜디오에서 플레이중...") else print("로블록스에서 플레이중...") end }}} * 프레임마다 파트색이 바끼게 하는 스크립트 * 서버인 경우 {{{#!syntax lua local Part = workspace.Part game:GetService("RunService").Stepped:Connect(function() Part.Color += Color.new(0.1,0.1,0.1) end) }}} * 클라이언트인 경우 {{{#!syntax lua local Part = workspace.Part game:GetService("RunService").RenderStepped:Connect(function(frame) Part.Color += Color.new(6/frame, 6/frame, 6/frame) end) }}}}}} 이 외에도 여러 가지 서비스가 존재한다. }}} * BasePart 개체 또는 모델:MoveTo() : BasePart 개체 또는 모델을 저 괄호 안에다가 적은 포지션으로 이동시켜주는 코드다. 하지만 이동시킬 위치에 이미 무언가 있다면 이미 있는 개체 위로 이동된다. * BasePart 개체 또는 모델:PivotTo() : BasePart 개체 또는 모델을 저 괄호 안에다가 적은 CFrame으로 이동시켜주는 코드다. MoveTo와 다르게 이동시킬 위치에 이미 무언가 있어도 그냥 이미 있는 개체를 무시하고 적은 CFrame으로 이동하는 코드다. CFrame으로 개체를 이동시킬때는 CFrame을 곱해서 그 개체의 피펏을 기준으로 움직이게 할 수 있다. == 플러그인 == 로블록스 스튜디오를 개발해주는 데 도움을 주는 각종 플러그인이 있다. Brick Cutter나 Animation Editor Classic등 편리한 제작 도구부터 바이러스를 막는데 특화된 Ro-Defender 등 각종 도구가 있다. 이 역시 악성 유저들이 각종 '''Lua 백도어'''를 설치하는 악성 플러그인을 봇팅을 통해 상단으로 올려놓고 설치를 유도하는 경우도 있다. 플러그인을 설치할 때도 조심해야 한다. == 개발 팁 == 이하는 로블록스 스튜디오로 게임을 개발할 때 도움이 되는 정보들이다. * 여러 파트를 하나의 오브젝트로 합치거나 일반 파트를 무효화 시켜서 만든 Negative 파트와 일반 파트를 통합 하여 블렌더와 같은 어려운 모델링 프로그램을 쓰지 않고 간단하게 블록을 자르거나 붙여서 모양을 낼수가 있다. * 블렌더와 같은 3D 모델링 프로그램을 사용해 CSG로 구현이 어려운 모델을 만들수 있다. [* 단, 메쉬의 트라이가 5,000 트라이 미만이여야 로블록스로 불러올 수 있다. 또한, 계정에 등록된 생년월일 기준으로 13세 미만일 시, 메쉬가 정상적으로 불러와지지 않을 수 있다.] * 총을 사용하고 싶다면 서버 단위로 작동하는, 즉 타 플레이어의 시점에서 자신이 쓰는 여러 기능이 반영되는 총 킷을 쓰자. 대표적으로 FE gun kit, Warbound[* 약칭 WB, 아르마 시리즈를 참고해 만들어진 시스템이며 R6 캐릭터를 사용할 때에만 작동한다. 대다수의 모델은 스크립트의 노후화로 각종 버그(예를 들어서 마우스 포인터가 없어진다거나)가 있으며 후술할 여러 모델들의 모태가 되었다.],OTS gun System[* 유명 SCP 게임들이 쓰는 건킷이지만 버그도 많고 불안정하다], ACS[* Advanced Combat System 의 약자, 아르마 시리즈와 이스케이프 프롬 타르코브를 참고해 만들어진 시스템이다. 최신형인 1.8 및 2.0을 제외하면 R6 형태의 캐릭터를 사용할 때에만 작동한다. ACS 2.0.1는 R6이니 주의하자.], Murnau, VE[* Vanguard Engine의 약자, Warbound의 공식 후계이다. 사실상 ACS의 하위호환이라 볼 수 있다.], BCWS[* ACS를 참고해 모 유저가 직접 R15 캐릭터가 호환되도록 만든 시스템. 오리지널 ACS에는 없는 여러 기능이 있다.], VIETHIN[* 현대전 총들도 있지만 많은 총들이 머스킷 등 옛날 총들이 있으며 주로 중세 시대 전쟁이나 조선시대 같은 전쟁 게임을 만들때 많이 사용된다.], RCM[* ACS의 개선판으로 매우 많은 버그들이 수정되었고 총기에 따른 속도 감속이나 커스텀하기 쉬운 파티클 제작 등 기능들이 추가 된 버전이다.] 등이 있다. 정 맘에 안들거나 불안하면 직접 키트를 만드는 것도 좋다. 대부분의 메이저 FPS 게임들은 직접 제작한 키트를 사용한다. 그리고 문제점으로 인식되는 부대겜 등에서 사용해서 인식이 안좋다. 요즘에는 공식적으로 배포하는 총 시리즈와 툴이 있는듯. * Loadlibrary 스크립트는 더 이상 사용되지 않으며 삭제되었다. 이를 쓰는 개발자는 [[https://devforum.roblox.com/t/loadlibrary-is-going-to-be-removed-on-february-3rd/382516|Loadlibrary 대체방법(영문)]]을 참고해서 대체하면 된다. *이것도 플러그인의 일종인데 F3x building 플러그인을 사용하면 메시를 쉽게 적용시켜줄수 있다. *만약 전쟁게임을 만들고 싶다면 Wolfenchan 도 사용해보는것도 좋다. Wolfenchan은 주로 탱크 , 포 같은걸 고퀄로 적용시켜주는 시스템이다. 적용법은 유튜브에 간단히 나와있으니 한번 사용해봐도 좋다. *일부 툴박스에서 로블록스 모델중에서 유출모델이 섞여서 배포되는일이 있다. 여기서 유출모델이라는것은 사람들이 돈주고 구매한 모델들을 허락도없이 무단으로 배포하는 행동이다.[* 보통 이런 경우는 [[Discord]] 같은 곳에서 무단으로 거래가 이루어진다. Roblox에서는 Roblox 내의 거래 시스템을 제외한 모든 플레이어간의 거래를 금지하고 있다. 즉, 모델을 구매하는 것은 규정 위반이다.] 특히 차량같은 모델들은 비싼돈을 주고 사이트나 사람들한테 3D모델을 구매해와서 [[제작]]하는것이기에 비싼돈주고산 차량이 제 3자한테 양도되는것이 썩 좋은 행동은 아니다. 이 행동은 차량을 제작하는 사람에게는 매우 해를 끼치는 행동이므로 유출모델을 쓰지도 유출모델을 만들어내지도 않는게 좋을것이다. --뒷감당은 본인이 해야한다-- --근데 Roblox studio는 모든 모델이 무료로 배포되는거아닌가-- *--이제 표면은 없어졌으니 괜히 찾다가 시간 날리지 말자.--[* 사실, GUI에만 없어진거지 스크립트로 불러올 순 있다.] *자동차 등에 반사가 예쁘게 되는걸 원하면 스카이박스의 바닥을 검은 이미지로 바꿔보자. *로블록스에서 기본으로 제공해주는 색이 안좋다면, 속성의 Color3을 사용해보자.--사실 이건 진짜 초보빼고 거의 다안다-- *로블록스 캐릭터의 팔이나 신체부위, 캐릭터 이외의 오브젝트들의 회전축을 바꾸고 싶다면 피벗 편집을 사용해보자. *if 조건문은 elseif로 무한대 연장이 가능하다.[* 한글로 치면 만약 ㅇㅇ이 6 이면 ㅇㅇ을 해라. 아니라면 ㅇㅇ을 해라. 아니라면 ㅇㅇ을 해라. 아니라면 ㅇㅇ을 해라. 아니라면 ㅇㅇ을 해라.... ] *보통 개체를 움직일때 CFrame이나 position을 반복해 부드러운 움직임을 연출하는데. 이런 더 부드러운 움직임을 원한다면 Renderstepped 서비스를 이용해보자. 이것도 성에 차지 않는다면 TweenService를 사용해보자.[*유튜브 유튜브에 적용법이 나온다.] *최근 AI 스크립팅 기능이 추가되어 굳이 어려운 스크립트를 작성하는 법을 알기 위해 유튜브를 뒤져야 하는 수고가 없어졌다. 단 아직 초기 단계이므로 너무 좋은 성능은 기대하지 않는 것이 좋다. 그리고 [[한국어]] 지원도 해주지만 아직은 [[영어]]가 더 정확도가 높다.[* --을 사용해 주석을 치고 원하는 내용을 적고 Alt+\를 누르면 된다. 스크립트를 쓰다가 기다리면 자동으로 추천해주기도 한다. Tab으로 추천된 코드를 완성시킬 수 있다.] *도구 상자(프리모델) 탭에서 오른쪽 화살표를 누르고 동그라미에 벽돌,유리가 있는것을 클릭하고 마음에 드는 벽,바닥,천장등 재질을 골라 클릭하면 표면에 추가된다.