ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 로블록스 텔레포트
    로블록스/첫 프로젝트

    안녕하세요.

     

    이번 글에서는 텔레포트를 관련해서 다룰려고 합니다.

     

    이 기능.. 멀티 테스트를 하기 전까지 약간(?) 많은.. 시행착오가 있던 작업 인데요.

     

     

    결과적으로 먼저 말씀 드리자면

     

    첫번째로 동기화 문제.

     

    두번째로 코드의 모호성 문제.

     

    입니다.

     


     

    글을 작성해 나가면서 하나씩 살펴 보겠습니다.

     

     

    다음과 같이 맵을 구성했습니다.

     

    캐릭터가 처음 스폰될 위치는 LobbyZone

     

    플레이어가 게임을 즐길 공간은 GameZone 으로 하였습니다.

     


     

    다음은 GameZone으로 이동할 텔레포트 Part와 스폰 위치가 될 GameZonSpawn 을 만들었습니다.

     

     

    여기서 초기 로블록스 스튜디오를 R&D 하고 바로 코드작업을 들어갔을때는

     

    로컬 스크립트에 작성을 하였습니다.

     

     

    단순히 혼자 하는거면 로컬

     

    여려명이 적용되하면 서버 라는 생각만 갖고 있었습니다.

     


     

    로컬 스크립트에서 현재 플레이어의 CFrame(Position) 을 이동하는 코드였기에

     

    혼자 테스트를 할 땐 별 문제 없이 잘 되었습니다.

     

     

    하지만 문제는 멀티 테스트에 있었습니다.

     

    제 클라이언트에서는 잘 이동을 하던 플레이어가

     

    상대방의 컴퓨터에서는 멈춰 있는것 이였는데요.

     

     

    일단 여기서 간과하던 사실은, 플레이어를 이동하는 로직 등 관련은

     

    서버측에서 관리를 해야지 다른 유저 에게도 동기화가 되어 보이게 된다는점 이였습니다.

     


     

    그리하여 첫번째 선택했던 방식이, 플레이어가 Teleport 라는 Touch 이벤트가 연결된 오브젝트에 닿게 되면

     

    서버로 신호를 보내고 

     

    그 서버 스크립트에서 다시 클라이언트로 신호를 보내 사용하는 방법이였습니다.

     

     

    1. 로컬에서 서버로 신호를 보낼땐 FireServer를 사용합니다.

     

    2. 로컬과 서버의 통신을 위해서 RemoteEvent를 사용합니다.

     

    3. 서버에서 다시 클라이언트로 신호를 보낼땐 FireClient를 사용합니다.

     

    여기서 첫번째 문제.

     

    로컬에서 서버로 신호를 보낼때의 로컬 플레이어와, 다시 서버로 신호를 받아 동작하는 Player가 무조건 일치하리란 증명이 되지 않았습니다.

     

    물론 단순히 로컬 스크립트에서 사용하는거니 그 플레이어가 같은 플레이이어 이지 않을까? 라고 생각은 들었지만

     

    누군가를 설득 하기엔 제 지식과 경험이 부족했습니다.

     

     

    또한 멀티 상태로 이루어져 정상적인 동작이 아닌 이것저것 조작이 이루어질 것을 미리 방지하여 "명확성" 이 필요했습니다.

     

    그리하여 두번째 방법

     

    replicatedStorage에 있는 TeleportEvent를 받아 옵니다. (과정은 동일합니다.)

     

    이 후

     

    FireServer 로 서버로 신호를 보낼때

    플레이어를 인자로 보내 줍니다.

     

    다음 서버에서는 OnServerEvent로 신호를 받고 다시 FireClient로 클라이언트에게 신호를 보내 줍니다.

     

    여기서 알아야 할 것은 FireClient의 인자에 Player가 두번 들어간다는것 입니다.

     

    첫번째 인자의 Player는 대상을 지정하기 위한 인자입니다. 즉 FireClient가 호출될 때 어떤 클라이언트에 이벤트를 보내는지 지정해 줍니다.

     

    그렇다면 2번째 인자는 무엇일까요?

     

    전달할 데이터입니다. 즉 이벤트 수신 시 클라이언트에서 플레이어 정보를 사용할 수 있도록 서버에서 전달하는 추가인자라고 보시면 됩니다.

     

    이제 이 신호를 클라이언트에서 OnClientEvent로 신호를 받고 받은 player 인자를 사용하면 동일한 서버로 신호를 보낸 현재 해당 로컬 플레이어의 데이터를 그대로 사용할 수 있는것입니다.

     


     

     

    근데 텔레포트할 공간이 하나 둘 늘어나다 보니깐 뭔가 비효율적임을 느꼈습니다.

     

    굳이 로컬에서 서버에 신호를 보낸뒤, 다시 서버에서 로컬로 신호를 보내고, 로컬에서 이를 사용해야 할 까?

     

     

    그리하여 최종적으로 변형된 상태는 다음과 같습니다.

     

    1. 서버 스크립트에서 Touch 이벤트를 받는다.

     

    2. GetPlayerFromCharacter를 사용하여 Hit된 해당 캐릭터와 연결된 Player 객체를 반환한다.

     

    3. plr 지정과, 데이터를 인자로 보내 줍니다.

     

     

    4. 클라이언트에선 OnClientEvent를 활용하여 plr을 사용해 주면 끝이였습니다.

     

    서버측에서 관리하기에 동기화도 살리고 명확성도 살리는 방식으로 진화 했습니다.

     


     

     

    그렇다면 현재 이러한 구성에서, 처음부터 텔레포트가 되는 구현을 작성해 보도록 하겠습니다.

     

    가장 먼저

    ReplicatedStorage 하위에 Teleport 이벤트와

     

    ServerScriptService 하위에 Teleport 서버 스크립트를 생성해 주었습니다.

     

    Teleport 서버 스크립트를 작성해 보겠습니다.

     

    먼저

     

    로컬 - 서버 연결을 도와줄 이벤트를 받아왔습니다.

     

     

    다음은 workspace 하위에 teleportPart를 받아와 Touched 이벤트를 연결시켜 주었습니다.

     

    뒤에 Connecnt는 뒤에 인자를 연결한다는 의미입니다.

     

    즉 function(hit)가 연결이 되었고

     

    터치가 진행 되면 함수 내부의 부분이 실행 되는것입니다.

     

    마찬가지로 FireClient의 지정과 데이터로 인자를 2개 전달해 주었습니다.

     


    마지막으로!

     

    로컬 스크립트에서 코드를 작성해 주었습니다.

     

    서버에서 받은 신호를 OnClientEvent로 받아서 plr을 사용하고

     

    HumanoidRootPart의 CFrame을 gameZonSpawn.Position으로 이동시켜 주는 코드입니다.

     


     

     

    어찌보면 상당히 간단한 구현인데, 어찌보면 가장 중요한 개념을 알게 되는 부분이라고도 할 수 있겠습니다.

     

     

    뭐든지 코드를 작성하는데 정답은 없지만, 약간의 시행착오를 겪고 현재 저는 이러한 방식으로 사용하고 있습니다.

     


     

    한가지 더 여러 문서를 찾아보다가 알게된건데

     

    로블록스의 Touch 이벤트 같은 경우는 로컬에서 작성을 했다 하더라도 서버측에서 관리가 된다고 합니다.

     

    또한 해당 로컬 플레이어를 명확히 지정해 주지않으면

     

    저처럼... 유저 한명이 텔레포트를 했는데 5명이 한꺼번에 이동되는 불상사가 발생할 수도 있습니다..

     

     

    뭐 가장 좋은건 직접 겪어보는거겠지만 ㅎㅎ

     

     

    오늘은 이만 마치도록 하겠습니다.

     

    감사합니다.

     

    '로블록스 > 첫 프로젝트' 카테고리의 다른 글

    로블록스 데이터 저장  (0) 2024.11.11
    로브록스 재미 요소 추가  (0) 2024.11.11
    로블록스 루아 스크립트  (0) 2024.11.05
    로블록스 스튜디오 작업공간  (0) 2024.11.02
    로블록스  (0) 2024.11.01

    댓글

김효겸 / Tel. 010-7735-0580 / E-mail. dollzzang2@hanmail.net