반응형

English:

Hello.

When I opened it in a higher version in a Unity project, I got the following error.

"Copying assembly from 'Temp/com.unity.multiplayer-hlapi.Runtime.dll' to 'Library/ScriptAssemblies/com.unity.multiplayer-hlapi.Runtime.dll' failed"

An error has occurred.

As an error occurred, it was also impossible to execute, so we solved it through Google search.

한국어(Korean):

안녕하세요.

유니티 프로젝트에서 상위 버전에서 열었을 경우 다음과 같은 오류가 발생해서 해결 내용을 공유합니다.

"Copying assembly from 'Temp/com.unity.multiplayer-hlapi.Runtime.dll' to 'Library/ScriptAssemblies/com.unity.multiplayer-hlapi.Runtime.dll' failed"

에러가 발생했습니다.

에러가 발생으로 인해 실행도 불가능해서, 구글 검색을 통해 해결했습니다.

 

https://forum.unity.com/threads/error-copying-assembly-from-temp-com-unity-multiplayer-hlapi-runtime-dll-to-library-scriptassemb.644032/

 

Unity Multiplayer - Error: Copying assembly from 'Temp/com.unity.multiplayer-hlapi.Runtime.dll' to 'Library/ScriptAssemb

Hello everyone, I tested everything today to fix that error: Copying assembly from 'Temp/com.unity.multiplayer-hlapi.Runtime.dll' to...

forum.unity.com

To fix this error, click Window-Package Manager.

이 에러를 수정하기 위해서는 Window-Package Manager를 클릭합니다

 

Find MultiPlayer HLAPI in Package Manager, remove it, and reinstall it.

Package Manager에서 MultiPlayer HLAPI를 찾은 후 삭제(remove) 후 다시 설치(Install)합니다.

 

Running it again will fix it.

다시 실행시키면 해결됩니다.

 

반응형
반응형

안녕하세요.

오늘은 간단하게 유니티 버튼 UI의 이펙트를 간단하게 만드는 방법에 대해 알아보려고 합니다.

디자이너님 없이 혼자 간단하게 버튼 이펙트를 간단하게 만드는 방법입니다.

오늘 추가할 이펙트는 다음과 같습니다.

바로 시작하겠습니다.

버튼 UI를 하나 생성합니다.

원형 버튼을 만들어야 하므로, 

 Inspector에서 Image-Source Image항목을 변경합니다.

Knob를 선택합니다.

그리고 Rect Transform에서 Width, Height값을 같게 설정합니다.

Height값을 30에서 160으로 설정하겠습니다.

그리고 버튼에 하위에 이미지를 하나 넣습니다.

이펙트로 사용할 이미지가 하나 필요합니다.

알파 값이 들어있는 원을 하나 만들어야 합니다.

포토샵이나 기타 이미지 편집 프로그램에서 만듭니다.

만들시기 번거로우시다면 아래 파일을 다운로드하시면 됩니다.

12.png
0.00MB

새로 만든 이미지를 선택해서, Texture Type을 Sprite로 변경한 후 Apply버튼을 누릅니다.

그 후 이전에 추가했던 버튼 밑에 이미지 오브젝트에 추가합니다.

버튼 외곽에 이미지가 나와야하므로 Width, Height를 조정합니다.

150, 150정도로 조정하면 될 것 같습니다.

그리고 이미지 오브젝트가 버튼 외곽에 있도록 위치를 적당하게 맞춥니다.

 

이제 애니메이션을 추가해서 이펙트를 만듭니다.

메뉴에서 Window-Animation-Animation을 선택합니다.

이때 꼭 Image 오브젝트가 선택되어 있어야 합니다.

Image 오브젝트의 애니메이션을 추가하는 것이기 때문입니다.

 

애니메이션 창에서 "Create"버튼을 누릅니다.

적당한 이름으로 저장합니다.

3가지 애니메이션을 추가할 예정입니다.

1. 회전 이미지 추가

첫 번째로 이미지 회전 z 축으로 회전을 합니다.

Add Property 버튼을 누릅니다.

Rotation에서 +버튼을 누릅니다.

그 후 하얀 실선을 30 프레임 정도로 이동시킵니다.

그리고 빨간 녹화버튼을 누릅니다.

 

그리고 Rect Transform에서 Rotation값을 360으로 변경합니다.

 

 

60 프레임으로 이 동시 킨 후 

 

여기도 Z 축을 360으로 변경합니다.

 

2. 색 변경 애니메이션 추가

Image 오브젝트의 Color RGB 값을 255 / 255 / 0로 변경합니다.

0 프레임으로 이동합니다.

같은 방식으로 0 프레임에도 이미지 오브젝트의 Color RGB 값을 255 / 255 / 0으로 변경합니다.

30 프레임으로 이동합니다.

Image 오브젝트의 Color RGB 값을 255 / 0 / 0로 변경합니다.

3. Fill Account 수정

Animation의 녹화를 잠시 정지합니다.

Image 오브젝트의 Image Type을 Simple에서 Filled로 변경합니다.

Animation의 녹화를 다시 시작합니다.

그리고 Add Property를 해서, Fill Amount를 추가합니다.

 

0 프레임으로 이동합니다.

 

Fill Amount값을 1에서 0으로 변경합니다.

