본문 바로가기

유니티

구글 스프레드시트로 유니티 로그인 구현하

728x90
반응형

 

맨 처음 구글에 로그인을 한다.

그리고 우측상단의 메뉴바를 통해 스프레드시트로 들어간다.

 

스프레드시트에 들어오면 우측과 같이 [새 스프레드시트 시작하기] '내용 없음' 을 눌러서

새로운 스프레드시트를 만든다.

 

A와 B Colume에 각각 ID, Password라고 입력한다.

앞으로 여기 두줄을 기준으로 ID와 Password가 생성될 것이다.

 

 

도구 메뉴를 누르면 스크립트 편집기가 나온다.

유니티와 메시지를 주고받을 스크립트를 여기서 만든다.

 

Image1
Image2

참고로 구글 로그인할 때 Image2처럼 사용자는 1번 ID이고 계정은 2번 ID로 되어있으면

스크립트 편집기가 정상적으로 켜지지 않는다.

 

 

스프레드 시트를 켜면 위와 같이 Code.gs가 나타나고 기본적으로 function하나가 입력되어 있다.

function myFunction은 필요 없으니 지운다.

 

가장 처음 할것은 변수를 선언하는 것이다.

 

sheetId

- 현재 스프레드시트의 정보를 담는 변수를 만든다.

- 파랗게 표시된 부분은 스프레드시트의 Id라고 할 수 있다.

- 해당 Id는 스프레드시트 주소창에서 /d/ 이후부터 /edit#gid=0 전까지를 입력해주면 된다.

sheet

- 스프레드시트의 첫번째 시트에 대한 정보다.

- sheetId.getSheet()[0]을 통해 해당 스프레드시트의 첫번째 시트를 가져온다.

parameter

- 이건 나중에 유니티에서 보낸 메시지를 받을 때 사용하는 용도다.

result, msg, value

- 결과값을 유니티에게 돌려줄 때 사용하는 용도다.

 

제대로 구현하기 전에 간단하게 설명을 먼저 해보자면

function doGet()

- 유니티에서 Get 메시지를 통해 접근하게될 함수다.

- Get이란 말 그대로 현재 스크립트에서 무언가 정보를 가져오거나 할 때 사용한다.

function doPost(e)

- 유니티에서 Post 메시지를 통해 접근하게될 함수다.

- (e)는 매개변수이고 e.parameter는 유니티에서 매개변수를 담아서 보낸 것이다.

- parameter를 이용해서 앞으로의 기능들을 구현하게 된다.

return ContentService.createTextOuput()

- Text 정보를 만들어서 돌려준다.

- 이 정보를 유니티에서 받게되는데 유니티의 Dubug.Log를 찍어보면 "Post호출"으로 찍힌다.

 

 

본격적으로 doPost의 기능을 구현해보자

parameter

- 해당 변수는 doPost에서만 쓰지 않고 여기저기서 쓸거니까 e.parameter를 parameter에 담는다.

switch문

- register(계정생성)과 login 분기를 만든다.

- 'parameter.order'는 유니티에서 사용자가 어떤 메시지를 보냈는지 구분하기 위한 값이다.

- 참고로 꼭 order라는 이름일 필요는 없다. sender나 index나 유니티에서 정보를 보낼 때 정하면 되는 것이다.

- 사용자가 order에 "register"라는 값을 넣어서 보냈다면 case "register"를 호출하여 계정 생성을 시도하게 된다.

return response

- 결과값을 유니티로 리턴하기 위한 함수 response()를 호출한다. response의 구현부는 조금 이따 설명하겠다.

 

 

lastColume

- 현재 스프레드시트의 마지막 colume 위치를 나타낸다.

- 여기서 마지막이라는건 Password로 사용자가 시트의 colume 마지막에 입력한 값이 기준이 된다.

- ID(colume 1번째)와 Password(colume 2번째)라는 값을 입력했었으니 lastColume의 값은 2가 된다.

lastRow

- 현재 스프레드시트의 마지막 row 위치를 나타낸다.

- 현재는 1번째 row에 ID와 Password만 있기 때문에 lastRow의 값은 1이다.

startRow

- 계정생성 시 스프레드시트 row의 시작 위치를 나타낸다.

- 1번째 row에는 이미 ID와 Password라는 제목이 입력되어 있으니 2번째 row부터 시작하도록 값이 2다.

cell = sheetRange(startRow, 1, lastRow, lastColume).getValues()

- 스프레드시트에서 특정 영역을 가져온다.

- row는 startRow, colume은 1번째부터 시작해서 lastRow, lastColume 위치까지의 영역을 cell에 담는다.

if(cell.som(row => row == parameter.id))

- 가져온 영역안에 유니티에서 계정생성 요청한 Id와 동일한 정보가 있을 경우 ERROR 메시지를 돌려주기 위한 분기다.

sheet.appendRow([parameter.id, parameter.password])

- appendRow라는 함수를 통해 해당 시트에 ID와 Password를 추가해준다.

