반응형

안녕하세요.

오늘은 하이라이키(Hierarchy)에서 순위 변경하는 방법에 대해 알아보도록 하겠습니다.

UI 등 같은 위치에 겹치게 되면 하이라이키(Hierarchy)의 나중에 있는 게 더 위로 나옵니다.

물론 순서를 바꾸면, 순위를 바꿀 수 있습니다.

하지만, 실행 중에 변경하려면 스크립트를 이용해야 합니다.

스크립트에서 다음 함수를 사용할 수 있습니다.

Transform.SetAsLastSibling
해당 오브젝트의 순위를 마지막으로 변경(가장 나중에 출력되므로 겹쳐졋을 경우 앞으로 나옵니다.)

Transform.SetAsFirstSibling
해당 오브젝트의 순위를 처음으로 변경(가장 처음 출력되므로 겹쳐졋을 경우 가려집니다.)

Transform.SetSiblingIndex(int nIndex)
nIndex를 매개변수를 넣어서 순위를 지정합니다.(0이 처음입니다.)

Transform.GetSiblingIndex()
해당 오브젝트의 순위를 얻어옵니다.

 

예제

일단 이미지 오브젝트를 생성하고, blue, red로 지정하겠습니다.

그리고 스크립트가 들어갈 오브젝트를 하나 만듭니다.(ScriptObject)

스크립트에 다음과 같이 입력하면 현재 오브젝트의 순위값을 알 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class GameManger : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GameObject goRed = GameObject.Find("Canvas/red");
        GameObject goBlue = GameObject.Find("Canvas/blue");
 
        Debug.Log("goRed : " + goRed.transform.GetSiblingIndex());
        Debug.Log("goBlue : " + goBlue.transform.GetSiblingIndex());
    }
}
 
cs

출력값은 다음과 같습니다.

빨간 사각형이 나중에 나오기 때문에 1로 표기 되었습니다.

순위를 변경할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class GameManger : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GameObject goRed = GameObject.Find("Canvas/red");
        GameObject goBlue = GameObject.Find("Canvas/blue");
 
        Debug.Log("before goRed : " + goRed.transform.GetSiblingIndex());
        Debug.Log("before goBlue : " + goBlue.transform.GetSiblingIndex());
 
        goRed.transform.SetSiblingIndex(0);
        Debug.Log("after goRed : " + goRed.transform.GetSiblingIndex());
        Debug.Log("after goBlue : " + goBlue.transform.GetSiblingIndex());
    }
}
cs

출력값

16번째 줄 "goRed.transform.SetSiblingIndex(0);" 대신에 "goRed.transform.SetAsFirstSibling();", "goBlue.transform.SetAsLastSibling();"를 넣으면 같은 결과를 얻을 수 있습니다. 

 

반응형
반응형

안녕하세요.

오늘은 하나의 이미지를 자르는 방법에 대해 알아보도록 하겠습니다.

기본적인 ui image에서는 자르는게 안 되는 것 같습니다.(못 찾았습니다.)

Raw Image를 사용하면 자를 수 있습니다.

Hierarchy에서 UI - Raw Image로 오브젝트를 추가합니다.

Inspector에서 Raw Image 항목의 UV Rect 값을 변경하여 자를 수 있습니다.

X, Y에는 0~1 값이 들어가며, X, Y 자르는 시작 점을 지정할 수 있습니다.

W, H에는 0~1값이 들어가며, 너비와 높이를 지정할 수 있습니다.

좌표계는 다음과 같이 됩니다.

만약에 4등분으로 오른쪽 위를 반으로 자르고 싶다면 다음과 같이 설정하면 됩니다.

 

같은 방식으로 4등분에 X, Y값은 다음과 같이 설정할 수 있습니다.

1.  X : 0, Y : 0.5 (왼쪽 위)

2. X : 0.5, Y : 0.5 (오른쪽 위)

3. X : 0, Y : 0 (왼쪽 아래)

4 X : 0.5 Y 0 (오른쪽 아래)

 

반응형
반응형

안녕하세요.

