레이블이 Unity인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Unity인 게시물을 표시합니다. 모든 게시물 표시

2025년 1월 6일 월요일

dialogue system for unity 사용중 android 장치에서 터치 동작이 안되는 경우

프로젝트에서 Dialogue Manager를 사용하면 Android 휴대전화에서 터치가 전혀 작동하지 않습니다. 에디터 모드에서는 정상 동작하였습니다.

Dialogue Manager 에 Input Device Manager 를 제거 해서 테스트 해보시기 바랍니다. (개발자로부터 답변 받음) 저는 이렇게 해결했습니다.


Input Device Manager - 조이스틱이나 마우스 장치 전환을 위한 것이라고 합니다. 따라서 터치를 사용하는 휴대폰의 경우 필요 없다고 합니다.

이것 때문에 하루를 소비했네요. 진작 개발자에게 문의해볼 걸 그랬습니다. 참고로 개발자 답변이 굉장히 빠릅니다....


2025년 1월 5일 일요일

unity android debbuging시 무한 경고

 

Unity 에서 안드로이드 디버깅시 이런식으로 무한 로그가 발생하는 경우 

2025-01-05 21:53:07.298 23202 23385 Warn Unity VULKAN: GENERAL WARNING: The following warning was triggered: VKDBGUTILWARN003. Please refer to the Adreno Game Developer Guide for more information: https://developer.qualcomm.com/sites/default/files/docs/adreno-gpu/snapdragon-game-toolkit/learn_guides.html


https://developer.qualcomm.com/sites/default/files/docs/adreno-gpu/snapdragon-game-toolkit/learn_guides.html 여기 홈페이지 가봐도 링크 깨져 있습니다.

로그가 무한이 나와서 다른 로그를 볼 수 없는 상태가 됩니다.

불칸을 디버깅 했을때 발생하는 현상인데 자세한 내용을 찾을 수 없어서 그래픽쪽 문제가 아니라면 불칸을 끄면 해결이 됩니다.

끄는 방법은 unity6에서 player > other settings > auto graphics API (선택해제) > OpenGLES3 를 위쪽으로 끌어 올리면 됩니다. 

디버깅 후 auto graphics API 값이 기본 enable 이므로 check 하시면 됩니다..





2024년 12월 31일 화요일

SPUM 사용법 정리


SPUM 

 SPUM 은 Unity 에서 사용하는 2D 픽셀 디자인의 캐릭터를 생성할 수 있도록 도움을 주는 캐릭터 생성기 에셋입니다.

홈페이지는 2D Pixel Unit Maker - SPUM | 2D Characters | Unity Asset Store 오랜만에 사용하려고 했더니 Documentation 페이지 링크가 깨져 있네요.

GitHub에서 사용법을 찾긴했는데 Home ko KR · soonsoon2/SPUM Wiki 문서가 구버전 문서라(오늘 날짜 기준, 개발자분이 미래에는 업데이트 했을 수도 있습니다.) 현재 버전과 내용이 맞지 않습니다. 개발자쪽에서 문서도 부지런히 버전업을 해야 할것 같은데... ㅡㅡ;;;

개인적으로 사용하면서 문서가 정리가 안되어 있는 듯 싶어서 사용에 필요한 부분만 정리해 보았습니다.

먼저 캐릭터를 만드는건 예전 문서를 보아도 충분히 사용이 가능합니다.

Assets>SPUM>Scene>SPUM_Scene 를 열어서 캐릭터를 생성하면 됩니다. 이건 누구나 쉽게 할 수 있어서 패스...


177 버전이고 Unity 6에서 사용하는 중인데

Random color check시  동작이 제대로 동작이 안되는 문제가 있습니다.





색상 버튼을 한번 눌러주면 정상 반영됩니다.

SAVE UNIT 버튼을 눌러 저장을 하면 Assets>SPUM>Resources>Units 폴더 아래에 저장이 됩니다.

사용하기

이제 불러내는 방법을 배우기 위해서는 Sample Scene를 열어봅니다.

Assets>SPUM>Sample>Scene>Sample 입니다.

지금까지 저장했던 모든 Unit들이 보여집니다. 기본 2개 포함

그런데 기본 2개는 뭔가 오류가 계속 발생합니다. ㅡㅡ. 


(기존 생성된 2개에서 오류가 발생한 것이라) 나머지 생성된것을 사용하면 되니까 오류는 무시해 줍니다. 

구조를 살펴보면 PlayObject 아래 PlayerObject가 있습니다. PlayObject는 Scale이 5임을 참고해서 실제 prefab에서 가져오면 scale을 조정하도록 해야 합니다.



그리고 PlayerManager에서 Assets>SPUM>Resources>Units 여기 폴더를 보고 해당 위치에 있는 모든 Units들을 보여주는 형태라(PlayerManager 소스 코드에서는 GetPlayerList() ) 만약 개인적인 프로젝트에서 사용하려면 Prefab을 복사해서 drag drop 형태로 사용하면 되는데 상위에 Object를 하나 만들고 그 아래에 Unit을 배치하도록 합니다.