- 그럼 아래 이미지처럼 ID와 Password가 추가되어 있는 것을 확인할 수 있다.

 

cell까지는 register()와 동일하다. for문부터 보면 된다.

cell의 길이 만큼 반복문을 루프한다.

cell[i][0] 여기서 i는 row이고 0은 colume이다.

간단히 내용을 설명하자면

cell의 row를 돌면서 cell의 첫번째 colume(ID)가 유니티에서 로그인할 때 요청한 ID와 같고

cell의 row를 돌면서 cell의 두번째 colume(Password)가 유니티에서 로그인할 때 요청한 Password와 같다면

로그인에 성공한 것이다.

 

setResult는 유니티에게 결과값을 돌려주기 위해서 result와 msg를 담도록 구현되어 있다.

response의 경우 json형태의 data를 만들고 data에 setResult에서 담은 result와 msg를 담도록 한다.

Contentservice.createTextOutput을 통해 json을 string 형태로 유니티에 돌려준다.

 

 

 

편집기에서 할 마지막 작업은 위 이미지들과 같이 '배포'를 통해 URL을 얻고

해당 URL을 유니티에서 사용하게 된다.

배포는 웹앱으로 배포하여야하며 편집기가 수정될 때마다 배포를 해서 버전을 올려나가야한다.

 

 

이제 유니티 클라이언트로 넘어가자

public class Register : MonoBehaviour
{
    /// <summary>
    /// 계정생성 버튼을 눌렀다.
    /// </summary>
    public void OnClickRegisterButton()
    {
        WWWForm form = new WWWForm();
        form.AddField("order", "register");
        form.AddField("id", "TestId");
        form.AddField("password", "1111122");

        // form이라는 객체 안에 order, id, password를 넣는다.
        // order의 값 "register"는 doPost(e)에서 switch문의 분기를 구분하기 위해 사용된다.
        // id와 password 값은 유니티에서 유저가 doPost로 보내는 계정정보다.

        StartCoroutine(Post(form));
    }

    private IEnumerator Post(WWWForm form)
    {
        string url = "여기에 웹 URL";
        using (UnityWebRequest www = UnityWebRequest.Post(url, form))
        {
            // 해당 url에 form을 담은 www객체가 만들어졌고
            // SendWebRequest를 통해 스프레드시트 편집기의 doPost(e)로
            // 메시지를 전송한다.
            yield return www.SendWebRequest();

            // 메시지가 정상적으로 주고받아졌으면 아래 text를 로그로 찍는다.
            if (www.isDone)
                print(www.downloadHandler.text);
            else
                print("Error");
        }
    }
}
public class Login : MonoBehaviour
{
    /// <summary>
    /// 로그인 버튼을 눌렀다.
    /// </summary>
    public void OnClickLoginButton()
    {
        WWWForm form = new WWWForm();
        form.AddField("order", "login");
        form.AddField("id", "TestId");
        form.AddField("password", "1111122");

        // form이라는 객체 안에 order, id, password를 넣는다.
        // order의 값 "login"은 doPost(e)에서 switch문의 분기를 구분하기 위해 사용된다.
        // id와 password 값은 유니티에서 유저가 doPost로 보내는 계정정보다.

        StartCoroutine(Post(form));
    }

    private IEnumerator Post(WWWForm form)
    {
        string url = "여기에 웹 URL";
        using (UnityWebRequest www = UnityWebRequest.Post(url, form))
        {
            // 해당 url에 form을 담은 www객체가 만들어졌고
            // SendWebRequest를 통해 스프레드시트 편집기의 doPost(e)로
            // 메시지를 전송한다.
            yield return www.SendWebRequest();

            // 메시지가 정상적으로 주고받아졌으면 아래 text를 로그로 찍는다.
            if (www.isDone)
                print(www.downloadHandler.text);
            else
                print("Error");
        }
    }
}

위와 같은 코드를 만들어서 실행시키면 정상적으로 작동한다.

 

참고로 여기서 parameter.id, parameter.password가 유니티에서 AddField로 만든 "id"와 "password"다

만약 AddField에 "id"라는 이름 대신에 AddField("nick","이름") 이라고 만들어서 보냈다면

위 fuction register에서 parameter.id를 사용해도 해당 값이 없다고 판단하게 된다.

그럴땐 "id"대신에 "Nick"이라는 Field로 바뀌었으니 parameter.id대신에 parameter.nick으로 바꿔주면 된다.

 

 

뭔가 장황하게 설명해놓았는데 글로서 표현하자니 생각보다 어려운거 같다.

아래에 고라니 님의 유튜브를 통해서 조금 더 자세하게 알 수 있다.

다람쥐와 포동포동이

 

 

 

 

RememberCook 9월 28일 정식 출시!

두번째 게임인 RememberCook이 출시되었습니다. 귀여운 캐릭터들이 나오는 간단한 게임이며 플레이어의 공간인지능력을 테스트하는 게임입니다. 아래 링크를 통해 다운 받으실 수 있으니 많은 관

chipmunk-plump-plump.tistory.com

반응형