Unity 스크립팅 API 가이드 (한국어)
이 문서는 Unity에서 에셋을 스크립팅으로 수정하는 방법을 다룹니다. 특히, 소스 에셋을 변경하고 인스턴스화하는 과정에 대해 설명합니다.
에셋 수정의 개요
게임 개발 시 자주 필요한 작업 중 하나는 에셋을 런타임 중에 수정하는 것입니다. 예를 들어, 캐릭터가 무적의 상태일 때 머티리얼의 셰이더를 변경하고 싶을 수 있습니다. 런타임에서의 변경은 사용자의 의도에 따라 임시적일 수도 있고, 경우에 따라 영구적일 수도 있습니다.
임시적 수정
일반적으로 renderer.material
을 통해 머티리얼의 셰이더를 임시로 변경합니다.
private var invincibleShader = Shader.Find("Specular");
function StartInvincibility {
renderer.material.shader = invincibleShader;
}
이 코드를 사용하면, 플레이 모드를 종료할 때 해당 머티리얼의 상태는 이전으로 되돌아갑니다. 이유는 매번 renderer.material
에 액세스할 때마다 새 인스턴스가 생성되기 때문입니다.
영구적 수정
영구적인 변경이 필요한 경우 renderer.sharedMaterial
을 사용해야 합니다. 이는 실제 에셋을 반환하며, 변경 사항이 영구적으로 적용됩니다.
private var invincibleShader = Shader.Find("Specular");
function StartInvincibility {
renderer.sharedMaterial.shader = invincibleShader;
}
이처럼 sharedMaterial
을 수정하는 것은 강력하지만, 함께 주의해야 할 리스크가 있습니다. 변경 사항은 되돌릴 수 없습니다.
적용 가능한 클래스 멤버
위에서 설명한 방법은 머티리얼 외에도 다양한 에셋에 적용할 수 있습니다. 해당 규칙을 따르는 에셋 목록은 다음과 같습니다.
에셋 종류 | 클래스 멤버 |
---|---|
Materials | renderer.material 및 renderer.sharedMaterial |
Meshes | meshFilter.mesh 및 meshFilter.sharedMesh |
Physics Materials | collider.material 및 collider.sharedMaterial |
자동 인스턴스화의 이점
직접 변수를 선언하고 관련 클래스 멤버 대신 해당 변수를 사용하면, 수정 사항이 적용되기 전에 자동 인스턴스화의 이점을 누릴 수 있습니다. 하지만 특정 에셋은 자동으로 인스턴스화되지 않으므로 주의해야 합니다.
자동으로 인스턴스화되지 않는 에셋
- Texture2D
- TerrainData
스크립팅으로 이러한 에셋을 수정하게 되면, 변경 사항이 영구적으로 적용되고 되돌릴 수 없습니다.
iOS 및 Android 주의 사항
Texture2D 에셋은 iOS와 Android 프로젝트에서 수정 시 자동으로 인스턴스화되지 않으며, 수정된 사항은 영구적입니다. 따라서 텍스처 파일의 픽셀을 변경하는 경우, 해당 변경 사항은 되돌릴 수 없습니다.
결론
Unity에서 스크립팅으로 에셋을 수정하는 것은 게임 개발 과정에서 매우 중요합니다. 반드시 해당 에셋이 자동으로 인스턴스화되는지 여부를 확인하고, 영구적인 변경이 필요한지 신중하게 판단해야 합니다.