[UGDG 사랑] 유니티+MagicOnio+Docker에서 미니어처 RTA를 혼자 만들어요.

개시하다
이 글은 Unity 게임 개발자 협회 Advent Calendar 2021 14일째 되는 글이다.
어제는 Seaees 모뎀과 같은 한 해를 되돌아보다!
메리 크리스마스!여러분 유닛이에요?
이번에는 Docker든 Magic Onion이든 서버 쪽에서 경험이 없던 제가 임진마총 지식으로 얼마나 간단한 서비스를 할 수 있는지 이런 게임을 적어봤습니다.RTA라고 하지만 누구와 경쟁하는 것도 아니고 서두르는 것도 아니다.자유자재로 혼자 하다.
기술적인 것도 쓰겠지만 이 기사에서 얻을 수 있는 게 많지 않다고 생각해서 양해부탁드립니다.
※ 다시 한 번 말씀드리지만, 서버, 통신, Docker 등의 경험이 없기 때문에 대추를 통째로 삼키지 마세요.
날과 씨
옛날에 대학 다닐 때 유니티 포톤(PUN2)을 배웠어요.
그리고 비슷한 시기에 친구가 RTA에서'스피드 버튼 웹 서비스 제작'을 했기 때문에 나도 유니티와 포톤에서 똑같은 일을 했다.

