목차

반응형

래그돌을 멈추기 위한 두 가지 방법을 찾았다.

첫 번째 방법은 래그돌의 rigidbody를 kinematic으로 바꾸고 현재 가해져 있는 힘을 전부 없애버리는 것이다.

두 번째 방법은 래그돌을 꺼버리는 방법이다.

첫 번째 방법은 자연스러운 멈춤이고 두 번째 방법은 인위적인 멈춤이라고 생각한다.

왜 이렇게 생각이 드는지는 자세한 부분을 듣다 보면 알게 될 것이다.

또한 둘 다 장단점이 있는데 자세한 부분은 설명하면서 기재하도록 하겠다.

 

목차

1. 첫 번째 방법(자연스러운 멈춤)

2. 두 번째 방법(인위적인 멈춤)

3. 각 멈춤에 대한 설명

 

 

 

 

1. 첫 번째 방법(자연스러운 멈춤)

먼저 구현해보고자 하는 멈춤 방식은 다음과 같다.

public Rigidbody body;

public void Freeze()
    {
        body.isKinematic = true;
        body.velocity = Vector3.zero;
        body.angularVelocity = Vector3.zero;
    }
    
public void UnFreeze()
    {
        body.isKinematic = false;
    }

Freeze 함수를 호출하면 동영상처럼 멈추게 되는 것을 알 수 있다.

추가로 알아야 하는 점이라면 물체가 가진 힘을 전부 없애고 싶은 경우(동영상의 세 번째 테스트처럼 래그돌이 날아가다가 모든 힘을 잃고 현재 자리에서 멈추도록 하는 것) Freeze함수를 호출하고 바로 UnFreeze함수를 호출하면 아무 일도 일어나지 않는다.

곰곰이 생각해봤는데 Freeze함수를 호출해서 힘을 전부 다 잃고 나서 프레임이 지나서 해당 물리가 적용되기도 전에 UnFreeze로 다시 원상복구가 돼서 그런 것이 아닐까 생각이 든다.

만약 해당 사항을 스크립트로 적용하고 싶다면 아래처럼 하면 된다.

Freeze();

Invoke("UnFreeze",0.1f);