유니티에서 개발을 하다보면, 투명도를 설정하려면 어떻게 해야할까요?

Inspector에 color에서 설정할 수 있습니다.

color설정창을 열어서 알파값을 변경하면 됩니다.

수치를 낮추면, 더 투명하게 할 수 있습니다.

 

코드로 추가할 수도 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;   // Image class를 사용하기 위해 추가합니다.
 
 
public class CGameManager : MonoBehaviour
{
    void Start()
    {
        GameObject goImage = GameObject.Find("Canvas/Image");
        Color color = goImage.GetComponent<Image>().color;
        color.a = 0.5f;
        goImage.GetComponent<Image>().color = color;
    }
}
cs

0.5f는 255를 기준으로 255 * 0.5 = 127.5 소수점 반올림해서 128을 의미합니다.

반응형
반응형

안녕하세요

유니티 안드로이드 플랫폼에서 화면 회전을 설정하는 법에 대해 알아보도록 하겠습니다.

설정을 위해서는 플랫폼을 Android로 변경해야 합니다.

Build Settings(Ctrl+Shift+B)에서 Platform을 Android로 설정하고 Switch Platform으로 설정합니다.

 

Android로 바뀌었으면 Player Settings버튼을 클릭합니다.

 

Project Settings창이 뜨는데, Player에 Resolution and Presentation을 선택합니다.

 

여기서 Default Orientation설정을 이용하여 화면을 회전하거나 고정할 수 있습니다.

 

설정은 5가지로 할 수 있습니다.

Portratit, Portrait Upside Down, Landscape Right, Landscape Left는 게임 시작 시 해당 방향으로 화면이 고정됩니다.

Auto Rotation은 휴대폰의 방향에 따라 화면을 회전합니다.

Portrait - 디바이스 홈버튼이 아래에 있는 세로 모드로 고정

PortraitUpsideDown - 디바이스 홈 버튼이 위에 있는 세로 모드로 고정

LandscapeLeft - 디바이스 홈 버튼이 오른쪽에 있는 가로모드로 고정

LandscapeRight - 디바이스 홈버튼이 왼쪽에 있는 가로모드로 고정

AutoRotation - 휴대폰 방향에 따라 화면이 변경됩니다.

AutoRotation을 선택하면 세부 옵션들이 생기는데, 휴대폰의 해당 방향에 따라 화면이 자동으로 회전될 것인지 설정하는 것입니다.

체크를 해제하면 휴대폰의 방향을 변경해도 화면이 회전되지 않습니다.

예를 들면 Protratit Upside Down을 체크를 해제하면 홈버튼을 위로 향하게 휴대폰 방향을 변경해도 화면을 그대로 유지됩니다.

 

참고로 코드로 직접 셋팅도 가능합니다.

Screen.orientation = ScreenOrientation.Portrait; //세로 방향을 나타냅니다.
Screen.orientation = ScreenOrientation.PortraitUpsideDown; //장치의 윗부분이 아래를 향하는, 세로 방향을 나타냅니다.
Screen.orientation = ScreenOrientation.LandscapeLeft; //가로 방향을 나타내며, 세로 방향으로부터 반 시계방향으로 회전한 상태를 나타냅니다.
Screen.orientation = ScreenOrientation.LandscapeRight; //가로 방향을 나타내며, 세로 방향으로부터 시계방향으로 회전한 상태를 나타냅니다.
Screen.orientation = ScreenOrientation.AutoRotation; //활성화된 방향으로 자동 회전 하도록 설정합니다.

 

"ScreenOrientation.AutoRotation"설정한 후 세부설정은 다음과 같이합니다.

Screen.autorotateToPortrait = false;
Screen.autorotateToPortraitUpsideDown = false;
Screen.autorotateToLandscapeLeft = true;
Screen.autorotateToLandscapeRight = true;

반응형
  1. 테샤르 2020.06.16 15:30 신고

    잘보고갑니다 :D
    소통해요 ~

반응형

안녕하세요.

오늘은 모바일 게임에서 멀티터치로 카메라 줌인 / 줌아웃을 구현해보도록 하겠습니다.