60 프레임으로 이동해서 마찬가지로 Fill Amount값을 1에서 0으로 변경합니다.

그리고 30 프레임으로 이동해서 Fill Amount값을 0에서 1로 변경합니다.

Animation의 녹화를 정지합니다.

실행을 시켜보면 처음에 보여드렸던 결과와 마찬가지로 UI 이펙트가 출력되는 것을 확인할 수 있습니다.

 

반응형
반응형

안녕하세요.

안드로이드 폰에 앱을 설치를 하면, Product Name으로 설정해놓은 이름으로 앱이 설치가 됩니다.

오늘은 앱 이름을 국가별로 다르게 설정하는 법에 대해 다루겠습니다.

일단 Assets\Plugins\Android\에 res폴더를 추가합니다.

D:\unity\QuitTest\Assets\Plugins\Android\res 이 폴더 안에 국가별 폴더를 만들어줍니다.

기본적으로 values을 추가하고 국가별로 values-xx방식으로 국가별로 폴더 추가를 합니다.

영어 values-en

한국어  values-ko

일본어 values-ja

중국어 values-zh

추가한 국가 이외는 values 폴더를 참조하게 된다고 하는데, 제가 사용하는 유니티 버전은 2019.2.9f에서는 이것을 참조하지 않는 것 같습니다.

그리고 각각 폴더 안에 strings.xml파일을 추가합니다.

일단 저는 values-en와 values-ko을 추가했습니다.

values-en폴더의 strings.xml

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string name="app_name">APP NAME</string>
    </resources>
cs

 

values-ko폴더의 strings.xml

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string name="app_name">이름변경앱</string>
    </resources>
cs

 