(위의 이미지는 RTA를 전송하는 모습입니다. 시간은 1시간 8분 11초입니다.)
그 외에도 금방 완성돼서 기분이 좋아서 RTA를 혼자 할까 말까 고민했어요.
목표로 삼다
  • 새로운 사물을 배우고 그것을 이용하여 작품을 창작한다
  • 제작 온라인(로컬 호스트) 네트워크
  • 예전에는 포톤을 썼는데 이번에는 매직온을 썼어요.
    그리고 Docker와 GCP로 온라인화할 수 없을 것 같아서 처음으로 Docker를 사용해 봤습니다.(GCP가 폐기되었기 때문에 로컬 호스트)
    만든 물건
    이것은 우리가 즉시 한 것이다.( https://github.com/euglenach/OnlineVote )
    (스팸코드를 대량 생산해 보여드리기가 쑥스럽습니다)
    연말이라 빨리 누르기 버튼 같은 놀 수 있는 도구를 만들려고 이번에 온라인 투표 애플리케이션을 만들었다.게임 같은 파티 게임을 해보고 싶어요.
    급하게 하는 건 아니지만 UI 같은 건 예뻐지고 싶은 생각은 전혀 없어요. 용서해 주세요...
    ①방 이름, 사용자 이름, 질문자 또는 답변자를 입력하여 방에 입장/제작

    ② 질문자가 질문과 옵션을 입력한다

    어쨌든 쉼표로 구분을 선택하면 최대 4개까지 로그인할 수 있다.
    ③ 응답자가 질문에 선택 버튼을 누른다

    ④ 질문자는 투표를 기다린다

    ⑤ 합계 버튼을 누르면 결과 표시

    네, 이번에 한 게 이거예요. 이것밖에 없어요.
    질문하고 설문조사 통계를 내는 것뿐이다.
    방법은 매우 간단하다.이 정도면 됐어.
    MagicOnion과 Docker를 사용할 수 있어서 만족합니다.
    결실
    시작 시간과 종료 시간은 다음 텍스트 파일에git를 작성하고 이 시간 안에 측정합니다.

    결과는...
    시작 시간 12월 12일 22시 14분.

    종료 시간 12월 13일 13시 28분.

    개개
    $\huge{>15 시간 14 분 읺$
    $\huge{ ̄Y ̄Y ̄Y ̄Y ̄Y ̄}$
    싫지 않아!!!무슨 말인지 모르겠어!!!!!!!!
    이런 거북이처럼 노르마의 이유가 됐어요.
  • 길어도 3시간 정도 걸린다고 생각하고 저녁 시작에 의외로 시간이 많이 걸렸고 몇 번 잠을 못 잤다
  • 중도 VALLORANT의 세계대회 결승전이 시작되었습니다. 저는 평범하게 보았습니다
  • 오랜만에 Vcontainer를 만지니까 혼란스러워
  • 한 곳, IObservable.Subscribe에 대한 AddTo가 진행되지 않은 것을 눈치채지 못하고 게임 순환에서 버그가 발생했다
  • 등등, 여러 가지 이유가 있지만 요즘은 취미가 전문적이지 않아서 자주 호명된다...
    AddTo를 잊어버렸어요. 습관적으로 Subscribe 뒤에 썼는데 왠지 한 군데만 안 써져요.몇 년을 건드려도 인간 오류가 발생하기 때문에 로슬린 애널리즈를 영입하기로 했다.사람이 잠을 자지 않으면 안 된다.
    컨디션
    다음은 기술적인 이야기입니다.
    클라이언트와 서버의 구축은 Unity + .NET Core+MagicOniov3 환경 구축의 글을 참고했다.감사합니다.
  • 클라이언트
  • Unity 2020.3.24f1
  • MagicOnion 3.0.12
  • MessagePack 2.1.152
  • gRPC 2.23.0
  • 서버
  • MagicOnion.Hosting 3.0.12
  • MagicOnion.Abstractions 3.0.12
  • MessagePack.UnityShims 2.1.152
  • MagicOnion.MSBuild.Tasks 3.0.12
  • MessagePack.MSBuild.Tasks 2.1.152
  • 클라이언트, 코드 공유, 서버는 모두git 창고에서 관리됩니다.

    MagicOnion 사용
    이번에 서버 코드를 거의 쓰지 않았지만 C#로 서버를 쓰는 전대미문의 경험을 할 수 있어서 감동적이었습니다.
    업무와 서버를 쓰겠다고 했지만 실시간 통신을 쓰지 않아 즐거웠다.
    처음 사용하는 거라 걸려 넘어질 때도 있어요.
    이 게임(시도)두 개의 통신을 대략적으로 나누어 쓰는 처리가 필요하다.
    일치 및 게임
    처음에는 서버든 클라이언트든 따로 썼어요.
    통신 클래스 일치
    class MatchingRPC : IMatchingReceiver{
        private IMatchingHub matchingHub;
        // 略...
    
    네트워킹 게임
    class QuestionRPC : IQuestionRecieiver{
        private IQuestionHub questionHub;
        // 略...
    
    그리고 서버에도 이런 반이 있어요.
    여러분들은 전문적인 매직온 튜브에 익숙하실 거라고 생각합니다.
    MacchingRPC 클래스와 통신하는 서버
    public class MatchingHub : StreamingHubBase<IMatchingHub,IMatchingHubReceiver>, IMatchingHub{
        IGroup room;
    
        // 略...
    
    QuestionRPC 클래스와 통신하는 서버
    public class QuestionHub : StreamingHubBase<IQuestionHub,IQuestionHubReceiver>, IQuestionHub{
        // 略...
    
    그러나 이렇게 하면 MatchingHub류만 알고 있다IGroupQuestionHub류는 접근할 수 없고 방송할 수 없다.이거 어떡해?나는 도중에 반드시 그것을 해결해야 한다는 것을 발견했다 (늦게)
    한두 시간쯤 어떻게 할지 생각했는데 해결이 안 돼서...결국 이 두 가지를 결합시키기로 했다.
    그리고 이런 StreamingHub/Receiver가 터졌어요...
    using System.Threading.Tasks;
    using MagicOnion;
    using ServerShared.MessagePackObjects;
    
    namespace ServerShared.StreamingHubs{
        public interface IGameHub : IStreamingHub<IGameHub,IGameReceiver>{
            /// <summary>
            /// ゲームに接続することをサーバに伝える
            /// </summary>
            Task JoinAsync(string roomName,Player player);
    
            /// <summary>
            /// ゲームから切断することをサーバに伝える
            /// </summary>
            Task LeaveAsync();
    
            /// <summary>
            /// 質問したことをサーバに伝える
            /// </summary>
            Task QuestionAsync(Question question,Player player);
    
            /// <summary>
            /// 選択肢を選んだことをサーバに伝える
            /// </summary>
            Task SelectAsync(int index,Player player);
    
            /// <summary>
            /// 集計結果をサーバに伝える
            /// </summary>
            Task ResultAsync(QuestionResult questionResults,Player player);
        }
    
        public interface IGameHubReceiver{
            /// <summary>
            /// 誰かがゲームに接続したことをクライアントに伝える
            /// </summary>
            void OnJoin(Player player);
    
            /// <summary>
            /// 誰かがゲームから切断したことをクライアントに伝える
            /// </summary>
            void OnLeave(Player player);
    
            /// <summary>
            /// 質問したことをクライアントに伝える
            /// </summary>
            void OnQuestion(Question question);
    
            /// <summary>
            /// 選択肢を選んだことをクライアントに伝える
            /// </summary>
            void OnSelect(int index);
    
            /// <summary>
            /// 集計結果が来たことをクライアントに伝える
            /// </summary>
            void OnResult(QuestionResult questionResults);
        }
    }
    
    
    또 하나 망설이는 것은 서버가 부르는 클라이언트 방법의 처리 방법이다.I~~HubReceiver 그것만 받아들일 수 있기 때문에 그 방법IObserver<T>.OnNext 또는 Pub/Sub에서 사용한다.
    상술한 IGameHubReceiver의 예를 들어 이 반resultStream.OnNext();과 같은 모든 방법을 실시했다.
    또 하나 자주 있는 강좌에 따라 진행하면 IGameHubReceiver 외부에 공개되기 때문에 IObservable를 내부 반에 숨기고 가로로 놓는다.전부
    여기에 쓰인 말은 매우 길기 때문에 코드는 아래의 링크를 밟으세요.
    지금 나는 이렇게 하면 Pub/Sub가 더욱 수월할 것이라고 생각한다.
    메시지 피프 같은 건 거의 안 건드려봐서 해봤는데...
    Docker 사용
    Docker.전혀 손대지 않은 Docker.드디어 맛을 보았다.
    Docker 만지기 전에 아무것도 몰랐던 제 모습입니다.

    이 RTA를 하기 전에 해 봤는데 고민하면서 Build→Run을 했어요.
    나는 매우 기쁘다.길드 슬랙에서도 그런 기쁨을 보였다.

    RTA도 같은 일만 해서 잘 먹긴 했지만 사실 온라인화하려고 했는데...
    언제 올지 모르는데 다음 RTA는 꼭 하고 싶어요!목표 온라인화!!
    MagicOnion 서버의 컨테이너화에 대해서는 Unity:MagicOnion의.AWS Fargate를 사용하여 NET Core 컨테이너 서버를 실행하는 방법를 참조하십시오.감사합니다.
    다만, 자신의 환경에서 서버.Net6에서 이동하므로 Docker File을 수정하고 추가해야 합니다.
    FROM mcr.microsoft.com/dotnet/sdk:6.0
    
    # ~~略
    
    # (.Net 6 と gRPC のバージョンの相性が悪かったっぽい?)
    RUN apt-get update && apt-get install -y libc-dev && apt-get clean
    
    # ~~ 略
    
    끝말
    이상!이렇게 RTA 기록이 끝났습니다.
    새로운 것을 접하게 되어 기쁩니다.더 하고 싶어요.
    "여기가 이래요!!"만약 이런 상황이 있으면 댓글을 남겨주세요. UGDG에 꼭 참가해서 저에게 알려주세요!!
    UGDG 좋아요.
    그러면💪💪💪💪💪
    감사의 말
    위대한 선조 를 참고하였다
    MagicOnion의 샘플https://github.com/Cysharp/MagicOnion/tree/master/samples/ChatApp/ChatApp.Unity
    Unity + .NET Core+MagicOn v3 환경 구축 손잡이https://qiita.com/_y_minami/items/db7b19eb5979ef1d6fe9
    Unity:MagicOnion의.AWS Fargate를 사용하여 NET Core 컨테이너 서버를 실행하는 방법https://qiita.com/simplestar/items/b1d29e986b0b2cd6af2b
    C#만 사용하는 경우 이제 소셜 게임 APPhttps://qiita.com/yoship1639/items/c54f6942d847f8374377를 만듭니다.
    Win10에 WSL2 및 Ubuntu 20.04https://astherier.com/blog/2020/07/install-wsl2-on-windows-10-may-2020/ 설치
    Windows 10 Home에서 WSL2+Dockerhttps://qiita.com/KoKeCross/items/a6365af2594a102a817b 사용
    gRPC의 isse(https://github.com/grpc/grpc/issues/24153

    좋은 웹페이지 즐겨찾기