Freeze에 대한 물리가 적용되고 나서(아마 한 프레임밖에 소요되지 않을 것이라고 생각한다.(UnFreeze에 대한 내용을 FixedUpdate에다가 넣어줘도 되지 않을까 싶다.)

 

 

2. 두 번째 방법(인위적인 멈춤)

위와 같은 멈춤은 매우 간단하다. 위의 멈춤은 뭐랄까 메쉬는 남겨두고 래그돌을 꺼준다고 생각하면 된다.

body.gameObject.SetActive(false);

 

 

 

 

3. 각 멈춤에 대한 설명

각 멈춤은 매우 차이가 크다.

자연 멈춤과 인위 멈춤이라고 명칭을 정하겠다.

자연 멈춤은 멈추고 다시 복원해도 힘을 다 잃어서 연속성이 없다. 그리고 인위 멈춤에 비해서 완전히 얼음!!! 처럼 멈춘다는 느낌은 부족하다. 아마도 모델의 모든 rigidbody를 배열로 받아서 모든 포지션을 저장하고 코루틴으로 해당 rigidbody들의 위치를 계속해서 유지하도록 하면 비슷하게나마 구현할 수 있지 않을까 생각 든다.

인위 멈춤은 멈추고 다시 복원하면 이전의 힘을 그대로 유지한다. 잠깐 래그돌을 껐다가 켜주는 거라서 물리 사항에는 변동이 없다. 굉장히 좋다고 생각할 수 있지만 아래 사진을 보면 인위 멈춤의 부작용이 하나 있다.

아래 사진은 각각의 멈춤을 계속해서 진행하고 나서 래그돌의 상태를 캡처한 것이다.

자연멈춤 / 인위멈춤

몇 번밖에 멈춤을 반복하지 않았다. 자연 멈춤은 아무 문제가 없고 인위 멈춤은 완전히 뒤틀려있음을 볼 수 있다.

인위 멈춤의 경우 충돌로 본이 꼬였을 때 멈추면 해당 상태가 그대로 저장이 된다. 마치 고무가 탄성을 잃는 것이다.

만약에 래그돌을 한두 번만 사용하는 경우라면 인위멈춤을 사용해도 괜찮지만 계속해서 사용해야 하는 경우 비정상적인 결과를 초래하기 때문에 전자의 자연 멈춤을 사용할 수밖에 없을 것이다.

인위 멈춤 방식을 사용해도 계속해서 부위가 꼬이지 않도록 하는 방법을 찾아봤으나 정보가 없었다.

 

 

 

 

유니티 ragdoll 발사하기 글 모음

1. 목차

2. 래그돌 만들기

3. 래그돌 발사하기

4. 래그돌이 날아갈 때 한쪽 축으로만 이동되게 하기

5. 현재 래그돌이 멈췄는지 안멈췄는지 판단하기

6. 래그돌 멈추기

7. 래그돌 고장 방지

반응형
반응형

이 부분은 스크립트만으로 판단한다.

보통이라면 오브젝트의 velocity로 확인을 할 테지만 래그돌이 잠깐 부딪혀서 일시적으로 속도가 0에 가까워지는 경우가 있을 것이고 거의 멈췄으나 경사면이라서 넘어지는 경우도 있을 것이다.

잠깐만 생각해보면 멈췄는지 확인하려면 반드시 일정 시간 동안 움직임이 없는지 확인해야 한다.

 

래그돌에는 여러 신체에 rigidbody가 있는데 팔이나 발 같은 경우 미세한 떨림이 발생할 수 있다.

따라서 몸의 움직임이 가장 적을 것으로 예상되는 pelvis나 spine을 rigidbody로 하는 것이 좋겠다.

 

public Vector3 originPosition;
private int stopCount;

private IEnumerator EnumCheckIsGoatStop()
    {
        while (true)
        {
            if (originPosition!=null)
            {
                //이전 저장위치와의 거리차이가 거의 없는 경우
                if ((spine.transform.position - originPosition).magnitude < 0.01f)
                {
//                    Debug.Log(stopCount);
                    //카운트 증가
                    stopCount++;
                    //카운트가 10번 연속으로 증가하면 멈춤상태
                    if (stopCount > 10)
                        IsGoatStop = true;
                    else
                        IsGoatStop = false;
                }
                else
                {
                    IsGoatStop = false;
                    stopCount = 0;
                }
            }
            originPosition = spine.transform.position;   
            yield return new WaitForSeconds(0.01f);
        }
    }

위의 스크립트는 originPosition에 현재 위치를 저장하고 코루틴이 돌기전에 이전 위치와 비교해서 위치 차이가 0.01f 이하라면 정지라고 1회 카운트를 해준다.

그리고 0.01초 뒤에 다시 코루틴을 시작해서 이번에도 이전 위치와 현재 위치 차이가 0.01 이하라면 정지 카운트에 1을 더해준다.

만약 위치 간의 차이가 0.01보다 크면 정지 카운트를 0으로 초기화하고 정지 판단 불 변수 IsGoatStop을 false로 한다.

 

만약 더 정밀한 정지 판단을 원한다면 if ((spine.transform.position - originPosition).magnitude < 0.01f) 에서 0.01f를 더 낮은 수치로 바꾸면 되겠다.

그리고 정지 판단이 되기까지 가장 빠르면 0.01초 x 10 => 0.1초의 시간이 소요되는데 더 빠르게 판단을 하고 싶다면 

yield return new WaitForSeconds(0.01f);의 0.01f의 값을 더 낮은 수치로 바꾸면 되겠다.

 

rigidbody 오브젝트가 생성되고 나서 StartCoroutine("EnumCheckIsGoatStop");를 통하여 코루틴을 실행하면 되겠다.

 

 

 

유니티 ragdoll 발사하기 글 모음

1. 목차

2. 래그돌 만들기

3. 래그돌 발사하기

4. 래그돌이 날아갈 때 한쪽 축으로만 이동되게 하기

5. 현재 래그돌이 멈췄는지 안멈췄는지 판단하기

6. 래그돌 멈추기

7. 래그돌 고장 방지

반응형
반응형

래그돌을 날리는 것까지는 됐는데 2D 환경에서는 한쪽 축 없이 잘 이동하겠지만 3D 환경에서는 한쪽 축으로만 이동시키려면 다른 방법이 필요하다.

일단 rigidbody의 freeze position을 사용하면 어색하기 때문에 다음과 같은 방법을 사용함을 밝힌다.

이번 내용 역시 짧아서 목차없이 진행한다.

 

엄청 커서 캐릭터가 넘어가지 못하도록 벽의 역할을 할 큐브 2개를 소환한다.

위와 같이 양옆을 막아줘야한다.

 

벽의 Mesh Renderer를 삭제해서 안 보이도록 해준다.

 

public class testGoat : MonoBehaviour
{
    public Rigidbody body;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            Vector3 diffVector = new Vector3(1, 1, 0);
            body.AddForce(diffVector * 1500);
        }
    }
    
    public GameObject Wall1;
    public GameObject Wall2;

    private void FixedUpdate()
    {
        Vector3 tempPos = body.transform.position;
        
        tempPos.z = Wall1.transform.position.z;
        Wall1.transform.position = tempPos;
        
        tempPos.z = Wall2.transform.position.z;
        Wall2.transform.position = tempPos;
    }
}

