Featured image of post 유니티 스크립트 기초 4

유니티 스크립트 기초 4

사실 API 만 알면 정말 뭣도 아닌 수준의 스크립트네요. 설명하는 선생님이 잘 설명해 주셔서 된듯. 정리한 후에 이걸 가지고 실무데이터로 만들고 컨펌받아봐야겠습니다.

앞서 얘기한대로, 이걸 받아와서 쉐이더의 일정 색상을 변화시켜 보겠습니다.
잘 되면 나중에 텍스쳐도 받아와서 하도록 해야겠네요 :)

그럼 먼저 이 코드에서부터 시작합니다.

계속 업데이트에서 놀겁니다.

일단 아까 만든, 신에 붙어 있는 색상 출력하는 스크립트에서 칼라값을 받아와야겠지요.

그럼 그걸 찾아가는 명령이 GameObject 입니다 .

그러므로 이렇게 찾아갑니다. 

 GameObject.Find("_GameManager");

게임 메니져라고 하는 오브젝트를 찾아갑니다. 거기 안에 아까 만든 스크립트가 있거든요.

그리고 이걸 다시 Object 형식의 변수에 집어 넣었습니다. 쓰기 편하게 하려구요.

오브젝트라고 하는 단위가 존재하는게 신기하네요. ㅎㅎ

 GameObject GM = GameObject.Find("_GameManager");

그리고 다음 행동을 하기 전에, 여기 값이 제대로 들어왔나를 검색하는 코드를 만듭니다.
만약 값이 제대로 들어오지 않았다면 디버그 메시지를 출력합니다.

if (GM != null)
  {  
   
  }
  else
  {
   Debug.Log(“GM is empty”);
  }

이제 제대로 들어왔을때 어떻게 할 것인가를 처리합니다.
GM 오브젝트가 오브젝트를 잘 찾아 물고 들어왔으니, 이 오브젝트에 들어있는 하위정보를 가져오면 되겠지요.
그리고 그 하위정보중에서도 아까 만든 스크립트인 TsSceneAmbientColor 라고 하는 컴포넌트를 찾아서 거기 값을 받아오면 될겁니다. 뭐 이거 부르기만 하면 칼라가 호출되게 되어 있으므로 문제없겠죠.  

그러므로 ,

if (GM != null)
  {
   
   GM.GetComponent(“TsSceneAmbientColor”);
   
   
  }
  else
  {
   Debug.Log(“GM is empty”);
  }

라고 추가해줍니다. GM.GenComponent 라고 하는 명령으로 말이죠.
이걸 접근하면, 칼라값이 리턴됩니다.

그러므로
Color FinalColor = GM.GetComponent(“TsSceneAmbientColor”);

이런 식으로 칼라값을 받아와야겠지요.
그렇지만 왼쪽은 Color고, 오른쪽은 Object입니다. 형식이 다르죠.

그래서 ‘형 변환’ 이 필요합니다. 형 변환에는 여러 형식이 있지만.

Color FinalColor = GM.GetComponent(“TsSceneAmbientColor”) as Color;

그래서 이렇게 받아오면 될 것 같지만, 하지만 이렇게는 안됩니다.
형 변환을 하려면 부모자식간의 관계여야지, 이렇게 Color 같은 동떨어진 녀석으로 바로 갈 수가 없기 때문이지요.
때문에 Object인 GM의 자식 클래스인, TsSceneAmbientColor 로 형변환 해야지 난데없이 Color로 넘어올 수는 없는 거지요.

TsSceneAmbientColor FinalColor = GM.GetComponent(“TsSceneAmbientColor”)as TsSceneAmbientColor

이렇게 되어야 정상입니다.

그리고나서, 다시 업데이트의 맨 처음에다가 칼라 변수를 하나 선언해 줍니다.

Color Acolor = new Color();

C# 특징인 객채 생성이지요.
그리고 이걸 이용해서 , 칼라값을 받아옵니다.

대충 이 정도가 되겠네요.

void Update () {
 
 Color Acolor = new Color();
 GameObject GM = GameObject.Find("_GameManager"); 
  if (GM != null)
  {
      
   TsSceneAmbientColor FinalColor = GM.GetComponent(“TsSceneAmbientColor”)as TsSceneAmbientColor;
   Acolor = FinalColor.SceneColor;
      
  }
  else
  {
   Debug.Log(“GM is empty”);
  }

이제 여기서 나온 Acolor 를 맨 마지막 출력에 대입시켜주면 끝입니다.
renderer.material.SetColor("_UpperGlobalLight",Acolor);

이렇게 하면 완성.

// Update is called once per frame
 void Update () {
 
 Color Acolor = new Color();
 GameObject GM = GameObject.Find("_GameManager");
 
  if (GM != null)
  {      
   TsSceneAmbientColor FinalColor = GM.GetComponent(“TsSceneAmbientColor”)as TsSceneAmbientColor;
   Acolor = FinalColor.SceneColor;      
  }
  else
  {
   Debug.Log(“GM is empty”);
  }
  
 renderer.material.SetColor("_UpperGlobalLight",Acolor);
 
 }

여기에 FinalColor 가 들어왔는지 안들어왔는지 검사하는 if문 하나 더 넣어주면 끝나겠지요 :)

풀버전 코드는 다음과 같습니다.

using UnityEngine;
using System.Collections;

public class TsEnvLightColor : MonoBehaviour
{
 public Color MainAmbient ;

 // Use this for initialization
 void Start () {
 
 }
 
 // Update is called once per frame
 void Update () {
  Color Acolor = new Color();
  
  GameObject GM = GameObject.Find("_GameManager");
  
  if (GM != null)
  {
   
   //TsSceneAmbientColor SA = GM.GetComponent(“TsSceneAmbientColor”) as TsSceneAmbientColor;
   TsSceneAmbientColor SA = GM.GetComponent();
   
   if (SA != null)
   {
    //Acolor = SA.GetAmbinetColor();
    Acolor = SA.SceneColor;
   }
   
  }
   
  else
  Debug.Log(“Not Found GM!!! “);
   
  
  
  if(renderer.material.HasProperty(”_UpperGlobalLight”) == true )
   renderer.material.SetColor("_UpperGlobalLight",Acolor);
  else
   Debug.Log(“Not Found UpperGlobalLight property !!! “);
 
 }
}

잘 되네요.

실시간으로 게임 메니져에서 색상을 바꾸니 바뀌어서 넘어옵니다. 굿.

Hugo로 만듦
JimmyStack 테마 사용 중