여기 예제에서는 SamplePlayer prefab에 SPUM Unit을 부착하게 되는데,

SamplePlayer prefab에는 collider 2d와 rigidbody2d가 기본으로 있는 prefab입니다.

그리고 PlayerObj도 있는데 여기에 SPUM 기본 처리를 위한 부분들이 있어서 수동으로 Prefab을 꺼낼때 추가해주는것이 좋습니다.

그래서 개인 프로젝트에서 사용할때는 SamplePlayer 를 꺼내주고 그 아래에 SPUM 자식으로 넣어주고 Prefebs에 SPUM 연결해주면 됩니다.




넣은 SPUM object의 RectTransform은 Reset해주도록 합니다.

이러면 기본적인 동작 자체는 잘됩니다. 이동하는 것은 기존 object처럼 움직이면 됩니다.
애니메이션관련해서는 아래와 같은 코드를 이용하면 쉽게 사용이 가능합니다.

PlayerObj.cs 파일의 Update() 함수에 테스트를 위해서 일부를 추가 하였습니다. 마우스 왼쪽 버튼을 누르면 동작하는 코드입니다.
    void Update()
    {
        if(isAction) return;
        // 추가한 코드 ----
        if(Input.GetMouseButtonDown(0)){
            SetStateAnimationIndex(PlayerState.ATTACK, 5);
            PlayStateAnimation(PlayerState.ATTACK);
        }
        // 추가한 코드 ----

        transform.position = new Vector3(transform.position.x,transform.position.y,transform.localPosition.y * 0.01f);
        switch(_currentState)
        {
            case PlayerState.IDLE:
           
            break;

            case PlayerState.MOVE:
            DoMove();
            break;
        }
        PlayStateAnimation(_currentState);

    }

추가한 코드를 살펴보면 PlayStateAnimation은 공격인지 idle 동작인지를 선택하는 함수이고, SetStateAnimationIndex함수는 공격이라면 세부 항목을 선택하는 함수입니다. 공격의 경우 여러 모션이 있기 때문에 순번을 선택하는 것입니다.

SPUM 아래 ATTACK_List 살펴보면 아래와 같은 6개 리스트가 있음을 알 수 있습니다.


요약

지금까지 내용을 요약 하자면 아래와 같습니다.

1. Assets>SPUM>Scene>SPUM_Scene 를 열어서 캐릭터를 생성

2. SamplePlayer Prefab 꺼내고 아래에 SPUM Unit을 자식으로 만들고 붙여줍니다. RectTransform Reset 필요

3. Scale 맞춰 줍니다.

4. PlayerObj.cs base로 SamplePlayer Prefab 추가 수정 필요

5. 이동은 기존 Object와 동일 Animation 은 SetStateAnimationIndex, PlayStateAnimation 사용합니다.


추가 업데이트

실제 사용하다보니 Object 뒤로 가림 문제가 있네요. Sprite Renderer 의 Order in Layer 숫자를 조절을 해야하는데, Unit은 여러개의 파츠로 나뉘어 있다보니 조정하기 쉽지 않습니다.

SPUM Unit 아래에 UnitMain 자식이 있는데요.  여기 보면 Sorting Group 이라는 컴포넌트가 있습니다. 여기 있는 Order in layer를 조절하면 됩니다.

반영전 : 기본값 5


200으로 반영 후 (이건 프로젝트 마다 적절한 값을 조절 필요) 수정 후 건물 보다 앞으로 나왔습니다.







2024년 12월 25일 수요일

일본에서 많이 사용하는 한자

 일본어 글자셋 사용 빈도를 구하는 코드를 만들었습니다.

물론 GPT를 사용하긴 하였지만 100%완벽하게 만들어주는 것이 아니다 보니 이것저것 수정 하고 원하는 대로 출력을 하기 위해서는 역시 사람의 손이 좀 필요하였습니다.

사용 용도는 unity TMP 글자셋에서 일본어 한자를 넣는 범위를 어떻게 해야할지 모르는 상황에서 최소한의 한자를 넣기 위해서 만들어 봤습니다.

지난글 참고 바랍니다.

https://swlock.blogspot.com/2024/12/unity-textmeshpro.html


대략 일본에서 유명하다는 web site 몇개 첫페이지만 가져와서 사용하는 문자들을 빈도순으로 나누었습니다. 아무래도 html 그대로 사용하다보니 영문 사용 빈도가 높았습니다. 

웹페이지를 분석해보니 아래 정도 글자를 사용하고 있습니다.