기존의 캐릭터 스크립트에 위와 같이 FixedUpdate와 Wall1, Wall2 변수를 작성한다.

 

익스펙터에서 넣어준다.

 

그러면 캐릭터가 어떻게 움직여도 한쪽 방향으로만 움직이게 된다.

 

 

 

유니티 ragdoll 발사하기 글 모음

1. 목차

2. 래그돌 만들기

3. 래그돌 발사하기

4. 래그돌이 날아갈 때 한쪽 축으로만 이동되게 하기

5. 현재 래그돌이 멈췄는지 안멈췄는지 판단하기

6. 래그돌 멈추기

7. 래그돌 고장 방지

반응형
반응형

이제 래그돌을 만들었다면 발사하면 된다.

이 부분은 내용이 짧아서 목차 없이 진행하겠다.

 

public class testGoat : MonoBehaviour
{
    public Rigidbody body;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            Vector3 diffVector = new Vector3(1, 1, 0);
            body.AddForce(diffVector * 1500);
        }
    }
}

위 스크립트는 키보드 A를 누르면 body라는 리지드바디 오브젝트를 1,1,0 벡터로 쏴주는 스크립트다.

해당 스크립트의 Rigidbody를 지정해줘야한다.

 

힘을 어디에 주느냐는 본인의 상황에 맞춰서인데 나는 척추에다가 힘을 줘서 몸통이 날아가는 느낌을 주고 싶었다.

 

rigidbody 컴포넌트에 작동을 시켜야 하니 래그돌을 생성할 때 지정했던 오브젝트 부분에 다가만 힘을 줄 수 있음을 추측할 수 있다.

 

근데 오브젝트를 날리다가 보면 충돌로 인해서 다른 방향으로 가게 되는데 이 문제를 해결하는 방법은 다음에 소개하도록 하겠다.

 

 

유니티 ragdoll 발사하기 글 모음

1. 목차

2. 래그돌 만들기

3. 래그돌 발사하기

4. 래그돌이 날아갈 때 한쪽 축으로만 이동되게 하기

5. 현재 래그돌이 멈췄는지 안멈췄는지 판단하기

6. 래그돌 멈추기

7. 래그돌 고장 방지

반응형
반응형

이번 글에서는 래그돌을 만드는 부분에 대해서만 설명하도록 하겠다.

 

목차

1. 모델 rig 휴머노이드 변경해서 본 정보 알아내기

2. 래그돌 생성

3. 충돌 테스트

4. 발생하는 문제

 

 

 

1. 모델 rig 휴머노이드 변경해서 본 정보 알아내기

모델 파일에서 신체 구조에 대한 하이어라키를 잘 알고 있다면 1번은 스킵해도 무방하다.

모델 파일에 대해서 잘 알지 못해서 확인해보고 싶다면 진행을 추천한다.

본인은 동물 모델이라서 구분이 좀 애매해서 진행하였다.

 

프로젝트 탭에서 모델 파일 선택 > Rig 선택

 

애니메이션 타입 > 휴머노이드 선택

 

Configure 클릭

 

