반응형

 

 

 

 

유니티 에셋스토어에서 받은 모델에 베지어 커브로 움직이는 스크립트가 있었는데, 해당 스크립트를 Record기능으로 녹화를 하면 다음과 같은 에러가 발생했다.

 

- Invalid AABB

- Assertion failed on expression: 'IsFinite(distanceForSort)'

- Assertion failed on expression: 'IsFinite(distanceAlongView)'

 

구글링을 해봤는데 어떤 글에서는 모델의 문제라고 하고, 어떤 글에서는 Physics 설정문제라는 글이 보였는데..

나같은 경우엔 0으로 나눗셈을 하는데서 발생하는 에러였다.

 

베지어 커브 스크립트에 변수를 Time.deltaTime으로 나누는 코드가 있었는데, Time.deltaTime을 Record로 녹화를 시작하면 값이 0이되는것같다.

그래서 Time.deltaTime을 고정값으로 따로 수정하니 해당 에러가 발생하지 않고 정상적으로 작동했다.

 

 

 

 

반응형
반응형

 

 

 

 

인벤토리 구현하는 중에 Toggle과 ToggleGroup을 사용하던 중, 인벤토리를 껐다켜면 첫번째 토글이 무조건 활성화되게 하려고 OnEnable함수에서 toggle.isOn의 값을 변경했는데, onValueChanged와 같은 콜백은 호출이 되지만 ToggleGroup이 작동을하지 않아서 첫번째 토글이 활성화되지 않았다.

찾아보니 Toggle의 OnDisable에서 ToggleGroup에 등록된 자신을 해제한다고한다. (대체 왜..?)

 

즉, 각 Toggle 컴포넌트가 비활성화되면 ToggleGroup에서 자신을 해제하고 활성화되면 재등록이 이루어지는것 같다.

(ToggleGroup에서 OnEnable함수에 m_Toggles.Count의 로그를 찍어보면 0으로 나온다.)

 

결국 ToggleGroup하고 Toggle을 상속받는 새 컴포넌트를 만들어 Toggle의 OnDisable을 override로 재정의해줘서 해결했다.

 

 

Toggle 컴포넌트

using UnityEngine.UI;

public class SlotToggle : Toggle
{
    protected override void OnDisable() { }
}

 

 

ToggleGroup 컴포넌트

using UnityEngine.UI;

public class InventoryToggleGroup : ToggleGroup
{
    protected override void OnEnable()
    {
        var toggle = GetFirstToggle();
        if (toggle != null)
        {
            toggle.isOn = true;
        }
    }

    private Toggle GetFirstToggle()
    {
	if(m_Toggles.Count <= 0)
        {
            return null;
        }
        
        Toggle toggle = m_Toggles[0];
        for(int i = 1; i < m_Toggles.Count; i++)
        {
            if(toggle.transform.GetSiblingIndex() > m_Toggles[i].transform.GetSiblingIndex())
            {
                toggle = m_Toggles[i];
            }
        }

        return toggle;
    }
    
    protected override void OnDisable()
    {
        base.OnDisable();
        for (int i = 0; i < m_Toggles.Count; i++)
        {
            m_Toggles[i].isOn = false;
        }
    }
}
  • GetSiblingIndex의 값을 비교해서 첫번째 Toggle 컴포넌트를 가져온다. (한번씩 Toggle 순서가 뒤섞이는 문제가 발생해서 함수를 추가로 작성했다. 꼭 저렇게할 필요 없이 Sort()함수를 사용해도 무관할듯하다.)
  • OnDisable()에서 게임오브젝트가 비활성화 될 때, 모든 토글의 isOn을 꺼주는 이유는 다시 활성화될 때 특정 토글의 isOn이 켜져있으면 활성화될 때 켜주고싶은 토글의 isOn이 인스펙터창에서 활성화되지 않아 Graphic의 표시가 변경되지 않는다. (OnValueChanged 콜백만 호출됨)

 

 

 

 

반응형
반응형

 

 

 

 