줌인/줌아웃이 되는지 확인할 수 있도록 아무 객체나 생성합니다.

저는 큐브를 하나 생성하도록 하겠습니다.

그리고 빈프로젝트를 생성해서 스크립트를 추가하겠습니다.

생성한 스크립트에 다음과 같은 코드를 추가하겠습니다.

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class TouchManger : MonoBehaviour
{
    float m_fOldToucDis = 0f;       // 터치 이전 거리를 저장합니다.
    float m_fFieldOfView = 60f;     // 카메라의 FieldOfView의 기본값을 60으로 정합니다.
 
    void Update()
    {
        CheckTouch();
    }
 
    void CheckTouch()
    {
        int nTouch = Input.touchCount;
        float m_fToucDis = 0f;
        float fDis = 0f;
 
        // 터치가 두개이고, 두 터치중 하나라도 이동한다면 카메라의 fieldOfView를 조정합니다.
        if (Input.touchCount == 2 && (Input.touches[0].phase == TouchPhase.Moved || Input.touches[1].phase == TouchPhase.Moved))
        {
            m_fToucDis = (Input.touches[0].position - Input.touches[1].position).sqrMagnitude;
 
            fDis = (m_fToucDis - m_fOldToucDis) * 0.01f;
 
            // 이전 두 터치의 거리와 지금 두 터치의 거리의 차이를 FleldOfView를 차감합니다.
            m_fFieldOfView -= fDis;
 
            // 최대는 100, 최소는 20으로 더이상 증가 혹은 감소가 되지 않도록 합니다.
            m_fFieldOfView = Mathf.Clamp(m_fFieldOfView, 20.0f, 100.0f);
 
            // 확대 / 축소가 갑자기 되지않도록 보간합니다.
            Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView, m_fFieldOfView, Time.deltaTime * 5);
 
            m_fOldToucDis = m_fToucDis;
        }
    }
}
 
 
cs

유니티에서 테스트가 안되기 때문에(테스트하는 방법을 아신다면 댓글 남겨주시면 감사하겠습니다.) 애뮬레이터로 테스트했습니다.

저는 미뮤를 이용하여 테스트했습니다.

가상 키로 터치하는 위치를 정하고 마우스 터치를 하면서 줌인/줌아웃을 확인했습니다.

실행하면 줌인/줌아웃이 제대로 실행되는 것을 확인할 수 있습니다.

 

 

반응형
  1. ㅇㅇ 2021.04.28 18:24

    스마트폰에서 usb 디버깅 모드를 활성화 하시고 유니티 리모트5 앱을 이용하면 apk 설치없이 연결이 가능하더라구요

반응형

안녕하세요.

오늘은 오브젝트를 따라다니는 HP UI를 만들어 보도록 하겠습니다.

 

 

오브젝트 생성 및 위치 설정

1. 메인 카메라 위치 설정

2. Cube 오브젝트(움직일 오브젝트) 생성 및 위치는 0, 0, 0으로 설정하고 Material을 추가하여 큐브색을 변경합니다.

3. Slider 오브젝트(HP바) 생성 및 설정

1) Handle Silde Area는 비활성화

2) 배경 및 채울색 설정

 

 

스크립트 추가

Cube에 스크립트를 추가합니다.

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class Mover : MonoBehaviour
{
    private GameObject m_goHpBar;
    private float m_fSpeed = 5.0f;
    void Start()
    {
        m_goHpBar = GameObject.Find("Canvas/Slider");
    }
 
    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.up * Time.deltaTime * m_fSpeed * fVertical, Space.World);
        // 테스트를 위한 키보드 이동 끝
 
 
        // 오브젝트에 따른 HP Bar 위치 이동
        m_goHpBar.transform.position = Camera.main.WorldToScreenPoint(transform.position + new Vector3(00.8f, 0));
    }
}
 
cs

 

 

 

반응형
반응형

안녕하세요

오늘은 유니티에서 진동을 울리는 방법에 대해 알아보도록 하겠습니다.