그럼 위와 같이 모델과 각 신체에 해당하는 부위에 대하여 나와있다.

만약 왼쪽의 인스펙터 같이 신체의 부위에 대한 할당이 되어 있지 않다면

 

하단의 Pose > Enforce T-Pose로 설정하면 신체 부위가 알아서 할당이 될 것이다.

 

알아야 하는 신체 부위를 인스펙터에서 클릭하면 하이어 라키에서 어디인지 알려준다.

 

래그돌을 생성하기 위해 알아야 하는 신체 부위는 위와 같으니 미리 적어놓던가 하자

 

2. 래그돌 생성

모델을 게임오브젝트로 생성해준다.

 

게임 오브젝트 우클릭 > 3D Object > Ragdoll

 

래그돌 생성을 하기 위해서는 우측의 창에 하이어라키에 해당하는 신체 부위를 끌어다가 놔야 한다.

 

대략적인 설명을 해주자면(나도 모델링은 잘 몰라서 자세한 부분은 모르지만 이렇게 생각하고 작업을 하면 잘 되었다. 틀리거나 이상한 부분에 대한 지적은 환영)

1. Pelvis 골반 - 8의 척추와 헷갈리지만 척추가 조금 더 위에 있다고 생각하면 될 듯하다.

2. Hips 엉덩이

3. Knee 무릎

4. Foot 발

5. Arm 팔(대략 팔꿈치와 어깨 사이 정도를 말하는 듯하다)

6. Elbow 팔꿈치

7. Head 머리

8. Middle Spine 척추

 

정상적으로 넣고 Create를 한다면 위와 같이 모델에 대한 래그돌이 생성될 것이다.

 

3. 충돌 테스트

래그돌을 생성했다면 정상적으로 작동하는지 확인이 필요할 것이다.

 

3D 큐브를 하나 생성하고 그 위에 래그돌을 놓고 게임을 시작하고 위로 들어 올려서 떨어뜨려보면서 정상적으로 충돌이 일어나는지 확인해 보자.

 

4. 발생하는 문제

마구 떨어뜨리다 보면 문제가 이것저것 발생하는데 내가 발생했던 문제를 기재하였다.

 

- 게임을 시작하자마자 신체의 일부가 가만히 있고 연결 부위가 엿처럼 쭈욱 늘어남

래그돌 생성 시 신체 부위를 잘못 매칭 시켜서 그렇다. 목차의 1번 부분을 확인해서 정확한 신체 부위를 확인하고 다시 제대로 매칭 시켜보자

 

- 신체의 일부가 바닥을 뚫고 들어가면서 엄청 흔들거리고 투다다닫갇 거린다.

신체의 일부의 콜라이더가 적합하게 설정이 안 되어있다고 짐작되는데 

위와 같이 염소의 머리에 비해서 Sphere Collider가 작게 지정되어있어서 정상적인 충돌이 일어나지 않았다.

콜라이더가 충분히 염소의 머리를 뒤엎을 정도로 설정하자.

 

또는

Edit -> Project Settings -> Physics -> Solver Iteration Count를 높여주자 10~20으로 바꿔보자

 

- 다 좋은데 래그돌이 너무 빨리 충돌하면 가끔 바닥을 뚫고 들어간다.

물체의 관절마다 달려있을 Rigidbody 컴포넌트의 Collision Detection을 Continuous Dynamic으로 지정해준다.

연속적인 충돌 탐지를 하도록 하면 속도가 너무 빠른 오브젝트가 물체를 뛰어넘어 버리는 현상을 해결해준다.

 

 

유니티 ragdoll 발사하기 글 모음

1. 목차

2. 래그돌 만들기

3. 래그돌 발사하기

4. 래그돌이 날아갈 때 한쪽 축으로만 이동되게 하기

5. 현재 래그돌이 멈췄는지 안멈췄는지 판단하기

6. 래그돌 멈추기

7. 래그돌 고장 방지

반응형
반응형
래그돌 날리는 프로젝트

 

유니티에서 래그돌을 날려버리는 부분을 구현하는데 생각보다 막혔던 부분과 어려운 점이 많았다.

큼직한 이슈가 무려 7개나 있는데 한 번에 다 쓰기에는 양이 너무 많아서 나눠서 쓰고자 한다.

