본문 바로가기
Shader

커스텀 셰이더 GUI 만들기 - 프로퍼티 생성

by 대마왕J 2021. 5. 2.

그럼 이번엔 빈 프로퍼티에 원하는 기능을 채워봅시다.

심플하게

원래랑 똑같이 만들어 보죠. 하등 쓸모없게.

원래 이렇게 생겼었죠

맨아래 렌더큐나 GPU 인스턴싱, 더블 사이드 GI 쪽은 빼고 만들어 봅시다

일단 float을 그대로 만들어 보죠

 

 

 

 

 

 

float 만들기 

만들기 위해서 먼저 셰이더 쪽을 수정해 줘야 합니다.

이름과 레퍼런스 변수명이 저모양이면 심히 피곤하기 때문에.

그래서 좀 더 편하게 만들어 주었습니다. _TestFloat 이 녀석을 쓰면 됩니다.

쓰고나서 저장하는거 잊지 맙시다. 셰이더는 저장이 Ctrl+S 로 안된다는게 참 안좋은 것 같아요

이제 스크립트로 갑니다.

아래처럼 수정해 줍시다.

 

 

using UnityEditor;


public class UnlitCustomGUIShaderGraph : ShaderGUI{

    MaterialProperty TestFloat = null; 
    //MaterialProperty 형식의 변수를 하나 만듭니다. 이름은 꼭 일치시킬 필요는 없지만 보기 편하게 일치시킴
   
   public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props){
       //MaterialProperty 변수를 가져와서 , 셰이더의_TestFloat 을 프로퍼티들 가운데에서 찾아 넣어주도록 합니다. 
       TestFloat = FindProperty("_TestFloat", props);
       //이게 그려주는 부분입니다. 플롯 프로퍼티로 그려줍시다 
       materialEditor.FloatProperty(TestFloat, "테스트 플롯");
       
   }
}

 

그럼 생성됩니다.

 

 

 

 

Texture 프로퍼티 만들기 

이번엔 Texture를 만들어 보도록 하겠습니다. 역시 변수명부터 정리를.

그리고 동일하게 추가해 줍니다.

using UnityEditor;

public class UnlitCustomGUIShaderGraph : ShaderGUI{

    MaterialProperty TestFloat = null; 
    MaterialProperty TestTexture = null;     //MaterialProperty 형식의 변수를 하나 더 만듭니다. 

   public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props){

       TestFloat = FindProperty("_TestFloat", props);
       TestTexture = FindProperty("_TestTexture2D",props); //텍스쳐를 찾아서 변수에 넣어줍니다. 

       materialEditor.FloatProperty(TestFloat, "테스트 플롯");
       materialEditor.TextureProperty(TestTexture, "테스트 텍스쳐"); //텍스쳐 프로퍼티를 만들어 줍니다 
   }
}

결과를 봅시다. 잘 만들어 졌습니다.

오버라이드 되어 있는 함수를 이용하면

materialEditor.TextureProperty(TestTexture, "테스트 텍스쳐",true);

ScaleOffset 도 보여줄 수 있습니다.

 

 

 

 

Color 프로퍼티 만들기

이제 슬슬 익숙해질테니 설명없이 만들어 봅니다. 방식은 동일하니

using UnityEditor;

public class UnlitCustomGUIShaderGraph : ShaderGUI{

    MaterialProperty TestFloat = null; 
    MaterialProperty TestTexture = null;     //MaterialProperty 형식의 변수를 하나 더 만듭니다. 
    MaterialProperty TestColor = null;  //MaterialProperty 형식의 변수를 하나 더 만듭니다. 

   public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props){

       TestFloat = FindProperty("_TestFloat", props);
       TestTexture = FindProperty("_TestTexture2D",props); 
       TestColor = FindProperty("_TestColor",props); //텍스쳐를 찾아서 변수에 넣어줍니다. 

       materialEditor.FloatProperty(TestFloat, "테스트 플롯");
       materialEditor.TextureProperty(TestTexture, "테스트 텍스쳐",true);
       materialEditor.ColorProperty(TestColor, "테스트 칼라"); //텍스쳐 프로퍼티를 만들어 줍니다 
   }

말이 더 필요 없습니다.

이렇게 하면, 기존것과 같은 기능을 만들어 줄 수 있습니다.

되게 쓸모없어 보이죠? 아니 기본을 만들어 놔야 수정을 할 거 아녜요???!?

반응형

댓글