에셋을 받아 작업하면서 어느순간 An error occurred while resolving packages에러를 발견하게 됐다.

(해당 에러는 Terrain sample asset pack에서 발생하는걸로 확인)

처음에는 크게 신경 안써도 되는줄 알았는데 지워지지 않는 에러라서 그때 제대로 확인했다. 확인해보니 visualgraph 패키지의 버전을 찾을수 없다는 내용이어서 패키지 매니저로 들어가서 해결했다.

 

 

 

해결방법

  • Window - Package Manager 창에서 Unity Registry를 선택해서 에러가 난 패키지를 검색해준다.

  • 여기서 문제가 있는 패키지는 ✔표시 대신 ❗표시가 되어있을건데, Update를 하거나 Remove한다음 재설치를 하면 해결된다.

※ 대부분 위의 방법으로 해결이 되는거같은데, 그래도 안되면 manifast.json에 공백이 있어서 생기는 문제거나 캐시파일 문제라고 한다.

 

 

 

 

 

반응형
반응형

 

 

 

 

Mixamo에서 모델을 다운받아 유니티에 임포트해서 씬에 배치하면 텍스처 없이 모델만 보여진다. 해당 모델의 텍스처를 불러오고 추가로 생기는 문제를 해결해보자.

 

 

 

 

텍스처 불러오기

1. 모델을 클릭한 뒤, 인스펙터 창에서 Materials를 클릭한 뒤, Extract Textures버튼을 클릭한다.

 

2. Select Texture Folder 창이 뜨면 원하는 텍스처가 저장될 폴더를 지정한 뒤 폴더 선택 버튼을 누르면 텍스처가 추출된다.

 

3. 텍스처 추출이 완료되면 NormalMap Settings 창이 뜨는것을 볼 수 있는데, 해당 창에서는 Fix Now를 누르면 된다.

 

 

결과

 

 

 

 

 

텍스처가 비정상 적으로 보이는 현상

- 이 부분은 모델마다 다른데 텍스처가 비정상적으로 보이는 문제의 원인은 Material의 렌더모드가 Transparent로 되어있어서 생기는 현상이다. (Transparent로 괜찮은 모델이 있고 바꿔줘야되는 모델이 있는데 왜이러는지는 모르겠다.)

 

1. 모델을 클릭한 뒤, 인스펙터 창에서 Materials를 클릭한 뒤, Extract Materials를 클릭한다.

 

2. Select Materials Folder 창이 뜨면 Material을 추출 할 폴더를 선택한다.

 

3. 추출한 폴더를 확인해보면 해당 모델의 Material을 확인할 수 있는데, 여기서 (URP 기준)Surface Type

Opaque로 변경해주면 정상적으로 보이게된다. (레거시의 경우 Render mode에서 Opaque로 변경하면 된다.)

 

 

결과

 

 

 

 

 

 

반응형
반응형

 

 

 

 

에러 현상

- 스킨정보가 있는 SkeletonDataAsset을 교체한 뒤, 스킨 설정 방법에 따라 Material 정보가 없어지는 현상이 있다.

- Skeleton 정보는 정상적으로 적용되고 텍스쳐만 없는 상태로 보여진다.

- 해당 현상은 SkeletonAnimation 컴포넌트에서만 일어나며, SkeletonGraphic 컴포넌트에서는 이상이 없다.

 

 

 

코드

using Spine.Unity;

SkeletonAnimationClass.skeletonDataAsset = SomeSkeletonDataAsset;
SkeletonAnimationClass.Initialize(true);

//필드 값을 변경하면 MeshRenderer의 Material이 로드되지 않음.
SkeletonAnimationClass.initialSkinName = "skin name";
//SetSkin(str) 함수로 스킨을 변경하면 Material이 정상적으로 로드 됨.
SkeletonAnimationClass.skeleton.SetSkin("skin name";);
  • SkeletonGraphic 컴포넌트는 InitialSkinName 필드값을 변경해도 정상적으로 작동한다.

 

 

 

 

 

반응형

+ Recent posts