위 동영상처럼 구현하려면 더 많은 기능이 필요하기 때문에 래그돌 발사하는 부분만 중점적으로 다루겠다.

 

 

유니티 ragdoll 발사하기 글 모음

1. 목차

2. 래그돌 만들기

3. 래그돌 발사하기

4. 래그돌이 날아갈 때 한쪽 축으로만 이동되게 하기

5. 현재 래그돌이 멈췄는지 안멈췄는지 판단하기

6. 래그돌 멈추기

7. 래그돌 고장 방지

반응형
반응형

IAP 모듈을 사용하려는데 어쩌다가 소스가 조금 더러워졌는데 그 이후로 계속해서 아래 오류가 뜨면서 IAP가 작동을 안하고 컴파일이 안된다.

Assets/MoPub/Scripts/IapManager.cs(81,53): error CS0103: The name 'StandardPurchasingModule' does not exist in the current context

Assets/MoPub/Scripts/IapManager.cs(123,37): error CS0103: The name 'GooglePlay' does not exist in the current context

 

서비스로 가서 IAP reimport 하라고 해도 안된다.

 

그럴때는 Assets/Plugins/UnityPurchasing 폴더로 가보면 3개의 unitypackage 파일이 있을터인데

그 3개의 unitypackage 파일을 전부다 불러와서 덮어씌워주자

그러면 깔끔하게 해결된다.

반응형
반응형

구글 플레이 스토어에 앱을 출시하려고 보면 안드로이드 앱 번들로 만든 앱이 아니라고 괜히 신경쓰이게 경고 표시를 띄워준다.

플레이 스토어 기존 apk 방식 업로드

 

 

그래서 그 잘나신 안드로이드 앱 번들이 뭔가요 찾아봤는데 되게 좋은 것 이었다.

안드로이드 번들에 대한 간략한 설명은 많이 나와있으니 다른 블로그를 참고하자

https://eso0609.tistory.com/68

 

기존 앱에 App Bundle 적용하기

2018 Google IO에서 App Bundle에 대한 세미나를 들었습니다. '적용해야지' 말만 하다가 이번 기회에 적용해보았습니다. App Bundle 이란? App Bundle 이란 APK 와 비슷하지만 모든 코드, 리소스, CPU 아키텍처와..

eso0609.tistory.com

요약하자면 설치파일을 핸드폰 기종별로 최적화되도록 설정해서 앱 용량을 최적화하는 기법이다.

 

다만 귀찮게도 안드로이드 앱 번들 기능을 사용하기 위해서는 서명이 필요하다.

 그 방법에 대하여 설명하도록 하겠다.

 

목차

1. 구글 플레이 스토어 서명 페이지

2. 암호화된 서명 파일 생성

3. 유니티에서 안드로이드 앱 번들로 프로젝트 빌드

4. 플레이 스토어에 업로드

 

 

 

 

1. 구글 플레이 스토어  서명 페이지

> 출시 관리 > 서명 페이지로 이동

 

'첫번째 Android 스튜디오에서 내보낸 키를 업로드 합니다.' 선택 (2, 3번은 한 두시간 걸쳐서 시도해봤으나 실패)

1번 방법으로 하기 위해서는 keystore파일이 필요하다.

keystore 파일이 없다면 아래 블로그를 참고하여 생성하도록 하자.

https://m.blog.naver.com/PostView.nhn?blogId=lyw94k&logNo=221290872599&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

유니티 Keystore 생성하는 방법 (안드로이드 빌드)

유니티 Keystore 생성하는 방법 (안드로이드 빌드) (Unity Android Build Create Key 키스토어) 간단...

blog.naver.com

 

 

 

 

2. 암호화된 서명 파일 생성

 

keystore파일을 안드로이드 스튜디오를 통하여 암호화를 거쳐 pepk라는 암호화된 서명파일이 필요하다.

Build > Generate Signed Bundle / APK …

안드로이드 스튜디오에서 Build > Generate Signed Bundle / APK …

 

 

상단의 안드로이드 앱 번들 체크, Next

 

Choose existing > 기존에 만들어 두었던 keystore 파일을 선택

