2020
03.16

유니티 문서
https://docs.unity3d.com/kr/530/ScriptReference/MaterialPropertyBlock.html

 

 

캐릭터 피격시 matcap을 교체하여 피격을 표현해주고 있다.

 

sharedMaterial을 변경하면 공유된 모든 material이 변경되니,

material을 직접 레퍼런스를 잡아서 변경해주고있다.

    IEnumerator ActiveMatcapCoroutine()
    {
        material.SetTexture("_MatCap", hurtMatcap);
        yield return new WaitForSeconds(0.6f);
        material.SetTexture("_MatCap", normalMatcap);
    }

하지만 이렇게 하면 material의 레퍼런스를 변경한 순간 별도의 instance가 생성된다.

 

Instance가 생성되어 버렸다.

 

원상태로 돌아와도 배칭이 깨지게 되서 최적화적으로 문제가 생긴다고 한다.

 

그런데 'PropertyBlock' 라는 것이 존재한다!

특정 상황에서 material을 잠시 덮어쓰고, 상황이 종료시 제거하면 다시 배칭이 적용된다고한다.

인스턴스를 생성하지 않음

 

이제 instance가 생성되지 않는다!

 

    protected MaterialPropertyBlock materialPropertyBlock;

    void Awake()
    {
        materialPropertyBlock = new MaterialPropertyBlock();
        materialPropertyBlock.SetTexture("_MatCap", hurtMatcap);
    }

    // 잠시 할당했다가, 0.3초뒤 삭제한다.
    private IEnumerator ActiveMatcapCoroutine()
    {
        skinnedMesh.SetPropertyBlock(materialPropertyBlock);
        yield return new WaitForSeconds(0.3f);
        skinnedMesh.SetPropertyBlock(null);
    }

 

 

 

 

하지만 스킨드 메쉬는.. 배칭이..

COMMENT