반응형

안녕하세요.


문법
UPDATE 테이블명 
SET 수정할 컬럼명 = 수정할 값
where 조건식

예제

만약 CHARACTER_TBL이 다음과 같다면,

m_nPlayer m_szName m_nHP m_nMP
1 test 500 100
2 Admin 700 160
3 GM 1200 190
4 zzang 900 2000



UPDATE CHARACTER_TBL
SET m_nHP = 1000
-> CHARACTER_TBL 테이블의 모든 데이터의 m_nHP컬럼을 1000으로 수정합니다.

결과값

m_nPlayer m_szName m_nHP m_nMP
1 test 1000 100
2 Admin 1000 160
3 GM 1000 190
4 zzang 1000 2000



UPDATE CHARACTER_TBL
SET m_nHP = 1000
where m_szName = 'Admin'
-> m_szName컬럼이 'Admin'인 데이터의 m_nHP컬럼을 1000으로 수정합니다. 

결과값

m_nPlayer m_szName m_nHP m_nMP
1 test 500 100
2 Admin 1000 160
3 GM 1200 190
4 zzang 900 2000



반응형
반응형

안녕하세요.

테이블에 데이터를 넣기 위해서는 두 가지 쿼리를 사용할 수 있습니다.

형식
INSERT INTO 테이블명 (컬럼1, 컬럼2, 컬럼3....)
VALUES (컬럼1 데이터, 컬럼2 데이터, 컬럼3 데이터....)

INSERT INTO 테이블명
VALUES (컬럼1 데이터, 컬럼2 데이터, 컬럼3 데이터....)


예제

INSERT INTO CHARACTER ( m_nPlayer, m_szName, m_nHP, m_nMP ) 
VALUES ( 1, 'test', 200, 100 ) 

INSERT INTO CHARACTER
VALUES ( 1, 'test', 200, 100 )

 




SELECT문으로 INSERT하기

테이블명2에 데이터를 테이블명1에 넣습니다.

INSERT INTO 테이블명1 ( 컬럼1, 컬럼2, 컬럼3 ... )
SELECT 컬럼1, 컬럼2, 컬럼3 ... FROM 테이블명2 

테이블1과 테이블2가 같은 컬럼을 가진다면 다음과 같이 사용할 수 있습니다.
INSERT INTO 테이블명1
SELECT * FROM 테이블명2

반응형
반응형

안녕하세요 
MSSQL에서 데이터베이스 생성, 삭제 테이블을 생성, 수정, 삭제하는 쿼리에 대해 알아보도록 하겠습니다. 

■ 데이터베이스 생성(CRATE DATABASE) 
CREATE DATABASE 데이터베이스이름

예제
CREATE DATABASE TEST_DBF

■ 데이터베이스 삭제(DROP DATABASE) 
DROP DATABASE 데이터베이스이름

예제
DROP DATABASE TEST_DBF



■ 테이블 생성(CREATE TABLE) 
CREATE TABLE 새로만들테이블명( 
컬럼명 타입(크기) NOT NULL, 
컬럼명 타입(크기) DEFAULT(값) 
)

예제
CREATE TABLE CHARACTER_TBL( 
    m_nPlayer int, 
    m_szName varchar(32), 
    m_nHP int, 
    m_nMP int 
)

■ 테이블수정(ALTER TABLE) 
□ 컬럼 추가 
ALTER TABLE 테이블명 
ADD 컬럼명 데이터타입(크기)

예제
ALTER TABLE CHARACTER_TBL 
ADD m_nSP int 


□ 컬럼 삭제 
ALTER TABLE 테이블명 
DROP COLUMN 삭제할 컬럼명

예제
ALTER TABLE CHARACTER_TBL 
DROP COLUMN m_nSP


□ 컬럼 수정 
ALTER TABLE 테이블명 
ALTER COLUMN 컬럼명 데이터타입(크기)

예제
ALTER TABLE CHARACTER_TBL ALTER COLUMN m_szName varchar(30) 


■ 테이블삭제(DROP TABLE) 
DROP TABLE 테이블이름

예제
DROP TABLE CHARACTER_TBL

반응형
반응형

안녕하세요

많은 모바일 게임에서는 캐릭터를 컨트롤하기 위해 조이스틱을 사용합니다.

조이스틱 사용 게임 화면 (브롤스타즈)

유니티에서 조이스틱을 구현해보도록 하겠습니다.

일단 바닥과 이동시킬 오브젝트인 큐브를 생성하도록 하겠습니다.

그리고 이동을 명확하게 보기 위해 카메라의 위치를 변경합니다.

image UI를 생성합니다.

Image Object를 왼쪽 구석으로 이동합니다.

그 후 SourceImage를 Knob으로 변경하겠습니다.

그리고 Color도 변경합니다.

Image 오브젝트의 하위 오브젝트 하나 더 생성합니다.