키스토어 파일을 생성할때 입력하였던 Key store password, 지정한 Key alias, Key password를 입력한다.

하단의 Export encrypted key for enrolling pusblished apps in Google Play App Signing 체크

Next

 

Destination Folder에서 내보내기 할 경로 선택 > release 선택 > Finish

 

그러면 다음과 같이 pepk파일이 생성된다.

 

해당 파일을 플레이 스토어에서 아까 파일 업로드하는 곳에 업로드 해주면 인증이 된다.

 

 

3. 유니티에서 안드로이드 앱 번들로 프로젝트 빌드

안드로이드 빌드 환경에서 Build App Bundle을 체크해준다.

aab 파일이 만들어진다.

 

 

4. 플레이 스토어에 업로드

 

해당 파일을 apk파일을 올리던 것 처럼 플레이 스토어에 올린다.

알아서 분석을 해주는데 기다리면 된다.

기존 60메가 하던 apk가 40메가대로 줄었다.

 

반응형
반응형

유니티의 애드몹은 안내가 매우 친절해서 딱히 가이드까지 올릴 필요는 없지만 가이드에 나와있지 않은 오류들을 설명하고자 한다.

 

유니티 애드몹 광고 출시 버전 모아놓은 곳

https://github.com/googleads/googleads-mobile-unity/releases

 

googleads/googleads-mobile-unity

Official Unity Plugin for the Google Mobile Ads SDK - googleads/googleads-mobile-unity

github.com

 

2019년 8월 1일 기준 유니티 애드몹 최신 버전은 3.18.2다.

적용도중 발생한 오류들을 기재하겠다.

 

목차

1. 애드몹 패키지 resolve 오류

2. 앱 빌드, 실행 시 AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.initialization.OnInitializationCompleteListener 오류

3. 앱 빌드, 실행 시 java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException 오류

4. 광고 테스트 시 유의 사항

 

 

1. 애드몹 패키지 resolve 오류

애드몹 패키지 임포트 후 android dependency resolve 과정

 

android resolve 도중 오류 발생

유니티 애드몹 패키지 임포트를 하면 알아서 android resolve를 진행하지만 위와 같이 Resoultion failed가 발생하면서 정상적으로 유니티 애드몹 패키지의 설치가 되지 않는다.

이 에러를 무시하고 빌드를 하게 되면 본문의 2번 오류로 이어질 가능성이 높다.

해당 에러 메시지가 난 후 Assets\Plugins\Android 경로로 이동해서 jar, aar 파일이 충분히 있는지 확인해보자

본인은 resolution failed 에러로 인하여 jar 파일과 aar 라이브러리 파일이 충분히 설치되지 않아서 빌드하고 실행하면 에러로 이어졌다.

정상적으로 설치가 되었다면 아래와 같이 파일들이 있어야 한다.

유니티 애드몹 패키지 정상 설치

해결 방법

간단하다. 현재 본인이 설치한 유니티 애드몹 패키지보다 높거나 낮은 버전으로 설치해본다.

본인은 2019.1.8f1 버전으로 Google Mobile Ads Unity Plugin v3.18.2를 설치했으나 위의 오류가 발생해서

3.18 버전으로 설치했더니 잘 작동했다.

https://github.com/googleads/googleads-mobile-unity/releases/tag/3.18.0

 

googleads/googleads-mobile-unity

Official Unity Plugin for the Google Mobile Ads SDK - googleads/googleads-mobile-unity

github.com

 

 

2. 앱 빌드, 실행 시 AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.initialization.OnInitializationCompleteListener 오류

1번의 연장선상의 문제인데 이 에러는 되게 자주 보는데 설치가 정상적으로 안됐을때 뿐만 아니라 설치를 정상적으로 했지만 라이브러리에 필수 요소가 빠져있거나 하면 자주 만나는 오류 메시지다.

스스로 원인을 파악하고 해결 방법을 찾아내는 방법 과정에 대해서 말하겠다.

 

저 오류 메시지는 라이브러리 파일안에 OnInitializationCompleteListener 클래스가 없어서 발생하는 오류다.

일단 Assets\Plugins\Android 폴더로 가면 aar 파일과 jar 파일이 있다.(본인의 경우 해당 오류가 발생했을때 unity-plugin-library.jar 파일 하나밖에 없었다.)

