목차

반응형

유니티 빌드할때 apk 파일 용량 확인하는 방법.

일단 Android apk 빌드를 한다.

 

 콘솔 우클릭 > Open Editor Log

 

로그 파일을 위로 쭉 올리다보면 어떤 파일이 얼마나 용량을 차지하는지 나와있다.

반응형
반응형

애드몹에서 리워드 비디오를 보면 보상을 설정하고 싶은데 나와있는 부분이 하나도 없다.

마치 전세계가 약속을 한 것처럼 아무도 그 부분에 대해서 언급을 안한다. 덕분에 별거아닌데 삽질을 엄청했다.

 

https://developers.google.com/admob/android/rewarded-video?hl=ko

 

보상형 동영상 광고  |  Android  |  Google Developers

보상형 동영상 광고는 동영상 광고를 끝까지 시청한 사용자에게 인앱 보상을 제공하는 전체화면 동영상 광고입니다. 이 가이드에는 AdMob의 보상형 동영상 광고를 Android 앱에 게재하는 방법이 나와 있습니다. 기본 요건 보상형 동영상 광고 초기화 자바 package ... import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.MobileAds; import com.g

developers.google.com

여기 보면

이걸로 광고를 호출하고

 

이걸로 광고 보상을 지급해준다는데

 

저 Reward args는 대체 어떻게 전달해주냐 이거다

 

 

무려 유니티에서 하는 것이 아니라 애드몹에서 RV를 설정하는 부분에서 설정해야한다. 리워드를 클릭한다.

 

여기서 이렇게 설정을 하는 것이었다.

 

리워드를 생성하고나서 발급받은 광고키를 적용한다.

 

나는 위와 같이 설정하였다.

 

로그캣에서 찍히는 값이다.

만약 애드몹에서 기본적으로 제공하는 기본 광고키를 사용하면 amount는 10, Type은 coins가 나올 것이다.

반응형
반응형

증상

고프로 영상은 기본적으로 mp4 영상인데 편집하려고 베가스에서 열려고 하면 안열린다.

none of the file dropped on vegas could be opened.

none of the file dropped on vegas could be opened.

 

mp4 could not be opened.

mp4 could not be opened.

뭐 어쩌자는거...

 

해본것들

1. QuickTime Player 7.6버전, 최신버전 설치, K-Lite Codec Pack 설치

퀵 타임 플레이어의 문제라고 해서 퀵 타임 플레이어를 설치해보고 영상을 불러와보니

퀵 타임 플레이어 재생 오류

하 빡치네... 진짜 그냥 하지말라는건가?

찾아보니 K-Lite Codec Pack을 설치하면 해결될거라 하는데 응 안돼~

 

이것저것 뒤져보니 퀵타임 플레이어에서 정상적으로 영상 재생만 되면 뭔가 베가스에서도 잘 불러와질것같은데 진짜 2시간정도 삽질하다가 아래 다른 방법으로 해결했다.

 

해결 방법

진짜 싫지만 그냥 mp4 영상을 따로 인코딩해서 불러오는 것이다.

나도 진짜 싫지만 그냥 이 문제가 발생해서 들어온 사람들은 내 말을 따르는게 생각보다 시간도 얼마 안걸리고 정신건강에 훨씬 유익함을 알린다.

그럼 또 막 개같은 인코딩 프로그램 깔아서 바이러스 걸리고 이럴 걱정을 할 수도 있지만 좋은 동영상 인코딩 프로그램을 찾았다.

https://shana.pe.kr/shanaencoder_download

 

샤나인코더 다운로드

 

shana.pe.kr

 

끝까지 읽으라! 설정할게 더 있다 가서 설치하고

 

파일 추가 > 빠른 설정

위와 동일하게 설정하고 인코딩을 하면 된다.

베가스에서 호환하는 다른 확장자와 다른 인코딩도 있지만 대다수는 베가스에서 마찬가지로 못불러오거나 화질이 떨어지는 현상이 발생했다.

위와 같이 설정하면 적어도 내 눈으로는 원본과 화질차이가 없었다.

반응형
반응형

오 드뎌 마지막이다 이번엔 별다른 건 아니고 래그돌이 자꾸 고장 나는 경우가 있는데 그 부분에 대해서 간단하게 기재하고 마무리하고자 한다.

 

https://docs.unity3d.com/kr/530/Manual/RagdollStability.html

 

유니티 - 매뉴얼: Joint And Ragdoll Stability

Joint And Ragdoll Stability Tips for improving joint and ragdoll stability. Avoid small joint angles of “Angular Y Limit” and “Angular Z Limit”. Depending on your setup the minimum angles should be around 5 to 15 degrees in order to be stable. Instead of u

docs.unity3d.com

항목

1. Enable prjection

2. 래그돌 재생성

3. 인위적인 멈춤 사용하지 않기

4. 부위 떨림 발생

 

 

 

1. Enable prjection 활성화

 

구글에서 unity ragdoll strech 라고 검색해보면 대부분 관절에 붙어있는 Enable proejction을 켜주라고 말한다.

 

Enable projection을 하면 무슨 원리로 안정적으로 되는 건지 찾아보았으나 정확한 정보는 얻지 못했고 디컴파일러로 열어보니 해당 불린 변수에 대한 주석으로 위와 같이 나와있었다. 아마 정상적이지 못한 래그돌의 흔들림처리를 이전 상태로 다시 되돌려주는 것이 아닐까 추측해본다.

 

 

2. 래그돌 재생성

나의 경우 래그돌이 두 개의 문제가 있었다. 하나는 래그돌의 양팔이 벌려지고나서부터는 접혀지지가 않는 문제였고 다른 문제는 신체의 일부가 가만히 있고 연결부위가 엿처럼 쭈욱 늘어나는 문제였는데 둘다 래그돌 생성 시 올바른 오브젝트를 매칭 시키지 않아서 발생한 문제였다.

유니티 ragdoll 발사하기 - 2.래그돌 만들기 - 1. 모델 rig 휴머노이드 변경해서 본 정보 알아내기 부분을 참고해서 래그돌을 다시 생성해보도록 하자.

 

 

3. 인위적인 멈춤 사용하지 않기

리지드 바디를 껐다가 켜주면 래그돌이 고장날수도 있다고 적어놨는데 해당 부분을 참고하도록 하자. 고장의 원인이 이것일 수도 있다.

유니티 ragdoll 발사하기 - 6. 래그돌 멈추기 - 글의 2. 두 번째 방법(인위적인 멈춤) 참고

 

 

4. 부위 떨림 발생

래그돌의 일부가 투두ㅜㄱㄷ구국두 하면서 계속 떨린다면

Edit -> Project Settings -> Physics -> “Solver Iteration Count”를 높여보도록 하자

유니티 ragdoll 발사하기 - 2.래그돌 만들기 - 글의 3. 충돌 테스트 참고

 

 

 

 

유니티 ragdoll 발사하기 글 모음

1. 목차

2. 래그돌 만들기

3. 래그돌 발사하기

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

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

6. 래그돌 멈추기

7. 래그돌 고장 방지

반응형
반응형

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

첫 번째 방법은 래그돌의 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. 래그돌 고장 방지

반응형