Summary:
Basic Latin:0000-007F : 98
Latin-1 Supplement:0080-00FF : 4
General Punctuation:2000-206F : 6
Letterlike Symbols:2100-214F : 1
Number Forms:2150-218F : 2
Arrows:2190-21FF : 1
Mathematical Operators:2200-22FF : 1
Enclosed Alphanumerics:2460-24FF : 1
Box Drawing:2500-257F : 1
Block Elements:2580-259F : 1
Geometric Shapes:25A0-25FF : 1
Miscellaneous Symbols:2600-26FF : 5
Dingbats:2700-27BF : 2
CJK Symbols and Punctuation:3000-303F : 20
Hiragana:3040-309F : 75
Katakana:30A0-30FF : 81
CJK Unified Ideographs:4E00-9FFF : 1382
Variation Selectors:FE00-FE0F : 1
Halfwidth and Fullwidth Forms:FF00-FFEF : 44
Specials:FFF0-FFFF : 1


간략하게 요약하자면 아래에서 파란부분은 모두 넣고

히라가나U+3041 - U+3096,

U+309D, U+309E

가타카나

전자/반자 문자

U+30A1 - U+30FA, U+30FC
간지CJK 통합 한자 참조
더블바이트 숫자FF10 - FF19

추가로 일본어에서는 아래 영역도 많이 사용합니다.

CJK Symbols and Punctuation:3000-303F : 20

、 「。」【】々『』〜〇〈〉《》〆〒〝〟

Halfwidth and Fullwidth Forms:FF00-FFEF : 44 위의 더블 바이트 숫자 영역입니다. 범위가 넓은데 확인해보니 아직 정의가 안된  부분이 있습니다. 위에 더블바이트 숫자영역만 사용하면 됩니다.