파일을 압축해제 프로그램으로 열어보면

 

해당 라이브러리는 com.google.unity.ads 형식의 구조를 가지고 있음을 알고 있다.

아까 오류 메시지에서는 com.google.android.gms.ads.initialization.OnInitializationCompleteListener이라고 했으니까 구조가 달라도 한참 다르다는 것을 알 수있다.

(이번에 발생한 오류는 위의 오류가 아니지만 jar 파일들을 뒤지다가 오류와 똑같은 구조지만 에러가 발생하는 경우는 라이브러리의 버전이 달라서 발생하는 오류다.)

그렇다면 도대체 어떤 라이브러리를 받아야 저 클래스가 있는지 확인해보도록 하자

 

확인하는 방법은 maven 라이브러리 사이트로 가서 해당 구조를 검색하면 된다.

https://mvnrepository.com/artifact/

 

Maven Repository: com.google.android.gms » play-services-ads

 

mvnrepository.com

 

어느정도 상위 구조에서 검색을 한다. com.google.android.gms로 검색을 하였다.

검색 결과가 매우 많다. gms 아래에 다양한 서비스가 존재해서 그렇다.

그 중에 우리는 ads에 대하여 설치를 했지만 오류가 생긴것이니까 3번째가 가장 의심된다. 들어가보도록 하자

 

다양한 버전이 있는데 최신 버전을 눌러보자

 

Gradle을 선택하고 하단에 가보면 저렇게 다양한 하위 라이브러리들이 존재함을 알 수 있다.

분명 저중에 하나의 라이브러리는 com.google.android.gms.ads.initialization.OnInitializationCompleteListener 클래스를 가지고 있을 것 이다.

하지만 나한테는 지금 하나의 jar 파일밖에 없으니까 라이브러리의 설치가 정상적으로 진행되지 않았음을 짐작할 수 있다.

시도해볼수있는 방법은 저 라이브러리를 수동으로 다운받아서 넣어주거나 gradle에다가 넣어서 설치해봐도 되지만 android resolve 과정에서 오류가 났기 때문에 쉽게 해결될 오류가 아니라서 유니티 애드몹 버전을 낮추거나 높여서 설치해보도록 하자.

 

 

3. 앱 빌드, 실행 시 java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException 오류

 

앱을 빌드하고 실행하면 바로 종료되면서 아래 오류가 발생한다.

 

유니티 애드몹 키값을 입력하지 않아서 발생하는 문제다.

 

위의 경로로 따라가서 app id를 기입해주면 정상작동 한다.

 

4. 광고 테스트 시 유의 사항

요건 나도 몰랐던건데 애드몹에서 광고 작동 테스트를 하려고 광고 호출할때는 항상 테스트 광고를 사용하라는 경고가 있다.

광고를 탭하지 않아도 정지당할 수 있다니까 꼭 유의해야겠다.

반응형
반응형

UI 작업을 하다보면 클릭 버튼의 영역이 너무 작아서 좋은 UX를 제공하기 위해서 일부러 실제 이미지보다 클릭 영역을 확장하는 경우가 있다.

 

해결 방법은 간단하기 때문에 목차없이 글을 쓰도록 하겠다.

왼쪽 : 클릭 영역 확장하기 전 // 오른쪽 : 확장 후

원래는 안의 사각형이 버튼의 클릭 영역이지만 안에 빈 이미지를 추가해주면 다음과 같이 클릭 영역이 늘어난다.

 

방법은 다음과 같다.

캔버스에 다음과 같이 버튼을 추가한다.

 

버튼 하위의 텍스트 오브젝트를 지우고 Image의 스프라이트를 제거하고 투명하게 바꿔주고 크기를 원하는 크기로 정한다.

 

버튼에 2개의 이미지를 추가한다.

 

Image가 톱니바퀴 이미지고 Image(1)이 클릭 영역 확장을 위한 이미지로 이미지의 색을 투명하게 바꿔준다.

 

부모 버튼의 Target Graphic을 형체가 있는 이미지로 바꿔준다.

 

늘어난 투명 영역도 클릭 영역에 포함된다.

반응형