퍼즐게임에서 퍼즐을 잘못찾았거나 여러가지 경고를 띄울 때 주로 진동을 울리는 경우가 많이 있습니다.

이럴때 사용하는 진동을 유니티에서도 호출할 수 있습니다.

 

진동 울리는 함수

Handheld.Vibrate();

진동이 울려야 할 위치에 위의 함수를 호출하면 진동이 1초간 울립니다.

 

진동 세부설정

Handheld.Vibrate() 함수를 이용하면, 울리는 시간을 설정할 수 없고 1초간 진동이 울리는 것만 가능합니다.

1초말고 진동울리는 시간과 울리는 패턴 설정할 수 있습니다.

안드로이드 자바 클래스를 사용합니다.

사용하려면 진동권한이 필요합니다.

진동권한 추가를 위해서 매니페스트 수정이 필요합니다.

C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Apk

이 폴더에서 AndroidManifest.xml파일을 해당 프로젝트 폴더의 Asset\Plugins\Android\에 넣습니다.

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
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools"
    android:installLocation="preferExternal">
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>
 
    <application
        android:theme="@style/UnityThemeSelector"
        android:icon="@mipmap/app_icon"
        android:label="@string/app_name">
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
    <uses-permission android:name="android.permission.VIBRATE" />
</manifest>
 
 
cs

VIBRATE권한을 맨 밑에 </application>와 </manifest>사이에 넣으면 됩니다.

1
2
<uses-permission android:name="android.permission.VIBRATE" />
 
 
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
using System.Collections;
using UnityEngine;
 
public static class Vibration
{
#if UNITY_ANDROID && !UNITY_EDITOR
    public static AndroidJavaClass AndroidPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    public static AndroidJavaObject AndroidcurrentActivity = AndroidPlayer.GetStatic<AndroidJavaObject>("currentActivity");
    public static AndroidJavaObject AndroidVibrator = AndroidcurrentActivity.Call<AndroidJavaObject>("getSystemService""vibrator");
#endif
    public static void Vibrate()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        AndroidVibrator.Call("vibrate");
#else
        Handheld.Vibrate();
#endif
    }
 
    public static void Vibrate(long milliseconds)
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        AndroidVibrator.Call("vibrate", milliseconds);
#else
        Handheld.Vibrate();
#endif
    }
    public static void Vibrate(long[] pattern, int repeat)
    {
 
 
#if UNITY_ANDROID && !UNITY_EDITOR
        AndroidVibrator.Call("vibrate", pattern, repeat);
#else
        Handheld.Vibrate();
#endif
    }
 
    public static void Cancel()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
            AndroidVibrator.Call("cancel");
#endif
    }
 
}
 
cs

 

실제 사용 예제

위 스크립트를 Assets폴더에 추가를 합니다.

빈오브젝트를 생성해서 버튼 이벤트에 사용할 스크립트를 추가합니다.

