스크립트를 통한 소스 에셋 수정하기

자동 인스턴스화

보통 사용자가 어떤 종류의 게임 에셋을 수정하고 싶을 때는 이것이 실행시에 그리고 임시적으로 일어나기릴 원할 것입니다. 예를 들어 만약 캐릭터가 무적 파워업을 들었을 때 무적상태를 보여주기 위해 캐릭터의 재료쉐이더를 바꾸기를 원할 것입니다. 이 처리는 사용되고 있는 재료의 수정을 필요로합니다. 플레이 모드를 빠져나올 때는 재료가 다른 쉐이더를 가지고 있지 않기를 바랄 것이기 때문에 이 변화는 임시적이어야 합니다.

그러나 유니티에서는 영구적으로 소스 에셋을 바꿀 수있는 스크립트를 작성하는 것이 가능합니다. 위의 재료 예제로 시작해보겠습니다.

재료의 쉐이더를 임시로 바구기 위해서는 재료컴포넌트의 쉐이더 속성을 바꿔줍니다.

private var invincibleShader = Shader.Find ("Specular");
function StartInvincibility {
	[[ScriptRef:Renderer.html|renderer]].[[ScriptRef:Renderer-material.html|material]].shader = invincibleShader;
}

이 스크립트를 사용하고 플레이 모드를 나오게되면 Material의 상태는 플레이 모드를 시작할 때의 상태로 리셋됩니다. 이것은 renderer.material을 접근할 때마다 일어나는데 재료는 자동으로 인스턴스와되며 그 인스턴스가 리턴 됩니다. 이 인스턴스는 자동으로 동시에 렌더러에 적용됩니다. 그러므로 사용자는 영구적인 변화에 대한 두려움 없이 원하는 어떤 변화도 만들 수 있습니다.

직접적인 수정

중요한 주의 사항

아래의 함수는유니티의 실제 소스 에셋 파일을 수정합니다. 이런 수정은 다시 되돌릴 수 없습니다. 주의해서 사용하세요.

이제 플레이 모드를 빠져나올 때 재료가 리셋되는 것을 원치 않는다고 생각해 보세요. 이를 위해 renderer.sharedMaterial를 사용할 수 있습니다. sharedMaterial 속성은 렌더러(그리고 다른 것들 또한)가 사용하고 있는 실제 에셋을 리턴할 것입니다.

아래의 코드는 Specular 쉐이더를 사용하기 위해 영구적으로 재료를 수정할 것입니다. 이것은 플레이 모드 전의 상태로 재료를 리셋하지 않습니다.

private var invincibleShader = Shader.Find ("Specular");
function StartInvincibility {
	[[ScriptRef:Renderer.html|renderer]].[[ScriptRef:Renderer-sharedMaterial.html|sharedMaterial]].shader = invincibleShader;
}

보다시피 sharedMaterial에 어떤 변화를 주는것은 유용하지만 위험하기도 합니다. sharedMaterial에서의 어떤 변화도 영구적일 것이며 취소 불가능 합니다.

적용가능한 클래스 멤버

위에서 설명한 공식은 재료이외에도 적용가능 합니다. 이 관습을 따르는 다른 에셋의 모든 리스트는 아래와 같습니다:

  • 재료: renderer.material와 renderer.sharedMaterial
  • 메쉬: meshFilter.mesh와 meshFilter.sharedMesh
  • 물리 재료: collider.material와 collider.sharedMaterial

직접 할당

위 재료, 메쉬 또는 물리 재료에서 공공(public) 변수를 정의하고 관련된 클래스 멤버가 아닌 그 변수를 사용해 수정을하면, 그 수정된 사항이 적용되기 전에 자동으로 인스턴스화 되는 이점을 받지 못합니다.

자동으로 인스턴스화 되지 않는 에셋

Desktop!

수정할때 자동으로 인스턴스화 되지 않는 두가지 에셋이 있습니다.

스크립트를 통한 위 에셋의 수정은 언제나 영구적이며 취소할 수 없습니다. 그래서 스크립트를 통해 지형의 높이맵을 수정한다면 사용자가 직접 인스턴스화하고 값을 할당해야 합니다. 텍스쳐도 마찬가지 입니다. 텍스쳐파일의 픽셀을 수정하면 그 변화는 영구적입니다.

iOS!

Texture2D 에셋은 수정 될때 절대 자동으로 인스턴스화 되지 않습니다. 스크립트를 통해 어떤 변화도 영구적이며 취소 불가능 합니다. 텍스쳐파일의 픽셀을 수정하면 그 변화는 영구적입니다.

Android!

< Texture2D 에셋은 수정 될때 절대 자동으로 인스턴스화 되지 않습니다. 스크립트를 통해 어떤 변화도 영구적이며 취소 불가능 합니다. 텍스쳐파일의 픽셀을 수정하면 그 변화는 영구적입니다.

연결문서