오브젝트 이름이 같아서 헬갈릴 수 있기 때문에 오브젝트 이름을 상위 image오브젝트를 Joystickback, 하위 image오브젝트를 Joystick으로 이름을 변경하겠습니다.

JoyStick Object를 클릭하여 Width와 Height, Source Image를 변경합니다.

Cube의 정면 위치를 표시하기 위해, Cube의 하위에 Cube 오브젝트를 하나 더 추가합니다.

추가한 큐브의 크기와 위치를 변경하여, 정면에 위치시킵니다.

그다음 Canvas에 스크립트를 추가합니다.

 

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class JoyStick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler
{
    RectTransform m_rectBack;
    RectTransform m_rectJoystick;
 
    Transform m_trCube;
    float m_fRadius;
    float m_fSpeed = 5.0f;
    float m_fSqr = 0f;
 
    Vector3 m_vecMove;
 
    Vector2 m_vecNormal;
 
    bool m_bTouch = false;
 
 
    void Start()
    {
        m_rectBack = transform.Find("Joystickback").GetComponent<RectTransform>();
        m_rectJoystick = transform.Find("Joystickback/Joystick").GetComponent<RectTransform>();
 
        m_trCube = GameObject.Find("Cube").transform;
 
        // JoystickBackground의 반지름입니다.
        m_fRadius = m_rectBack.rect.width * 0.5f;
    }
 
    void Update()
    {
        if (m_bTouch)
        {
            m_trCube.position += m_vecMove;
        }
            
    }
 
    void OnTouch(Vector2 vecTouch)
    {
        Vector2 vec = new Vector2(vecTouch.x - m_rectBack.position.x, vecTouch.y - m_rectBack.position.y);
 
        
        // vec값을 m_fRadius 이상이 되지 않도록 합니다.
        vec = Vector2.ClampMagnitude(vec, m_fRadius);
        m_rectJoystick.localPosition = vec;
 
        // 조이스틱 배경과 조이스틱과의 거리 비율로 이동합니다.
        float fSqr = (m_rectBack.position - m_rectJoystick.position).sqrMagnitude / (m_fRadius * m_fRadius);
 
        // 터치위치 정규화
        Vector2 vecNormal = vec.normalized;
 
        m_vecMove = new Vector3(vecNormal.x * m_fSpeed * Time.deltaTime * fSqr, 0f, vecNormal.y * m_fSpeed * Time.deltaTime * fSqr);
        m_trCube.eulerAngles = new Vector3(0f, Mathf.Atan2(vecNormal.x, vecNormal.y) * Mathf.Rad2Deg, 0f);
    }
 
    public void OnDrag(PointerEventData eventData)
    {
        OnTouch(eventData.position);
        m_bTouch = true;
    }
 
    public void OnPointerDown(PointerEventData eventData)
    {
        OnTouch(eventData.position);
        m_bTouch = true;
    }
 
    public void OnPointerUp(PointerEventData eventData)
    {
        // 원래 위치로 되돌립니다.
        m_rectJoystick.localPosition = Vector2.zero;
        m_bTouch = false;
    }
}
 
 
cs

 

 

 

반응형
반응형

안녕하세요.

해상도 변경에 따라서 UI위치를 변경하는 방법에 대해 알아보도록 하겠습니다.

Canvas의 셋팅을 2560x1440기준으로 Match을 1로 셋팅하여 세로 해상도에 영향을 받지 않도록 하겠습니다.

일단 다음과 같이 버튼 UI를 배치했을 경우가 있습니다.

16:9 해상도에 맞춰서 UI를 배치했습니다.

근데 만약 해상도를 18:9로 변경되었을 경우에는 여백이 많이 생기게됩니다.

이런 경우 해상도 비율에 맞춰서 UI를 이동시킬 수 있습니다.

버튼 오브젝트에 스크립트를 추가합니다.

버튼 오브젝트를 모두 선택한 후 Add Componect로 스크립트를 추가합니다.

그 후 스크립트에 다음 코드를 작성합니다.

16:9 기준으로 코드를 작성했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class csUIPositon : MonoBehaviour
{
    void Start()
    {
        float fScaleWidth = ((float)Screen.width / (float)Screen.height) / ((float)16 / (float)9);
        Vector3 vecButtonPos = GetComponent<RectTransform>().localPosition;
        vecButtonPos.x = vecButtonPos.x * fScaleWidth;
        GetComponent<RectTransform>().localPosition = new Vector3 (vecButtonPos.x, vecButtonPos.y, vecButtonPos.z);
    }
}
 
cs

 

이렇게 작성후 해상도를 변경한 후 실행을 해보면 버튼 UI가 해상도에 맞춰서 이동하는것을 확인할 수 있습니다.

16:9 실행화면
18:9 실행화면
800x480실행화면
2160x1080 실행화면