ButtonEvent 스크립트를 다음과 같이 작성합니다.

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ButtonEvent : MonoBehaviour
{
    public void OnClick1()
    {
        Vibration.Vibrate((long)5000);
    }
 
    public void OnClick2()
    {
        long[] pattern = new long[4];
        pattern[0= 1000;
        pattern[1= 200;
        pattern[2= 1000;
        pattern[3= 200;
 
 
        Vibration.Vibrate(pattern, 1);
    }
 
    public void OnClick3()
    {
        long[] pattern = new long[4];
        pattern[0= 1000;
        pattern[1= 5000;
        pattern[2= 2000;
        pattern[3= 1000;
 
 
        Vibration.Vibrate(pattern, -1);
    }
 
    public void OnClick4()
    {
        Vibration.Cancel();
    }
}
 
 
cs

 

1. OnClick1() 함수는 5초동안 진동을 울립니다.

2. OnClick2() 함수는 1초쉬고 0.2초 울리고, 1초 쉬고, 0.2초 울린 후 1초에 한번씩 1초 진동을 반복합니다.

3. OnClick3() 함수는 1초쉬고 5초 울리고, 2초 쉬고, 1초 울린 후 반복되지 않습니다.

4. OnClick4() 함수는 진동 울리는 도중에 진동을 취소합니다.

그 후 버튼을 다음과 같이 4개 추가해서 추가합니다.

버튼에 OnClick1~onClick4를 다음과 같이 넣습니다.

Button에 OnClick1을 넣습니다.

Button (1)에 OnClick2을 넣습니다.

Button (2)에 OnClick3을 넣습니다.

Button (3)에 OnClick4을 넣습니다.

버튼을 누를 때마다 해당되는 이벤트가 실행되는 것을 확인할 수 있습니다.

그리고 검색하다가 Android 8.0(API 레벨 26)이상에서는 다르게 작업을 해야한다고 작업을 해야한다고 찾았는데, 갤럭시 S8(안드로이드 9.0)에서 테스트 했을 때 진동이 안울렸습니다.

혹시나 특정 최신 휴대폰에서 진동이 울리지 않는다면, 다음 웹페이지를 참조하시는 것도 좋을 것 같습니다.

https://gist.github.com/munkbusiness/9e0a7d41bb9c0eb229fd8f2313941564

 

Vibration for Unity3d with Android native Call that supports both the new vibrationEffectClass and the old simple vibrate, with

Vibration for Unity3d with Android native Call that supports both the new vibrationEffectClass and the old simple vibrate, with fallback to Handlheld.Vibrate(). - Vibration.cs

gist.github.com

안드로이드의 vibrate함수 사용은 다음 웹페이지에서 확인할 수 있습니다.

https://developer.android.com/reference/android/os/Vibrator#vibrate(long[],%20int)

 

Vibrator  |  Android 개발자  |  Android Developers

Vibrator public abstract class Vibrator extends Object java.lang.Object    ↳ android.os.Vibrator Class that operates the vibrator on the device. If your process exits, any vibration you started will stop. Summary Public methods abstract void cancel() Turn

developer.android.com

틀린 부분이나 제가 잘못 올린부분은 댓글을 남겨주시면 수정하도록 하겠습니다.

 

반응형
반응형

안녕하세요

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

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

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

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

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

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 실행화면

반응형
반응형

안녕하세요

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

바닥(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)를 따라서 카메라가 이동하게 됩니다.

 

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

감사합니다.

반응형
  1. ㅇㅇ 2021.04.08 22:50

    맨 윗 move코드
    transform.Translate(Vector3.foward * Time.deltaTime * m_fSpeed * fVertical, Space.World);


    foward -> forward 오타 같아요

반응형

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.

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

 

반응형
  1. 나그네 2020.01.05 22:24

    동일한 문제가 있었는데 덕분에 해결했습니다. 감사합니다.

  2. 유니티th 2020.02.19 11:32

    감사합니다~ 역시 지식은 공유하는 것이 쥬~

반응형

안녕하세요.

오늘은 간단하게 유니티 버튼 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 이펙트가 출력되는 것을 확인할 수 있습니다.

 

반응형
  1. 空空(공공) 2019.12.10 05:33 신고

    전문적인 내용 같아 보입니다..ㅎ
    도움 되시는분들 있겠죠?

  2. 가족바라기 2019.12.13 17:34 신고

    포스팅 잘보고 갑니다
    추워진 날씨 감기조심하세요^^

반응형

안녕하세요.

안드로이드 폰에 앱을 설치를 하면, 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"으로 변경됩니다.

반응형
  1. 空空(공공) 2019.12.09 07:44 신고

    이런 방법도 잇군요.
    알아 둡니다.^^

  2. Cargold 2020.12.31 00:45 신고

    우와ㅇ아아아ㅏㄱ!!!! 꿀정보 감사합니다아앗!!

반응형

.

안녕하세요.

[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

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

 

반응형
  1. 空空(공공) 2019.11.20 09:25 신고

    어려운 내용이네요^^
    즐거운 하루 되시기 바랍니다.

반응형

 

 

안녕하세요.

이 글은 이전에 작성한  [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

 

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

 

반응형

+ Recent posts