기타등등/백엔드

2. Unity Gaming Service - Cloud Code 세팅 (Serverless Cloud Function)

CodeJB 2023. 9. 13. 01:14

https://docs.unity.com/ugs/en-us/manual/cloud-code/manual/modules/getting-started

일단 Cloud Code를 쓰는 사람이 전세계에 한 명도 없는건지 뭔지 모르겠지만 공식문서 말곤 정보가 하나도 없다.

그래서 직접 Cloud Code를 생성하고 unity에 Integration하는 것까지 설명하려고 한다.

그런데, 좀 많이 복잡하다.

UGS가 Unity에 Integration하기 좋을 것이라는 뇌피셜은 취소하도록 하겠다.

 

UGS 포털 LiveOps를 보면 Cloud Code가 있다 거기에 Modules에 우리의 백엔드 코드를 넣어야한다.

https://dashboard.unity3d.com/gaming

우리의 백엔드 코드를 클라우드에 올리려면 UGS CLI를 이용하여 커맨드를 입력하여 넣어야하는데.
UGS CLI를 설치하기 위해서는 nodejs를 설치해야한다.

https://nodejs.org/en/download

cmd 창을 열고 npm -v를 타이핑해서 아래와 같이 버전명이 뜨면 성공

이제 npm install -g ugs 명령어를 통해 ugs를 다운로드한다.

 

자 이제 유니티에서 내가 적용할 프로젝트를 킨다.

패키지 매니저에서 Cloud Code 설치

Packages:Unity Registry로 설정해야 보인다.
안보이면 사진 클릭하시오

프로젝트 연결

연결이 완료되면 아래와 같이 뜨고

유니티 어드민 대시보드에 이렇게 프로젝트가 생기고 Project ID도 할당된거 볼 수 있다.
https://dashboard.unity3d.com/admin-portal

이제 ugs에서 명령어를 쳐주자

ugs config set project-id <your-project-id>
ugs config set environment-name <your-environment-name>

 

여기서 environment-name은 위 어드민 포탈에서 environment로 들어가면 볼 수 있다 나같은 경우에는 production이라는 디폴트 이름이 이미 생성돼있었다.

성공하면 이렇게 [Information]하구 머라머라한다.

실패하면 [Error]하면서 머라머라함.

 

이제 비주얼 스튜디오에서 내 백엔드 코드를 작성할 프로젝트를 하나 만들자.

(아래에서 다룰거지만 dll명과 모듈명이 동일해야 이쪽 코드가 호출이 될건데 일단 BackEnd로 이름 대충 지어보세여)

클래스 라이브러리 플젝 생성

Nuget에서 패키지 설치

백엔드 샘플 코드 작성

아래 코드가 클라우드 코드에 올라가고 우리는 요 코드를 호출해서 값을 리턴받을 거임.

using Unity.Services.CloudCode.Core;

namespace BackEnd;

public class HelloModule
{
    [CloudCodeFunction("SayHello")]
    public string Hello(string name)
    {
        return $"Hello, {name}!";
    }
}

이제 이 프로젝트를 게시(Publish)해야 한다.

게시탭을 보면 기타 작업이라는게 있고

대상 런타임을 linux-x64로 세팅하고 저장한다.

그다음 게시버튼을 누른다.

게시가 완료되면 위 대상위치 폴더 경로에 이런 파일들이 생겨있을 것이다.

이제 이걸 반디집같은거로 압축해야 하는데 주의해야할 점은 확장자를 ccm으로 바꿔야한다.

그리고 이름도 dll과 같은 이름으루 맞춰주자. 이 압축 파일명이 곧 Cloud Code에 올라갈 Module명이된다.

그러면 이제 대충 파일 구성이 요렇게 됐을 것이다. 이제 이 ccm파일을 UGS Cloud Code에 올려야 되는데 이 때 다시 UGS CLI를 쓴다.

자 여기서 dll파일의 이름과 ccm파일의 이름이 다르면 나중에 함수호출할 때 에러 뜬다!

 

이제 UGS CLI로 돌아오자.

일단 ugs login 명령어로 로그인을 해야하는데, key-id랑 secret-key를 입력하라고 한다. 요거는

admin Portal의 Service Accounts 탭으로 들어가서

뭐 이것저것 걍 누르다보면 이제 Keys라는게 나올거고 Create Key를 누르면 볼 수 있다.

