보통 게임 에셋을 수정하려는 경우 그 종류에 상관없이 런타임 시점에 임시로 수정하길 원합니다. 예를 들어 캐릭터가 무적의 파워업을 획득하면 플레이어 캐릭터 머티리얼 의 셰이더 를 변경하여 무적 상태를 시각적으로 보여 줄 수 있습니다. 이 작업에는 사용 중인 머티리얼을 수정하는 작업이 포함됩니다. 이 수정은 재생 모드 를 종료할 때 머티리얼이 다른 셰이더를 가질 필요가 없기 때문에 영구적이지 않습니다.
하지만 Unity에서 소스 에셋을 영구적으로 수정하는 스크립트를 작성할 수도 있습니다. 앞서 언급한 머티리얼 예시를 출발점으로 활용해 보겠습니다.
머티리얼의 셰이더를 일시적으로 변경하기 위해 Material 컴포넌트의 Shader 프로퍼티를 변경합니다.
private var invincibleShader = Shader.Find ("Specular");
function StartInvincibility {
renderer.material.shader = invincibleShader;
}
이 스크립트를 사용하고 플레이 모드를 종료하면 머티리얼 의 상태가 플레이 모드로 시작하기 전의 상태로 초기화됩니다. 이는 renderer.material에 액세스할 때마다 머티리얼이 자동으로 인스턴스화되고 인스턴스가 반환되기 때문입니다. 이 인스턴스는 렌더러에 동시에 자동으로 적용됩니다. 따라서 변경이 영구적으로 유지되는 것에 대한 걱정 없이 원하는 모든 것을 변경할 수 있습니다.
플레이 모드를 종료할 때 머티리얼이 초기화되지 않으려 한다고 가정해 보겠습니다 이를 위해 renderer.sharedMaterial을 사용하면 됩니다. sharedMaterial 프로퍼티는 이 렌더러와 다른 렌더러에서 사용한 실제 에셋을 반환합니다.
아래 코드는 스페큘러 셰이더를 사용하도록 머티리얼을 영구적으로 변경합니다. 머티리얼이 플레이 모드 이전 상태로 재설정되지 않습니다.
private var invincibleShader = Shader.Find ("Specular");
function StartInvincibility {
renderer.sharedMaterial.shader = invincibleShader;
}
보시다시피 sharedMaterial을 변경하면 유용하지만 위험할 수 있습니다. sharedMaterial에 적용된 모든 변경 사항은 영구적이며, 실행 취소할 수 없습니다.
위에서 설명한 것과 동일한 수식은 머티리얼뿐만 아니라 그 외에도 적용할 수 있습니다. 이 규칙을 준수하는 에셋의 전체 목록은 다음과 같습니다.
위 Material, Mesh, Physics Material 클래스에 public 변수를 선언하고 관련 클래스 멤버 대신 해당 변수를 사용해 에셋을 수정하면 수정 사항이 적용되기 전에 자동 인스턴스화의 혜택을 누릴 수 없습니다.
수정할 때 절대 자동으로 인스턴스화되지 않는 두 개의 에셋이 있습니다.
스크립팅을 통해 이러한 에셋을 수정하면 항상 영구적으로 적용되며 실행 취소할 수 없습니다. 따라서 스크립팅을 통해 터레인의 하이트맵을 변경하는 경우 자체적으로 인스턴스화와 값 할당을 고려해야 합니다. 텍스처도 마찬가지입니다. 텍스처 파일의 픽셀을 변경하면 변경 사항은 영구적으로 적용됩니다.