반응형
반응형

에러메세지

VS2005 프로젝트를 VS2010으로 업그레이드한 후 빌드를 할 때, 다음과 같은 에러가 발생했습니다.

오류 32 error c1010001: Values of attribute "level" not equal in different manifest snippets. 

해결

프로젝트 속성을 연 후 [구성속성] - [링커] - [매니페스트 파일]을 선택 한 후

[UAC 실행 수준]을 requireAdministator로 변경하여 설정합니다.

반응형
반응형

안녕하세요.

디비작업을 하다보면 테이블의 데이터만 지우고 싶을 때가 있습니다.

하지만, 테이블이 너무 많아 하나씩 지우기가 어려울 때 사용하는 쿼리에 대해 공유하겠습니다.

다음 쿼리를 이용하면 일단 오브젝트 정보를 얻을 수 있습니다.

select * from sys.sysobjects

 

이중에 사용자 테이블만 조회하려면 다음과 같이 합니다.

select * from sys.sysobjects where [XTYPE] = 'U'

 

그리고 이제 손쉽게 TRUNCATE TABLE이나 DELETE를 붙여서 조회를 합니다.

select 'TRUNCATE TABLE ' + [NAME] FROM sys.sysobjects where [XTYPE] = 'U'
select 'DELETE FROM ' + [NAME] FROM sys.sysobjects where [XTYPE] = 'U'

 

조회된 데이터 쿼리를 이용해서 삭제를 하면 됩니다.

 

반응형
반응형

안녕하세요

오브젝트를 따라가는 카메라를 만드는 코드를 공유하려고 합니다.

바닥(Plane)과 따라갈 오브젝트(Cube)를 생성합니다.

오브젝트(Cube)에 이동관련 스크립트를 추가합니다.

키보드로 이동이 가능하도록 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Mover : MonoBehaviour
{
 
    float m_fSpeed = 5.0f;
 
    void Update()
    {
        float fHorizontal = Input.GetAxis("Horizontal");
        float fVertical = Input.GetAxis("Vertical");
 
        transform.Translate(Vector3.right * Time.deltaTime * m_fSpeed * fHorizontal, Space.World);
      transform.Translate(Vector3.forward * Time.deltaTime * m_fSpeed * fVertical, Space.World);
    }
}
 
 
cs

다음은 메인 카메라(Main Camera)에 오브젝트를 따라가는 스크립트를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CFollowCamera : MonoBehaviour
{
    public Transform target;        // 따라다닐 타겟 오브젝트의 Transform
 
    private Transform tr;                // 카메라 자신의 Transform
 
    void Start()
    {
        tr = GetComponent<Transform>();
    }
 
    void LateUpdate()
    {
        tr.position = new Vector3(target.position.x - 0.52f, tr.position.y, target.position.z - 6.56f);
 
        tr.LookAt(target);
    }
}
 
cs

그리고 Target에 오브젝트(Cube)를 넣어줍니다.

실행을 해보면 오브젝트(Cube)를 따라서 카메라가 이동하게 됩니다.

 

위에서 바라보는게 더 자연스러울 것 같아서 카메라 위치를 변경해보겠습니다.

감사합니다.

반응형
반응형

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

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

 

반응형
반응형

안녕하세요. 

구글 플레이 콘솔에서 게임 서비스 - GOOGLE PLAY 게임 서비스 설정을 누르면

다음과 같이 "예기치 않은 오류가 발생했습니다. 나중에 다시 시도해 주세요.(4800000)"가 발생을 하는 경우가 발생합니다.

일단 저는 특별히 앱을 올린 이후로 작업한 내용도 없고, 처음 GOOGLE PLAY 게임 서비스를 설정한 게 없어서 어떻게 해야 하는지 막막했습니다.

검색을 해보니.. 24시간을 기다려야 한다.

혹은 구글 서버 문제라서 기다려야 한다는 말 뿐이었습니다.

하지만.. 빨리 해보고 싶은 마음에 여러 가지 시도를 해봤습니다.

1. 재로그인

안되었습니다... 여전히 같은 에러가 발생합니다.

2. 재부팅 후 시도

안되었습니다... 실패.

 

여러 시도를 해보다가 해결책을 찾았습니다.

다른 이름으로 시도했더니 가능했습니다.

저는 "Google Play Test"라고 게임 이름을 만들었습니다.

여기서 "Google"에서 문제가 생긴 거 같습니다.

Google을 빼고 GPlay Test를 했더니 문제가 없었습니다.

혹시 같은 에러가 발생하신다면 참고하기 바랍니다.

반응형
반응형

 

 

안녕하세요.

이 글은 이전에 작성한  [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파일보다 용량이 반정도 줄어들고, 아까 발생한 경고 문고도 사라진 것을 확인할 수 있습니다.

 

이상입니다.

반응형

+ Recent posts