해당 키들은 Create Key를 누를 때 뜨는 팝업 이외에 아무데서도 못보니까 무조건 어딘가에 잘 메모해놓아야한다.

깜빡했으면 지우고 다시 만들어서 다시 확인 ㄱㄱ!

다시 CLI에서 key랑 secret key입력하구  로그인 성공하면 아래와 같이 뜬다.

그 다음 우리가 만든 ccm파일 모듈을 올리기 위해 요런식으루 명령어를 쳐야되는데

use deploy <ccm 폴더 경로>

바로 해보면 미친듯이 에러만 뜨구 이거를 해결하려면 문서를 잘 뒤져보면서 해결해야 한다. 그렇기 때문에 미리 아래와 같이 세팅해주자.

 

방금 들어갔었던 admin Portal의 Service Accounts 탭으로 들어가서 아래로 내리면 Project roles가 있다.

요기서 Add project role로 아래 Role들을 추가해주자. 요정도 추가해주니까 Error가 안떴었다.

이제 요기까지 세팅했으면 다시, 명령어를 쳐보면 이렇게 Successfully요게 뜨면 성공이다.

직접 UGS 홈피 드가서 확인해보면 생성돼있는거 볼 수 있다.

 

자 이제 내 유니티 클라에서 내가 등록한 BackEnd모듈의 코드를 실행시켜줄거다. 아래는 대충 클라코드다

public void OnEnable()
{
    Init();
}

public async void Login()
{
    // 대충 서비스랑 연결하는 코드
    await UnityServices.InitializeAsync();

    // 대충 익명 로그인하는 코드(나중에 GPGS같은거로 수정하면 된다.)
    await AuthenticationService.Instance.SignInAnonymouslyAsync();

    Debug.Log("Login Success");
}

public async void Call()
{
     try
     {
           // Call the function within the module and provide the parameters we defined in there

           string result = await CloudCodeService.Instance.CallModuleEndpointAsync("BackEnd", "SayHello", new Dictionary<string, object> { { "name", "World" } });

           Debug.Log(result);
      }
      catch (CloudCodeException exception)
      {
            Debug.LogException(exception);
      }
}

public void OnClick()
{
      Call();
}

OnEnable에서 익명로그인을 일단 해주고(나중에 GPGS나 구글로그인으루 바꿈되겠지)
CallModuleEndpointAsync가 백엔드 함수 호출하는 API인데
파라미터를 보면
첫 번째 : 모듈명 (요게 사실 ccm파일명인건데 압축된 dll의 파일명과 ccm의 파일명이 다르면 에러뜬다.)
두 번째 : 백엔드에 지정해놓은 엔드포인트이름 SayHello,
세 번째 :  딕셔너리의 키는 파라미터명, 벨류는 파라미터에 넣을 값이 되겠다.

잘 되는 것 확인했으며, 처음 호출은 원래 좀 느리다고한다. 실제로 좀 느리다 많이. 뭐 어때

 

제네릭도 지원하기 때문에 구조체를 리턴받을 수 있어서 어떻게 활용하기 나름일듯 하다. 리스트를 리턴해야될 때도 있고 구조체를 리턴해야될 때도 있을텐데 이건 다음 포스팅 때 진행해보겠다. 이미 문서에 있을 수도?

 

아 그리고 이건 제일 중요한 Cloud Code의 비용절감 팁과 제한 관련 문서다.
비용 절감 팁 : https://docs.unity.com/ugs/en-us/manual/cloud-code/manual/modules/reference/cost
제한 관련 팁 : https://docs.unity.com/ugs/en-us/manual/cloud-code/manual/modules/reference/limits

일단 비용절감에 대해서 말하자면, Cloud Code는 호출 횟수에 따라(사용량) 가격을 매기기 때문에 호출 횟수를 최적화 해야하는게 가장 기본적인 마인드셋이다. 대신 그만큼 클라단의 로직이 복잡해질 수 밖에 없다.

서버에 보내야할 데이터들은 무조건 캐싱해뒀다가 한꺼번에 보내자. value는 object타입이라서 한꺼번에 보내기 가능.

 

그리고 이외에 내용들은 위 문서에서 친절하게 설명해주니까 정독하자.

'기타등등 > 백엔드' 카테고리의 다른 글

1. 싱글게임 클라우드 뭐 쓰지?  (2) 2023.09.12