!/~)?(&:10%2+|Jx4=-R<>7heDAK3@FarnitSGWTV68Z

그리고 나서 CJK 한자 영역을 추가하면됩니다.

CJK Unified Ideographs:4E00-9FFF : 1382

天日新年気楽報月話品中晴時見人更連一最用曇作情生地載世界大小無間料子説公画開予本結転方事分雪知代場会女意検覧注愛上記全完像雨国出関県異前合恋入商選物特器現定集始索家電約象済高式者水行金今力有円通実文東市産俺取書買魔能自表山使目車美探週利得田法主登機社保北読所以別規海運役土強動信外手投部具計星語士死設発録後要版化感食花放心変体険容名明言様線安移道着介風初解次族納配加神庫二悪総送戦歴節理性稿直創正業冬対応除示季原野込師売都来広超平男止空題雲販験比台度近貴洗葉婚協石伝図降回較口評教紹和的提真万落点震横税藤店値旅暮音編防数木不受字夫元朝論遷終銀住積布指収酒好災向募島続長毎便内問学短達周活育冷炊況司末謝波付籍競各寝極覚味速切賞専過身下購証引番命員試術芸型津先省衛頃阪撃史累王氏件輸必町告資充宅座域優香房薬京飯装児確組他念福門催症去識嬢奇参乙思束境了貯期観光額雑医失追調剤務供占職申反立徹粉戸幸岡率私良温寒夜賀令華鮮訴効府券馬損太限位辺再工白典屋視企流持村区幼未染断急尋南履当焼濯鍋三球童郵求在違由決底策満宮暖十西測火重裏可僕億成亡霊宇須休号価何割削誌健菓経奈届紅多輪蔵熱科写井春歌素眠河疲娘戻雷四川詩弱属隊虚塚殺馴宙展恵詳客校株掲洋待獲康護豊富団修歳独泣漫息返麗夏千剣側友相談路紫影佐攻復勇双黒夢笑同駆居害破角査故百級背融費施半倍量靴敗財菜果消仕古飾民喫聴宿想簡単局認案願個針改任港第圧避振肥早夕基闘邪那崩荒帰監存嫁怪略幕少勝刀政八刑罪退軍谷膏駅松標犬館条斎忘突将概採揃沢閉貨腕択抜挙製梅援飲印弁顔室掛敷枕材技格託快適倒善処塾甘静倉油睡婦趣髪岩常服霜差散畿算響旧治労領禁奴否舎君冒武姫壊詰勤媒帝御浜織痛張遺議緑声庁増交賠償袋準端昇委助状免責項宝括訳際酎筋肌類米種酸玩習凍舗置抱猫備究講絵頭暗面停請欲却歯郎羽豆歩残進綺迎青警飛潟鹿九州沖縄城崎細許考密苦逐昔態園隷似秘七呼聖拒導溺起遠志病獄魅紀焦親系滅含虎営巨渡堀犯陽俳寿屍劇還判兆推環討救窓永湾祭湿鑑勢鏡肉魚茶赤柔軟掃扱即軽管祝帯植就映街贈簿徴枚清媛伊坂脳浴液慌担呆躍剛彩芽猛暑片隈斗晶黄砂傘艇釣桜枠札幌釧仙覇甲陸並低氷森秋形鳥旦契遇慢余裕鋼仲騎醒偽忌抗龍贄礼澤跡孤負囲麻批打非敵秀讐奪被陰謀譚賭囚才謙堅努固爵練誰既輩垢畜支軒脇功絶浩蛍辞押減炎湘奨授諮燃涙聞与迷秒挑恐守扇眼乳炭耗仏箱乗紙冠仮奏制航拠等泊審訪稼鹸塩革磨浄草湊圭吾樹薄宰鼻酔粧包丁暴走献射至玉茨梨兵曜彼毒舟匿稚握傲椎執蒼伏章荻離庭畑酷希弟煽糸英雄錬嫉妬賢匠辛怖懸萌頼召喚逢若課芯遭晨紡幻伽鬼賊博宵瞳咲首貰折妖暁鈴浪訓籠船皇兄妹竿埋構頑漢袖襟寺忠句棚遼騙霧架興嗜替滑輝敦彦擢到瑠沈黙惑官因困荷鉄併列般驚琴漏整撮摘寂曲権義暫濃傑板搭継縮沸丹贅旬叶狙該我寄宏帽兼精穀麺惣漬干泡壇筒膳厨操泳畳照壁毛農建築研鉢造飼衣葬刷骨董煙吹弦票療払複肢係望顧促透及延洒貼酬揺尽奮栄養滴豪乾燥覆昼伴沿央埼栃群岐阜滋根徳熊勘瘴狂紛律筆嘘卜涼泉孫刻羊唐杯叩潰懐稀惚尊敬六阻析激鞘喬褒丼繰是塞亘妙隠敢櫻岾貞曹洛呉妄彰両馨露柊統鉱脱鋸鎚杉峯捧又誘拐励槍普尉冥榮程毘沙艦蔑皆虹喜朗嶺諦裸副母梢絡誤致滝巻克逆純蛮尾虐歓俊哉爽佳誕橙乃著之携呈貸均疑裁靖綿肺訟控衝拡預巡争候補輔愕緯菅五毅鎮烈舞吉李緊厚債泰倫衆咳諭徒逮捕塗難仰例威嚇血芦接触察團遥久招賑共璧源唱潤弾斉騒萎悲騰跳慎芝益旨汚換勧絞頂

한자의 경우 웹사이트에서 추출한 1382자를 사용해보고 누락되는 글자를 추가해 주는 것도 좋을 것 같습니다.
CJK 통합 한자일반4E00 - 9FEA
확장 AU+3400 - U+4DB5
CJK 호환용 한자F900 - FA6D

그리고 이번에 웹사이트를 분석해보니 CJK 통합한자 중에 확장A, CJK 호환용 한자는 사용 안하고 있었습니다.


일본어 unicode 영역 정리

3000-303F,3041-3096,309D,309E,30A1-30FA,30FC,FF10-FF19,4E00-9FCB

4E00-9FCB 영역은 필요에 따라 삭제하고 위에 있는 글자셋으로 입력하면 됩니다.


여기에서 사용했던 코드는 아래 링크 참고 바랍니다.

https://github.com/donarts/sourcecode/blob/main/python/example/_80_gather_charset/TextExtractionCharset.py


Unity data 파일 저장 그리고 권한

GPT에게 낚인 몇 시간의 삽질...

Unity에서 파일 저장하려고 하는데 생각보다 잘안되서 gpt의 도움을 받아서 작업중이었습니다.

문제는 android 단말에 파일을 저장하고 싶은데 저장이 생각만큼 안되는것이었습니다. (save데이터라서 외부로 꺼낼때 자유로와야 했기 때문에 여러 앱에서 사용 가능한 공용 폴더를 고려하였습니다.)

저의 경우 아래 권한이 말썽이었는데요.


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


넣고 단말 디버깅도 해봤지만 잘동작하지 않았습니다.

결론만 정리하자면 GPT에게 문의시 Android의 경우 API 버전에 따라 권한 관련 변경점이 많으므로 API버전을 꼭 명시해서 문의를 하시기 바랍니다.

생각해보면 파일 읽기 권한이라는 것이 나의 사진이니 영상에도 접근 가능하다는 것인데 함부로 막 허용해주면 안되겠죠.

그래서 WRITE_EXTERNAL_STORAGE 권한이 더 이상 사용 불가가 되었고 READ_MEDIA_* 권한으로 파일 접근을 세분화 되었다고 합니다.

권한을 따로 요청하지 않아도 접근 가능한 영역에 저장하는 것을 고려하는 것이 좋을 것 같아서 저는 파일을 다운로드 받는 곳에 저장 했습니다. 

권한이 추가로 필요하지 않습니다.

위치는 다음과 같습니다.

            using (AndroidJavaClass environment = new AndroidJavaClass("android.os.Environment"))

            using (AndroidJavaObject downloadsDirectory = environment.CallStatic<AndroidJavaObject>("getExternalStoragePublicDirectory", environment.GetStatic<string>("DIRECTORY_DOWNLOADS")))

            {

                string downloadsPath = downloadsDirectory.Call<string>("getAbsolutePath");

                string fullPath = Path.Combine(downloadsPath, fileName);

                Debug.Log($"File saved at: {fullPath}");

            }


삼성 휴대폰 기준

경로가 /storage/emulated/0/Download/ 위치가 되는데 내파일 앱으로 확인시 내장 저장 공간 바로 아래/Download 폴더에 들어가게 됩니다.




2024년 12월 24일 화요일

마법사키우기 2탄 제작

 2025년을 위한 프로젝트를 시작했습니다.

이번 목표는 1년으로, 지난 작품에서 미흡했던 부분들을 진행하려고 합니다.

마법사키우기 2탄입니다.

뭔가 화려하지만 엄청 많은 적이 몰려오고 부수는 그런점이 부족했던것 같습니다.

탄막을 좋아하는데, 못보여드린것 같은것 같네요.



오늘이 첫번째 날로서 분위기랑 어울리는 Asset 을 구매 하였습니다.


RPG 분위기를 내면서 엄청난 몬스터가 몰려올것 같은 그런 느낌적인 느낌이랄까~~~

많이 기대해주세요.



2024년 12월 19일 목요일

Unity TextMeshPro 유니티 텍스트 메시 프로 한글이 네모로 나올때, 일본어 폰트 추가

 최근 일본어 추가 작업하면서 TMP 사용시 charset range 어떻게 해야할지 정리된것이 없어서 여기저기 찾아보고 정리하였습니다. 그리고 한글에 관해서도 몰랐던 사실도 정리해봅니다.

1. 들어가기에 앞서

FontAsset Creator로 생성할때 Character Set 부분 확실하게 알고 넘어가야 합니다.

중요한 3가지만 알면 됩니다.
아래 3개는 결국 같은 의미이고 표현하는 것에만 차이가 있습니다.
Custom Range : 10진수
Unicode Range(Hex) : 16진수
Custom Charactors : 글자
추가로 입력간에는 공백없이 , 나 -(범위 지정시)를 사용합니다.

예를 들어 인터넷 검색 해서 범위를 이렇게 설정하라고 한다면

32-126,44032-55203,12593-12643,8200-9900

위 내용은 이것은 10진수 이므로 Custom Range로 설정을 하면 됩니다.

만약 0020-007E,AC00-D7A3,3131-3163,2008-26AC 이렇게 주어진다면

이것은 16진수입니다. Unicode Range(Hex) 이것으로 설정하면 됩니다.


2. 한글 영역

검색해보면 32-126,44032-55203,12593-12643,8200-9900 이렇게 알려주는 곳이 있는데 16진수로 해보면 0020-007E,AC00-D7A3,3131-3163,2008-26AC 같은 값입니다.

해당 영역을 세분화 해보면 아래와 같습니다.


영어 범위 : 0020-007E  : 94

한글 범위 : AC00-D7A3  : 11171

한글 자모 : 3131-3163  : 50   ->  ㄱ, ㄴ, ㄷ 이런식입니다. 

특수 문자 : 2008-26AC  : 1700 ->  " 따옴포 같은 특수 문자들 


위 영역은 유니코드 한글 영역의 전체이므로 메모리상 여유가 된다면 추가해도 되긴 하는데 사실 게임에서 많이 사용안하는 코드가 많을 것입니다.

유니코드 많이 사용 하기 전 시절 상용 한글 이라는 것이 있었습니다. 많이 사용하는 한글 2350글자를 모아둔 코드입니다.

그래서 일부 개발자 분들은 상용 한글 2350+영문+특수  이렇게 공유하는 분들도 있습니다. 이 글자만 해도 충분하니까요. 제가 생각해도 충분할 것 같습니다. 문제는 코드는 유니코드에서는 연속 영역이 아닌 부분이 많아서 범위 영역으로 공유를 하지 않고 있습니다. 글자 그대로 복사해서 Custom Charactors로 넣는것을 추천드립니다.

상용한글 2350+영문+특수:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmonpqrstuvwxyz{|}~ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎㅏㅑㅓㅕㅗㅛㅜㅠㅡㅣ가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝

다음과 같이 넣습니다.



3. 일본어

사실 이글을 쓰게 된 이유 중 하나가 일본어 때문인데요, 일본어는 한자가 있어서 어렵습니다.

제일 아래 표에 따르면 아래와 같이 구성 되어 있습니다. 

히라가나U+3041 - U+3096,

U+309D, U+309E

가타카나

전자/반자 문자

U+30A1 - U+30FA, U+30FC
간지CJK 통합 한자 참조
더블바이트 숫자FF10 - FF19

이것을 16진수로 만들어보면, 다음과 같습니다.

3041-3096,309D,309E,30A1-30FA,30FC,FF10-FF19

이것만 해서는 안됩니다. 일본어에 한자가 많이 있어서 일부 네모 상자로 나옵니다.

일반4E00 - 9FEA
확장 AU+3400 - U+4DB5
CJK 호환용 한자F900 - FA6D

결론은 한자 포함해서 아래와 같이 해야 합니다. 

모든 문자를 누락하지 않기 위해서 atlas 크기가 굉장히 커집니다.

3041-3096,309D,309E,30A1-30FA,30FC,FF10-FF19,3400-4DB5,4E00-9FCB,F900-FA6A

일본에서 주로 사용하는 한자를 분리 가능하신 분이 있다면 제보 부탁드립니다.


저의 경우 너무 많은 메모리 사용으로 인한 낭비가 심해서 실제 사용하는 부분만 추출해서 해당 부분만 코드를 넣었습니다.

코드는 아래와 같이 작성하였고 text 부분에 문장을 넣으면 unicode 영역을 리턴합니다.

그중에 영어 범위나 한글 범위를 제외하고 범위를 생성 하였습니다. 매번 문장이 변경되거나 추가될때 일본어 폰트를 다시 작업해 줘야 하는 단점이 있습니다.

https://github.com/donarts/sourcecode/blob/main/python/example/_70_unicode_range/get_unicode_range.py

최초 한번만 진행하고 추가로 진행하는 글자는 Custom Charactors모드마지막에 깨지는 일본어글자를 추가해주고 다른것으로 바꿔줫다가 다시 Custom Charactors로 변경하면 중간에 자기 위치를 잘잡아서 변동됩니다.


4. 일본어 폰트

폰트는 라이센스가 자유로운 구글 폰트 사용하였습니다. 아래 링크에서 다운로드 가능합니다.

https://fonts.google.com/noto/specimen/Noto+Sans


5. Fallback Font Assets 설정

설정한 폰트가 없을때 다른 font assets을 찾도록 하는 기능입니다.

폰트를 선택하면 아래쪽에 메뉴가 있습니다.

다국어를 지원 할때 유용한 기능입니다.




6. 부록 전체 코드 범위

링크에서 가져왔습니다.

언어문자범위
아랍어

U+0600 - U+0605, U+0620 - U+0669, U+066E - U+06D3

CJK 통합 한자일반4E00 - 9FEA
확장 AU+3400 - U+4DB5
CJK 호환용 한자F900 - FA6D
Chinese중국 간지CJK 통합 한자 참조
그리스어

모든 알파벳 문자(대문자 및 소문자)가 지원됩니다. 확장 문자의 경우(ά έ ή ί ϊ ΐ ό ύ ϋ ΰ ώ €)

U+0370 - U+0374,

U+0376 - U+0377,

U+037A - U+037D,

U+037F - U+0386,

U+0388 - U+038A,

U+038C, U+038E - U+03A1, U+03A3 - U+03F5,

U+03F7 - U+03FF,

U+1F00 - U+1F15,

U+1F18 - U+1F1D,

U+1F20 - U+1F45,

U+1F48 - U+1F4D,

U+1F50 - U+1F57, U+1F59, U+1F5B, U+1F5D,

U+1F5F - U+1F7D,

U+1F80 - U+1FB4,

U+1FB6 - U+1FBC, U+1FBE,

U+1FC2 - U+1FC4,

U+1FC6 - U+1FCC,

U+1FD0 - U+1FD3,

U+1FD6 - U+1FDB,

U+1FE0 - U+1FEC,

U+1FF2 - U+1FF4,

1FF6 - 1FFC

일본어히라가나U+3041 - U+3096,

U+309D, U+309E

가타카나

전자/반자 문자

U+30A1 - U+30FA, U+30FC
간지CJK 통합 한자 참조
더블바이트 숫자FF10 - FF19
한국어한글 음절AC00 - D7A3
라틴어a-z

A-Z

U+0061 - U+007A

U+0041 - U+005A

라틴어 확장

(체코어, 덴마크어, 네덜란드어, 핀란드어, 프랑스어, 독일어, 헝가리어, 이탈리아어, 노르웨이어, 폴란드어, 포르투갈어, 루마니아어, 스페인어, 스웨덴어)

라틴어-1 보충

U+00C0 - U+00D6,

U+00D8 - U+00F6,

00F8 - 00FF

라틴어 확장-A

U+0100 - U+017F

라틴어 확장-B

U+0180 - U+024F

라틴어 확장-C

2C60 - 2C7F

통화 기호U+20AC
숫자0-9U+0030 - U+0039
러시아어키릴 문자

U+0400 - U+0481,

U+0483 - U+0487,

U+048A - U+04FF

특수 문자하이픈(-) 및 밑줄(_)U+002D, U+005F


참고 링크

https://docs.automationanywhere.com/ko-KR/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/using-variables/unicode-range.html







2024년 12월 13일 금요일

Unity : Graphics device is null. (admob 사용시)

AdMob 보상형 광고 문제 해결: Unity Editor에서 Android 단말기로의 전환


최근 Unity를 사용하여 AdMob의 보상형 광고를 구현하는 과정에서, 에디터에서는 정상적으로 작동하던 코드가 Android 단말기에서 오류를 발생시키는 문제가 있었습니다. 이를 해결하기 위해 ADB(Android Debug Bridge)를 통해 로그를 확인한 결과, 다음과 같은 오류 메시지를 발견했습니다.


 I Unity   : Rewarded ad full screen content opened.

 I Unity   : Rewarded ad recorded an impression.

 I Unity   : Rewarded ad paid 0 USD.

 E Unity   : Graphics device is null.

 E Unity   :  #0 0x75f8780ce4 (libunity.so) ? 0x0

 E Unity   :  #1 0x75f8c292e8 (libunity.so) ? 0x0

 E Unity   :  #2 0x75f8a68e20 (libunity.so) ? 0x0

 E Unity   :  #3 0x75f8caef40 (libunity.so) ? 0x0

 E Unity   :  #4 0x75f8cb1c20 (libunity.so) ? 0x0

 E Unity   :  #5 0x75f8cb1fc4 (libunity.so) ? 0x0

 E Unity   :  #6 0x75f844a8e0 (libunity.so) ? 0x0

 E Unity   :  #7 0x75f52cfd30 (libil2cpp.so) ? 0x0

 E Unity   :  #8 0x75f3adc6b0 (libil2cpp.so) ? 0x0

 E Unity   :  #9 0x75f3adc5fc (libil2cpp.so) ? 0x0

 E Unity   :  #10 0x75f8692c10 (libunity.so) ? 0x0

 E Unity   :  #11 0x75f86a1f18 (libunity.so) ? 0x0

 E Unity   :  #12 0x75f86a48d4 (libunity.so) ? 0x0

 E Unity   :  #13 0x75f86ed6fc (libunity.so) ? 0x0

 E Unity   :  #14 0x75f86b1b10 (libunity.so) ? 0x0

 E Unity   :  #15 0x75f86b1f20 (libunity.so) ? 0x0

 E Unity   :  #16 0x75f86b1a7c (libunity.so) ? 0x0

 E Unity   :  #17 0x75f86ef248 (libunity.so) ? 0x0

 E Unity   :  #18 0x75f86ef124 (libunity.so) ? 0x0

 E Unity   :  #19 0x75f84e348c (libunity.so) ? 0x0

 E Unity   :  #20 0x75f845ca24 (libunity.so) ? 0x0

 E Unity   :  #21 0x75f3bb0880 (libil2cpp.so) ? 0x0

 E Unity   :  #22 0x75f3bb1168 (libil2cpp.so) ? 0x0

 E Unity   :  #23 0x75f49dc658 (libil2cpp.so) ? 0x0

 E Unity   :  #24 0x75f3adc6b0 (libil2cpp.so) ? 0x0

 E Unity   :  #25 0x75f3adc5fc (libil2cpp.so) ? 0x0

 E Unity   :  #26 0x75f3a


이중 "Unity   : Graphics device is null."가 문제였으며 구글링을 해보았습니다.

이 오류는 Unity의 그래픽 장치가 null이라는 것을 의미하며, UI 관련 작업이 메인 스레드에서 제대로 처리되지 않았음을 암시합니다. 여러 자료를 참고한 결과, UI를 메인 스레드에서 처리해야 한다는 공통적인 의견이 있었습니다. 

참고 블로그들...

https://bonnate.tistory.com/552

https://sam0308.tistory.com/84


문제의 원인


문제를 분석해보니, 보상형 광고가 표시된 후 사용자를 보상하는 과정에서 UI 업데이트가 메인 스레드 외부에서 이루어져 오류가 발생한 것으로 보입니다. 이를 해결하기 위해, UI 처리를 메인 스레드로 옮기는 작업이 필요했습니다.


해결 방법


기존의 `GetReward` 메소드는 광고 보상 처리를 즉시 진행하고 있었으나, 이를 메인 스레드에서 처리하도록 수정했습니다. 아래는 수정된 코드입니다.


개선 전 코드


```

public void GetReward(Reward reward)

{

    GameManager.instance.ShowRewardGetNoGen(GetItem.ItemNo.GEM, 5);

}

```


개선 후 코드


변수를 추가하여 플래그를 설정하고, UI 처리를 `Update` 메소드로 옮겼습니다.


```

private bool getReward = false;


public void GetReward(Reward reward)

{

    getReward = true;

}


private void Update()

{

    if (getReward)

    {

        getReward = false;

        GameManager.instance.ShowRewardGetNoGen(GetItem.ItemNo.GEM, 5);

    }

}

```


이렇게 수정한 후, 문제는 해결되었고 광고가 정상적으로 작동했습니다.


검색해보니 아래와 같은 것도 있던데 실제 사용해 보지는 않았습니다. 참고용으로만 적어둡니다.

MobileAds.RaiseAdEventsOnUnityMainThread = true;



결론


AdMob 보상형 광고를 Unity에서 사용할 때, UI 업데이트를 메인 스레드에서 처리하는 것이 필요합니다. 그리고 여기에서는 이러한 방식으로 문제를 해결할 수 있었습니다.


2024년 12월 5일 목요일

Unity GooglePlayGamesPlugin-2.0.0 잘안될때 확인해야 할것

Unity GPGS 때문에 여기까지 검색해봤다면 기본적인 것은 알고 있다고 생각됩니다.

1. 가장 먼저 확인할 부분은 키부분입니다. 해당 부분은 다른 게시글에서도 쉽게 찾을 수 있을 것입니다.

2. 여기에서는 Authenticate 함수 호출시 에러가 나는 부분에 대한 설명입니다.


개발자 문서 : https://developer.android.com/games/pgs/unity/unity-start?hl=ko

github : https://github.com/playgameservices/play-games-plugin-for-unity


v11부터 바뀐것 같기는 하나 v11로 테스트 해보지는 않았지만, v11과 동일하게 2.0.0에서 signin 필요 없습니다.



위 링크를 보면 아래 내용이 나옵니다.

게임이 열리면 로그인 서비스를 사용하여 Play 게임즈 서비스로 연결이 자동으로 시도됩니다. 연결되면 게임에 로그인 메시지가 표시되고 Unity용 Google Play 게임즈 서비스 플러그인을 사용할 준비가 됩니다.

사용자가 기기에서 Google Play 게임즈 서비스를 사용한 적이 없는 경우 일회성 설정 화면으로 자동으로 안내되어 Play 게임즈 계정을 생성합니다.

스크립트의 Start 메서드에서 자동 로그인 시도 결과를 수신 대기하고, 인증 상태를 가져오고, Play 게임즈 서비스 기능을 중지(사용자가 로그인하지 않은 경우)합니다.

Unity 플러그인 버전이 v11 이전인 경우 로그인 기능을 사용할 수 없습니다.

    using GooglePlayGames;

    public void Start() {
      PlayGamesPlatform.Instance.Authenticate(ProcessAuthentication);
    }

    internal void ProcessAuthentication(SignInStatus status) {
      if (status == SignInStatus.Success) {
        // Continue with Play Games Services
      } else {
        // Disable your integration with Play Games Services or show a login button
        // to ask users to sign-in. Clicking it should call
        // PlayGamesPlatform.Instance.ManuallyAuthenticate(ProcessAuthentication).
      }
    }

즉 저 코드를 넣으면 된다고 되어있는데 실제해보면 동작하지 않습니다.

핵심은 주석 처리 되어 있는 아래쪽 코드인데, 해당 주석을 풀면 동작을 하게 됩니다. 자동로그인으로 바뀌었고 최초 한번은 수동 로그인이 필요하기 때문에 ManuallyAuthenticate 호출하도록 하던가 아니면 Authenticate 함수 실패시 ManuallyAuthenticate가 자동으로 호출 하도록 해당 함수를 사용하면 된다는 의미입니다.

단순히 주석을 제거하지 말고 버튼을 만들어서 수동으로 ManuallyAuthenticate 코드가 수행되도록 작업하는 것이 좋습니다. 위와 같은 상태로 구현을 하면 사용자가 로그인을 안한 경우 매번 실행시 구글 로그인을 하라는 팝업이 뜨는 경험을 겪게 됩니다.

막상 주석을 풀어서 사용하기 위해, 주석된 코드를 자세히 보면 ManuallyAuthenticate(ProcessAuthentication) 호출 후 callback으로 실패하게되면 ProcessAuthentication 함수가 무한이 불리게 됩니다.

제가 사용하는 참고 코드입니다.



    void Start()
    {
        PlayGamesPlatform.Activate();
        PlayGamesPlatform.Instance.Authenticate(PorcessAuthenticationStart);
    }

    public void GPGS_Login()
    {
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Instance.ManuallyAuthenticate(PorcessAuthentication);
    }
    internal void PorcessAuthentication(SignInStatus signInStatus)
    {
        if (signInStatus == SignInStatus.Success)
        {
            string displayName = PlayGamesPlatform.Instance.GetUserDisplayName();
            string userID = PlayGamesPlatform.Instance.GetUserId();
            this.displayName = displayName;
            this.userID = userID;
            logText.text = "logined:" + displayName;
        }
        else
        {
            logText.text = "*** Failed to authenticate with " + signInStatus;
        }
    }
    internal void PorcessAuthenticationStart(SignInStatus signInStatus)
    {
        if (signInStatus == SignInStatus.Success)
        {
            string displayName = PlayGamesPlatform.Instance.GetUserDisplayName();
            string userID = PlayGamesPlatform.Instance.GetUserId();
            this.displayName = displayName;
            this.userID = userID;
            Debug.Log("start login Success");
            logText.text = "logined:"+displayName;
        }
        else
        {
            Debug.Log("start login failed");
        }
    }


추가로 여러번 테스트할때 자동 로그인이 되어서 불편합니다. 로그아웃 하는 방법은 Play 게임 앱을 스토어에서 설치를 하면 내데이터 항목내 게임 계정 변경 메뉴가 있습니다. 해당 메뉴의 게임별 계정 변경 메뉴를 선택하면 게임별 로그 아웃 가능합니다.