여기서 제가 겪었던 문제점은 APP NAME에 "'"를 포함시켜서 (예를 들면 : APP'NAME) 빌드를 했었는데 빌드가 되지 않는 문제가 있었습니다.

빌드상에 문제가 있다면 앱이름에 특수문자가 있는지 확인하시는 게 좋을 것 같습니다.

 

 

이렇게 추가를 하면 한국어일 경우 "이름변경앱"이라고 변경됩니다.

 

영어로 변경하면 "APPNAME"으로 변경됩니다.

반응형
반응형

.

안녕하세요.

[Unity] 유니티 구글 플레이 게임 서비스 연동 ( 로그인 하기 ) 를 이어서 구글 플레이 게임 서비스 업적과 리더보드 연동해보겠습니다.

 

[Unity] 구글 플레이 게임 서비스 연동 ( 로그인 하기 )

안녕하세요. 이 글은 이전에 작성한 [Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱 등록을 진행한 것을 기반으로 합니다. [Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱등록 안녕하세요...

scvtwo.tistory.com

1. 업적

구글 플레이 콘솔로 접속합니다.

https://play.google.com/apps/publish/?hl=ko

 

Redirecting...

 

play.google.com

업적 추가 버튼을 누릅니다.

업적을 추가합니다.

업적 이름을 적고 아이콘을 넣습니다.

단계별 업적은 여러 단계가 있는 업적을 추가하려면 설정합니다.

초기 상태는 초기에 업적을 공개할지 안할지 정합니다.

점수는 이게임에서 추가할 업적 점수입니다.

목록 순서는 사용자에게 보는 업적 순서입니다.

 

설정이 다 끝났으면, 저장을 합니다.

그럼 다음과 같이 저장됩니다.

 

 

2. 리더보드

리더보드를 추가해보겠습니다.

리더보드 이름을 적고 저장합니다.

리소스 받기를 눌러서 소스를 복사합니다.

3. API & 서비스

동의해줍니다.

 

Credentials(사용자 인증정보)에서 키이미지를 클릭합니다.

이전 포스팅에서 이미 추가했으므로 확인만하고 다음 단계로 넘어갑니다.

 

4. 유니티 셋팅

추가할 유니티 프로젝트를 실행합니다.

Window - Google Play Games - Setup-Android setup... 를 실행합니다.

이전에 복사한 리더보드 코드를 추가합니다.

그 후 Setup 버튼을 누릅니다.

 

업적 추가, 리더보드 보기, 업적보기 버튼을 추가합니다.

 

코드를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    // 리더보드에 점수등록 후 보기
    public void OnShowLeaderBoard()
    {
        text.text = "ShowLeaderBoard";
        // 1000점을 등록
        Social.ReportScore(1000, GPGSIds.leaderboard_leaderboardtest, (bool bSuccess) =>
        {
            if (bSuccess)
            {
                Debug.Log("ReportLeaderBoard Success");
                text.text = "ReportLeaderBoard Success";
            }
            else
            {
                Debug.Log("ReportLeaderBoard Fall");
                text.text = "ReportLeaderBoard Fail";
            }
        }
        );
        Social.ShowLeaderboardUI();
    }
 
    // 업적보기
    public void OnShowAchievement()
    {
        text.text = "ShowAchievement";
        Social.ShowAchievementsUI();
    }
 
    // 업적추가
    public void OnAddAchievement()
    {
        text.text = "AddAchievement";
 
        Social.ReportProgress(GPGSIds.achievement_achievements1, 100.0f, (bool bSuccess) =>
        {
            if (bSuccess)
            {
                Debug.Log("AddAchievement Success");
                text.text = "AddAchievement Success";
            }
            else
            {
                Debug.Log("AddAchievement Fall");
                text.text = "AddAchievement Fail";
            }
        }
        );
    }
cs

전체코드는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Text UI 사용
using UnityEngine.UI;
// 구글 플레이 연동
using GooglePlayGames;
using GooglePlayGames.BasicApi;
 
public class GooglePlayManager : MonoBehaviour
{
    bool bWait = false;
    public Text text;
 
    void Awake()
    {
        PlayGamesPlatform.InitializeInstance(new PlayGamesClientConfiguration.Builder().Build());
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
 
        text.text = "no Login";
    }
    // Start is called before the first frame update
    void Start()
    {
        
    }
 
    // Update is called once per frame
    void Update()
    {
        
    }
 
    public void OnLogin()
    {
        if (!Social.localUser.authenticated)
        {
            Social.localUser.Authenticate((bool bSuccess) =>
            {
                if (bSuccess)
                {
                    Debug.Log("Success : " + Social.localUser.userName);
                    text.text = Social.localUser.userName;
                }
                else
                {
                    Debug.Log("Fall");
                    text.text = "Fail";
                }
            });
        }
    }
 
    public void OnLogOut()
    {
        ((PlayGamesPlatform)Social.Active).SignOut();
        text.text = "Logout";
    }
 
    // 리더보드에 점수등록 후 보기
    public void OnShowLeaderBoard()
    {
        text.text = "ShowLeaderBoard";
        // 1000점을 등록
        Social.ReportScore(1000, GPGSIds.leaderboard_leaderboardtest, (bool bSuccess) =>
        {
            if (bSuccess)
            {
                Debug.Log("ReportLeaderBoard Success");
                text.text = "ReportLeaderBoard Success";
            }
            else
            {
                Debug.Log("ReportLeaderBoard Fall");
                text.text = "ReportLeaderBoard Fail";
            }
        }
        );
        Social.ShowLeaderboardUI();
    }
 
    // 업적보기
    public void OnShowAchievement()
    {
        text.text = "ShowAchievement";
        Social.ShowAchievementsUI();
    }
 
    // 업적추가
    public void OnAddAchievement()
    {
        text.text = "AddAchievement";
 
        Social.ReportProgress(GPGSIds.achievement_achievements1, 100.0f, (bool bSuccess) =>
        {
            if (bSuccess)
            {
                Debug.Log("AddAchievement Success");
                text.text = "AddAchievement Success";
            }
            else
            {
                Debug.Log("AddAchievement Fall");
                text.text = "AddAchievement Fail";
            }
        }
        );
    }
}
 
cs

버튼에 메서드를 연결합니다.

 

Show LeaderBoard버튼을 눌렀을 때

Add Achievements 버튼을 누른 후, Show Achievements을 눌렀을 때.

 

그리고 apk로 폰이나 애뮬레이터에서 테스트할 때에는 꼭 테스터를 추가해야 합니다.

테스트가 끝난 후

게임출시가 가능합니다.

 

 

이전 "구글플레이 게임서비스연동(로그인하기)"편이 궁금하시다면 클릭하세요~!

 

[Unity] 구글 플레이 게임 서비스 연동 ( 로그인 하기 )

안녕하세요. 이 글은 이전에 작성한 [Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱 등록을 진행한 것을 기반으로 합니다. 구글 플레이에서 다운로드한 게임을 보면 등록된 구글 계정으로 로그인해서..

scvtwo.tistory.com

읽어주셔서 감사합니다~! 수정할 부분이나 질문은 댓글 달아주세요!

 

반응형
반응형

 

 

안녕하세요.

이 글은 이전에 작성한  [Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱 등록을 진행한 것을 기반으로 합니다.

 

[Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱등록

안녕하세요. 구글 플레이 게임 서비스(GPGS) 연동 후 구글 플레이에 등록하는 과정에 대해 알아보도록 하겠습니다. 다음 과정을 거쳐서 GPGS 연동 후 앱등록 해보도록 하겠습니다. 1. Google Play Games plugin fo..

scvtwo.tistory.com

구글 플레이에서 다운로드한 게임을 보면 등록된 구글 계정으로 로그인해서 랭킹을 확인하거나 업적을 달성하는 것을 볼 수 있습니다..

일단 구글 계정을 로그인해야 랭킹이나 업적을 동기화시킬 수 있기 때문에, 로그인부터 알아보겠습니다.

구글 플레이 콘솔 사이트에 접속합니다.

https://play.google.com/apps/publish/?hl=ko

 

Redirecting...

 

play.google.com

그리고 개발자 구글 계정으로 로그인합니다.

 

1. 구글 플레이 게임 서비스 설정

게임 서비스를 누른 후 GOOGLE PLAY 게임 서비스 설정을 누릅니다.

 

게임 이름과 게임 종류를 설정한 후 계속을 누릅니다.

 

그리고 설명과 고해상도 아이콘, 그래픽 이미지를 넣고 다음을 누릅니다.

 

2. OAuth 2.0 클라이언트 ID 생성

구글 플레이 게임 서비스를 인증하려면 게임에 OAuth 2.0 클라이언트 ID가 필요합니다.

연결된 앱을 누른 후 ANDROID 버튼을 누릅니다.

 

패키지 이름을 설정한 후 "저장하고 계속" 버튼을 누릅니다.

다음 "지금 앱 승인" 버튼 클릭.

 

그리고 시작 키를 눌러서 명령 프로토콜(cmd)을 실행시킵니다.

 

여기서 jre 설치된 폴더 경로로 이동합니다.

"cd C:\Program Files\Java\jre1.8.0_231\bin" 를 입력합니다. jre버전에 따라 폴더명으로 들어갑니다.

 

그리고 "keytool -list -keystore D:\unity\QuitTest\user.keystore(해당 앱의 keystore 경로)"를 입력합니다.

그리고 SHA1 키를 복사합니다.

 

그리고 서명 인증서 지문 부분에 붙여 넣고 확인을 누릅니다.

연결이 완료되었습니다.

클라이언트 ID 항목을 복사해놓습니다. 

그 후 목록으로 돌아가기 버튼을 누릅니다.

 

등록할 게임의 유니티 프로젝트를 실행시킵니다.

그리고 Window-Google Play Games-Setup-Android setup... 을 누릅니다.

 

빨간 부분에 아까 복사한 클라이언트 ID를 넣습니다.

그리고 다시 구글 플레이 콘솔 페이지로 돌아갑니다.

 

 

리더보드 이름을 입력하고 저장 버튼을 입력합니다.

 

리소스 받기 버튼을 입력합니다.

코드를 모두 복사합니다.

 

그리고 유니티로 돌아갑니다.

코드를 복사한 후 Setup 버튼을 누릅니다.

 

 

이제 유니티에 실제로 적용을 해보겠습니다.

간단하게 로그인 / 로그아웃 버튼을 만들어서 연동되는 것을 확인하겠습니다.

그리고 구글 로그인을 담당하는 스크립트를 작성해보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Text UI 사용
using UnityEngine.UI;
// 구글 플레이 연동
using GooglePlayGames;
using GooglePlayGames.BasicApi;
 
public class GooglePlayManager : MonoBehaviour
{
    bool bWait = false;
    public Text text;
 
    void Awake()
    {
        PlayGamesPlatform.InitializeInstance(new PlayGamesClientConfiguration.Builder().Build());
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
 
        text.text = "no Login";
    }
    void Start()
    {
        
    }
    void Update()
    {
        
    }
 
    public void OnLogin()
    {
        if (!Social.localUser.authenticated)
        {
            Social.localUser.Authenticate((bool bSuccess) =>
            {
                if (bSuccess)
                {
                    Debug.Log("Success : " + Social.localUser.userName);
                    text.text = Social.localUser.userName;
                }
                else
                {
                    Debug.Log("Fall");
                    text.text = "Fail";
                }
            });
        }
    }
 
    public void OnLogOut()
    {
        ((PlayGamesPlatform)Social.Active).SignOut();
        text.text = "Logout";
    }
}
 
cs

 

로그인 버튼을 눌렀을 때

로그아웃 버튼을 눌렀을 때

 

그리고 apk로 폰이나 애뮬레이터에서 테스트할 때에는 꼭 테스터를 추가해야 합니다.

테스트가 끝난 후

게임 출시가 가능합니다.

 

로그인에는 지금 의미가 없으므로 리더보드 작성 후 출시해보도록 하겠습니다.

 

 

출시 후 문제

연결 중까지만 뜨고, 로그인이 되지 않는 문제가 발생했습니다.

해결 방법

여러 사이트를 검색하면서 알게 되었습니다.

플레이 콘솔의 해당 업플로 들어가서, 출시 관리 - 앱 서명으로 들어갑니다.

그 후 앱 서명 인증서 지문을 복사합니다.

게임 세브 정보로 들어가서 GplayTest로 들어갑니다.

 

그러면 API 및 서비스로 들어가게 되는데, 수정을 누릅니다.

 

이전에 복사한 앱 서명 인증서 지문을 넣습니다.

그리고 저장합니다.

그 후 앱을 실행해서, 로그인이 가능한지 확인합니다.

 

그 외 문제가 있다면, 제가 참조한 사이트를 확인해보시는것도 좋을 것 같습니다.

https://github.com/playgameservices/play-games-plugin-for-unity/issues/1800#issuecomment-310877125

 

[SOLVED] Can't authenticate users, sign in fails · Issue #1800 · playgameservices/play-games-plugin-for-unity

I can't figure it out. I have a feeling that something is happening on services end, but then there's also some weird behavior on my end. Like it works when I just built new apk, it allows ...

github.com

 

 

 

다음"[Unity] 유니티 구글 플레이 게임 서비스 연동 ( 업적과 리더보드 )"편으로 이어집니다.

 

 

[Unity] 구글 플레이 게임 서비스 연동 ( 업적과 리더보드 )

. 안녕하세요. [Unity] 구글 플레이 게임 서비스 연동 ( 로그인 하기 ) 를 이어서 구글 플레이 게임 서비스 업적과 리더보드 연동해보겠습니다. 1. 업적 구글 플레이 콘솔로 접속합니다. https://play.google.com..

scvtwo.tistory.com

 

읽어주셔서 감사합니다~! 수정할 부분이나 질문은 댓글 달아주세요!

 

반응형
반응형

 

안녕하세요.

APK를 Google Play에 올릴 때, 다음과 같은 메세지가 발생하는 경우를 볼 수 있습니다.

오늘은 해당 에러를 수정하는 방법에 대해 적어보겠습니다.

 

경고

이 버전을 출시하기 전에 다음 경고를 확인하세요. 이 페이지의 경고를 해결하면 기존 사용자가 최신 버전의 앱으로 업그레이드할 수 있습니다.

이렇게 메세지가 뜨고 경고 메세지 보기를 누르면 다음과 같은 메세지가 나옵니다.

최적화되지 않은 APK

경고:

이 APK로 인해 미사용 코드 및 리소스가 사용자에게 전송됩니다. Android App Bundle을 사용하면 앱 크기를 줄일 수 있습니다. 기기 설정에 따라 앱을 최적화하지 않으면 다운로드하여 사용자 기기에 설치되는 앱 용량이 필요 이상으로 커집니다. 크기가 큰 앱은 설치 성공률이 낮으며 사용자 기기의 저장용량을 많이 차지합니다.

해결 방법:

Android App Bundle을 사용하여 앱을 기기 설정에 맞게 자동으로 최적화하거나 여러 개의 APK로 직접 관리하세요.

 

빌드 셋팅을 다음과 같이 Build App Budle(Google Play)를 체크합니다. 

유니티 버전이 낮으면 안나올 수 있습니다. 업그레이드 해주세요.

제가 테스트한 버전은 2019.2.9f1입니다.

 

aab 확장자 파일로 생성됩니다.

여기서는 아직 용량이 줄지 않습니다.

aab를 Google Play Console로 들어가서 올립니다.

그러면 이전 apk파일보다 용량이 반정도 줄어들고, 아까 발생한 경고 문고도 사라진 것을 확인할 수 있습니다.

 

이상입니다.

반응형
반응형

 

안녕하세요.

앱등록할 떄, 다음과 같은 오류에 대해 수정하는 법에 대해 공유 드립니다.

"이 버전을 출시하기 전에 다음 오류를 확인하세요."

오류 메세지를 보면 다음과 같이 나옵니다.

이 출시 버전은 Google Play 64비트 요구 사항을 준수하지 않습니다.

다음 APK 또는 APP Bundle은 64비트 기기에서 사용할 수 있으나 현재 다음 32비트 네이티브 코드만 있습니다. 

앱에 64비트 및 32비트 네이티브 코드를 포함하세요. Android App Bundle 게시 형식을 사용하여 각 기기 아키텍쳐가 필요한 네이티브 코드만 수신하도록 자동으로 확인하세요. 그래야 앱 전체 크기를 줄일 수 있습니다.

이런 에러가 발생합니다.

다음과 같이 해결합니다.

64버전을 지원하려면 ARM64를 체크해야합니다.

일단, Scripting Backend에 Mono를 IL2CPP로 변경하고, ARM64를 체크합니다.

그리고 다시 빌드합니다.

만약 unable to locate android ndk 문제 오류가 난다면 다음 글을 확인하세요.

https://scvtwo.tistory.com/70?category=877671

 

[Unity] unable to locate android ndk 문제

안녕하세요. 유니티 빌드 중에 "unable to locate android ndk" 메세지박스가 출력되는 경우 해결 방법에 대해 알아보도록 하겠습니다. 일단 검색해봤을 때, Android SDK & NDK Tools을 설치했습니다. 근데 여전..

scvtwo.tistory.com

 

반응형
반응형

이미 버전 코드가 1인 APK가 있으므로 다른 버전 코드를 사용해야 합니다.

다음과 같이 버전이 같은 APK를 넣으면 업로드 실패가 뜹니다.

이렇게 해결합니다.

버전을 변경하고, 다시 빌드를 합니다.

반응형
반응형

 

안녕하세요.

유니티 빌드 중에 "unable to locate android ndk" 메세지박스가 출력되는 경우 

해결 방법에 대해 알아보도록 하겠습니다.

일단 검색해봤을 때, 

Android SDK & NDK Tools을 설치했습니다.

근데 여전히 같은 현상이 발생했습니다.

그래도 또 검색하다보니, Edit-Preferences에서 NDK를 다운로드 받습니다.

링크는 다음과 같습니다.

ndk를 저장한 후 C:\에 넣습니다.

https://dl.google.com/android/repository/android-ndk-r16b-windows-x86_64.zip

불러오는 중입니다...

그리고 경로를 변경합니다.

그리고 다시 빌드를 합니다.

반응형
반응형

안녕하세요.

구글 플레이 게임 서비스(GPGS) 연동 후 구글 플레이에 등록하는 과정에 대해 알아보도록 하겠습니다.

다음 과정을 거쳐서 GPGS 연동 후 앱등록 해보도록 하겠습니다.

1. Google Play Games plugin for Unity 

 

https://developers.google.com/games/services/integration

 

Game Engine Integrations  |  Play Games Services  |  Google Developers

Several plugins and extensions offer support for Google Play games services. If you are developing your game with a third-party game engine, you may be interested in using one of these plugins or extensions to integrate Google Play games services features.

developers.google.com

여기에 접속하여, Google Play Games plugin for Unity 를 눌러 GitHub에 접속합니다.

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

 

playgameservices/play-games-plugin-for-unity

Google Play Games plugin for Unity. Contribute to playgameservices/play-games-plugin-for-unity development by creating an account on GitHub.

github.com

 

current-build로 들어갑니다.

GooglePlayGamesPlugin-0.10.06.unitypackage를 다운로드받습니다.

그리고 사용할 프로젝트에 import 합니다.

GooglePlayGamesPlugin-0.10.06.unitypackage 파일을 끌어서 해당 프로젝트에 넣으면 됩니다.

 

2. Build Settings

그 후 File-Build Settings에 Build Settings창을 엽니다.

Android로 변경합니다.

Switch Platform을 한 후 Player Settings...버튼을 누릅니다.

그리고 다음과 같이 Company Name을 지정하고. Keystore Manager...버튼을 누릅니다.

 

Create New - Anywhere 한 후 KeyStore를 저장합니다.

 

 

패스워드를 입력하고, Alias는 아무거나 입력합니다.

그리고 AddKey 버튼을 누릅니다.

이제 다시 빌드 셋팅으로 돌아가서 빌드 버튼을 눌러 apk를 만듭니다.

만약 씬이 추가가 안되어있다면 "Add Opn Scenes"를 누릅니다.

 

3. 앱등록

Google Play Console에 접속하여 로그인 합니다.

https://developer.android.com/distribute/console?hl=ko

 

Google Play  |  Android Developers

Google Play Console로 앱과 게임을 게시하고 Google Play에서 비즈니스를 성장시키세요. 앱의 품질을 개선하고, 사용자층과 소통하고, 수익을 창출하기 위한 여러 기능을 활용할 수 있습니다.

developer.android.com

GOOGLE PLAY에 ANDROID 앱을 출시 버튼을 누릅니다.

 

제목을 입력하고 만들기 버튼을 누릅니다.

그러면 다음과 같은 화면이 나오는데, 체크 항목을 모두 기입해야합니다.

 

3-1 스토어 등록정보

일단 별로 표시된 항목들은 모두 기입해야합니다.

 

콘텐츠 등급은 apk올린 후 합니다.

3-2 앱 버전

apk를 등록합니다.

 

저장을 누르면 검토 버튼이 활성화되는데, 검토버튼을 누릅니다..

3-3 콘텐츠 등급

저장하고 등급계산을 합니다.

 

3-4 가격 및 배포

 

그 후 임시저장 버튼을 누릅니다.

3-5 가격 및 배포

 

광고가 있다면 "예, 광고가 포함되어 있습니다"를 체크합니다.

저는 광고가 없어서 "아니요"를 했습니다.

앱버전탭으로 이동합니다.

그 후 프로덕션 출시 시작을 합니다.

반응형
반응형

안녕하세요.

코딩하다 보면 플랫폼별로 실행되는 코드를 분류해야 하는 경우가 있습니다.

예를 들면, 안드로이드 폰에서는 뒤로 가기가 있지만, 아이폰에서는 뒤로 가기가 없습니다.

그러므로 안드로이드 폰에서만 실행되는 코드를 작성해야합니다.

그럴 경우에 다음과 같이 작성할 수 있습니다.

if (Application.platform == RuntimePlatform.Android)
            실행코드;

현재 플랫폼을 확인해서 그에 맞는 코드를 작성합니다.

Application.platform은 플랫폼별로 다음과 같은 값을 가지고 있습니다.

RuntimePlatform변수 설명
OSXEditor Mac OS X 유니티 에디터 플레이어
OSXPlayer Mac OS X 플레이어
WindowsPlayer Windows 플레이어
OSXWebPlayer Mac OS X 플레이어
OSXDashboardPlayer Mac OS X Dashboard widget
WindowsWebPlayer Windows 플레이어
WindowsEditor Windows 유니티 에디터
IPhonePlayer iPhone 플레이어
XBOX360 XBOX360 플레이어
PS3 Play Station 3 플레이어
Android 안드로이드 장치 플레이어
LinuxPlayer 리눅스 플레이어
WebGLPlayer WebGL 플레이어
WSAPlayerX86 CPU 아키텍쳐가 x86 윈도우스토어 앱플레이어
WSAPlayerX64 CPU 아키텍쳐가 x64 윈도우스토어 앱플레이어
WSAPlayerARM CPU 아키텍쳐가 ARM 윈도우스토어 앱플레이어
TizenPlayer 리눅스상에서 동작하는 플레이어를 나타냅니다.
PSP2 PS Vita 플레이어
PS4 Playstation 4 플레이어
XboxOne Xbox One 플레이어
SamsungTVPlayer Samsung Smart TV 플레이어
WiiU Windows플레이어
tvOS iPhone 플레이어
   

 

안드로이드 폰에서 뒤로가기를 눌렀을 때는 다음과 같이 코드를 작성합니다.

1
2
3
4
5
6
7
void Update()
{
    if (Application.platform == RuntimePlatform.Android && Input.GetKeyDown(KeyCode.Escape))
    {
        Application.Quit();
    }
}
 
cs
반응형
반응형

안녕하세요.

오늘은 유니티로 개발중에 발생한 Screen.width가 폰 스펙과 다르게 나오는 문제에 대해 다루겠습니다.

제가 하려고 했던건 폰 width값을 버튼의 width값에 넣으려고 했는데, 유니티상이나 애뮬레이터 상에도 문제가 없었는데, 갤럭시 S8 기종에서는 다른 width값을 가지고 있었습니다.

분명히 S8기종 해상도는 2960 x 1440 으로 알고 있습니다.

가로모드로 해놓았기 때문에 2960이 width값으로 들어있어야하는데, 2220이 들어있었습니다.

또한 Screen.height값도 1440이 아니라 1080으로 들어가 있었습니다.

검색을 해봐도 해결이 되지 않았습니다.

그러던중 혹시 몰라서 폰 디스플레이 설정을 확인했습니다.

설정 - 디스플레이 - 화면해상도를 확인했습니다.

 

그런데 이와 같이 2220 x 1080으로 설정되어있어서 Screen.width와 Screen.height에서 각각 2220 / 1080으로 값이 들어가 있었습니다.

결론적으로 이런 방법으로는 해상도를 맞출 수 없을거같아서, 다른 방법을 다시 찾아야 할 것 같습니다.

반응형
반응형

이 글과 관련된 글입니다.

[Unity] 해상도에 따른 UI 위치 변경

 

안녕하세요.

 

개발을 하다 보면 핸드폰마다 해상도가 달라서 곤란한 경우가 자주 있습니다.

 

지금 출시된 모든 휴대폰을 다 확인이 불가능하기 때문에 간단하게 해상도를 설정하는 방법에 대해 알아보도록 하겠습니다.

 

일단 현재 나와있는 폰들의 해상도를 알아보도록 하겠습니다.

 

구글에서 "휴대폰 해상도"라고 검색을 하면 휴대폰 해상도에 대한 정보들이 나와있는 것을 볼 수 있습니다.

 

그중에서 다음 사이트에 보면 잘 정리가 되어있습니다.

 

https://zetawiki.com/wiki/%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8F%B0_%ED%95%B4%EC%83%81%EB%8F%84,_%ED%99%94%EB%A9%B4%EB%B9%84%EC%9C%A8

 

스마트폰 해상도, 화면비율 - 제타위키

9:16 ★★★ 1440 × 2560(갤6, 갤7, 갤노4, 갤노5, G3, G4, G5, 픽셀XL)1080 × 1920(갤4, 갤5, 갤노3, 옵G프로, G2, 넥5, 아이폰6, 픽셀)

zetawiki.com

스마트폰은 16:9가 많이 있는 것을 확인해 볼 수 있어서 앱 개발 시 16:9를 기준으로 개발하는 것이 좋을 것 같습니다.

 

그러나 기타 해상도가 다른 휴대폰들은 화면에 UI가 이상한 곳으로 이동되는 현상이 발생할 수 있습니다.

 

유니티 에디터 상에서 해상 해상도를 설정하는 방법은 게임 탭에서 해당 해상도를 추가하는 방법입니다.

 

 

추가해서 해당 해상도로 설정을 하면 문제와 생긴 기기와 같은 화면을 볼 수 있습니다.

 

그리고, 기기 해상도를 완벽히 다 호환하기는 어렵지만 Canvas Object에서 "Canvas Scaler" Componect를 수정하면 됩니다.

 

 

잠시 설정에 대한 설명을 하면,

 

UI Scale Mode - 캔버스에 UI 요소들이 스케일링되는 방법을 결정하게 됩니다.

   Constant Pixel Size - 화면 크기에 관계없이 동일한 픽셀 크기를 유지합니다.

   Scale With Screen Size - 화면이 커질수록 UI 요소도 커집니다.

   Constant Physical Size - 화면 크기와 해상도에 관계없이 UI 요소가 동일한 물리적인 크기로 유지됩니다.

 

여기서 "Scale With Screen Size"를 설정해서 해상도에 맞춰서 기준 해상도를 Referance Resolution을 정한 후

"Match Widh Or Heght"로 해상도에 따라 스케일을 변경할 수 있습니다.

만약 위에 같이 X 2560, Y 1440으로 설정을 했다면 Match를 0.5로 했을 경우 그에 따라 전제 스케일이 변하게 되고,

만약 X가 변경되지 않게 하려면 Match를 0, Y이 변경이 되지 않게 하려면 Match를 1로 하면 된다.

 

세부 설정은 유니티 매뉴얼을 참조하시면 됩니다.

https://docs.unity3d.com/kr/current/Manual/script-CanvasScaler.html

 

캔버스 스케일러 - Unity 매뉴얼

캔버스 스케일러(Canvas Scaler) 컴포넌트는 캔버스 내 UI 요소의 전체적인 스케일과 픽셀 밀도를 제어하는 데 사용됩니다. 스케일은 글꼴 크기와 이미지 경계 등 캔버스 아래의 모든 요소에 영향을 미칩니다.

docs.unity3d.com

 

반응형
반응형

안녕하세요.

지연실행과 관련되어, Invoke, InvokeRepeating, CancelInvoke에 대해 알아보도록 하겠습니다.

 

1. Invoke

Unity 스크립트 작업중에 함수가 일정시간만큼 지연된 후 실행이 되게 하고자 할때 Invoke함수를 사용할 수 있습니다.

Invoke함수를 모른다면 코루틴(coroutine)을 사용해서 시간 지연을 준 후 실행되게 할수있지만 단순히 시간을 지연한 후 함수를 실행 시킨다면 Invoke로 쉽게 구현할 수 있습니다.

형식
Invoke("함수명", 지연시간(초));

예제

1
2
3
4
5
6
7
8
9
10
void Start()
{
    Debug.Log("Start() Time : " + Time.time);
    Invoke("FuncInvoke"5.0f);
}
 
void FuncInvoke()
{
    Debug.Log("FuncInvoke() Time : " + Time.time);
}
 
cs

다음과 같이 출력이 됩니다.

이렇게 한다면 시작 후 5초 후 FuncInvoke함수가 호출됩니다.

 

2. InvokeRepeating

Invoke함수는 지연시간 후 한번만 실행이되는데 여러번 반복실행을 위해서는 InvokeRepeating함수를 사용해서 지정한 주기로 반복할 수 있습니다.

형식
InvokeRepeating(함수명, 지연시간, 반복주기);
지연시간만큼 지연된후 반복주기 만큼 계속 반복합니다.

예제

1
2
3
4
5
6
7
8
9
10
void Start()
{
    Debug.Log("Start() Time : " + Time.time);
    InvokeRepeating("FuncInvoke"5.0f, 1.0f);
}
 
void FuncInvoke()
{
    Debug.Log("FuncInvoke() Time : " + Time.time);
}
 
cs

다음과 같이 출력됩니다.

5초 후 FuncInvoke함수가 호출되고, 1초마다 FuncInvoke가 계속 반복됩니다.

멈추기위해서는 CancelInvoke함수를 이용합니다.

 

3. CancelInvoke

실행중인 Invoke함수를 중지합니다

형식
CancelInvoke(함수명);

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int m_nCount = 0;
 
void Start()
{
    Debug.Log("Start()");
    InvokeRepeating("FuncInvoke"5.0f, 1.0f);
}
 
void FuncInvoke()
{
    m_nCount++;
    Debug.Log("FuncInvoke()");
 
    if( m_nCount >= 5 )
        CancelInvoke("FuncInvoke");
}
 
cs

다음과 같이 출력됩니다.

InvokeRepeating로 인해 FuncInvoke가 5번 반복되면 CancelInvoke함수로 더 이상 반복되지 않도록 합니다.

반응형
반응형

보통 함수는 하나의 프레임내에서 명령이 실행되게 하는데, 여러 프레임에 걸쳐서 코드를 실행시키기 위한 함수가 코루틴(Coroutine)입니다.
쓰레드와 비슷하다고 느낄 수 있지만 비동기가 아니기 때문에 쓰레드는 아닙니다.
대체로 Update함수를 이용해서 구현할 수 있지만, 코루틴을 사용해야하는 이유는 작업을 나눠서 수행할 수 있고, 불필요한 작업들이
Update문에서 계속 실행되는 것을 방지할 수 있습니다.


형식
함수를 정의한 후 StartCoroutine(코루틴함수)로 실행을 합니다.
코루틴 함수는 IEnumerator의 반환형을 가집니다.

예제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour
{
    GameObject goSprite;
    SpriteRenderer spriteRenderer;
    float m_fAlpha = 0f;
    void Start()
    {
        goSprite = GameObject.Find("Sprite");
        spriteRenderer = goSprite.GetComponent<SpriteRenderer>();
        spriteRenderer.color = new Color(0000);
        StartCoroutine ("Fade");
    }
 
    void Update()
    {
        
    }
    IEnumerator Fade()
    {
        
        for(int i = 0; i < 10; i++)
        {
            m_fAlpha += 0.1f;
            spriteRenderer.color = new Color(000, m_fAlpha );
            yield return new WaitForSeconds(1f);
        }
        
    }
}
 

Sprite Object의 알파수치를 변경하는 예제입니다.
IEnumerator Fade() 함수를 생성해주고, StartCoroutine을 통해 시작하도록 했습니다.
yield return new WaitForSeconds(1f); 이 코드는 1초를 대기하라는 의미입니다.

yield 키워드의 종류는 다음과 같습니다.
yield return null
yield return new WaitForSeconds(float second)  - 주어진 시간(초)동안, co-routine의 수행을 중단합니다.
yield return new WaitForFixedUpdate() - 다음 고정 프레임 업데이트 함수(fixed frame rate update)가 호출될 때까지 기다립니다.
yield return new WaitForEndOfFrame() - 화면에 컨텐츠를 보여주는 프레임 바로 직전에, 모든 카메라와 GUI가 렌더링을 완료하는 프레임의 마지막을 기다립니다.
yield return StartCoRoutine(string) - 다른 코루틴이 끝날 때까지 기다립니다.
yield return new WWW() - 웹 통신 작업이 끝날 때까지 기다립니다.
yield return new AsyncOperation - 비동기 작업이 끝날때까지 기다립니다.

코루틴이 진행중에도 StopCoroutine(함수명)을 입력한다면 정지시킬 수 있습니다.

방금 사용한 StartCoroutine ("Fade"); 이렇게 스트링으로 함수명을 넣을 수도 있지만,
직접 함수를 StartCoroutine (Fade());로 코드를 작성할 수 있습니다.

그리고 함수에 매개변수를 넣어서 표현도 가능합니다.

StartCoroutine (Fade(0.1f));

IEnumerator Fade(float fAlphaPlus)

    for(int i = 0; i < 10; i++)
    {
        m_fAlpha += fAlphaPlus;
        spriteRenderer.color = new Color(0, 0, 0, m_fAlpha );
        yield return new WaitForSeconds(1f);
    }  
}

반응형

+ Recent posts