본문 바로가기
Unity3D

[Unity3D] 다른 게임 오브젝트의 하위 컴포넌트 제어하는 방법

by 로봇과나무 2014. 7. 7.

유니티(Unity3D)를 사용하여 게임을 만들다 보면 다른 게임오브젝트와 연동하여 동작해야 하는 경우가 빈번하게 발생합니다. 이번 포스팅에서는 다른 게임오브젝트를 제어하는 방법에 대하여 알아 보고자 합니다. 다른 게임 오브젝트의 트랜스폼을 변경하고, 하위에 있는 스크립트 컴포넌트의 필드(변수) 값을 변경하거나 읽어오고, 메소드(함수)를 원격으로 호출하는 방법에 관한 내용입니다.

 

본 포스트에서는 큐브 게임 오브젝트를 두 개 만들고 마우스 클릭이 이루어 졌을 때 상대 큐브를 회전 시키고, 색상을 변경하는 것을 시도할 것입니다.

 

우선 큐브를 두 개 생성하고, 이름을 각각 "Cube1"과 "Cube2"로 변경합니다. Cube1을 클릭 했을 시 Cube2가 조금시 회전할 것이며, Cube2의 색상이 변경되도록 할 예정입니다. 이때, Cube2의 색상이 빨간색이면 파란색으로 바꾸고, 파란색이면 빨간색으로 병경합니다.

 

이러한 동작을 위해서 Cube2에 탑재될 SetColor 클래스의 스크립트는 다음과 같이 작성합니다. SetColor 클래스의 필드는 settingColor를 가지고 있으며, 메소드(함수)로는 "Settingcolor()"라는 이름의 메소드(함수)를 가지고 있습니다.

using UnityEngine;
using System.Collections;

public class SetColor : MonoBehaviour {

	//변경할 생상 값을 저장할 settingColor라는 이름의  필드(변수)를 생성합니다. 
	//이 변수는 인스펙터 뷰에 나타나게 되어 색상을 입력 받을 수 있습니다.
	//초기 값은 Color.blue로 설정되었습니다.
	public Color settingColor = Color.blue;
	void Start () {

		SettingColor();
	}

	//다른 클래스에서 SettingColor함수를 호출할 것이기 때문에 접근한정자를 public으로 선언합니다.
	public void SettingColor()
	{
		//게임 오브젝트에 SettingColor 필드를 대입함으로써, 게임 오브젝트의 색상을 변경합니다.
		renderer.material.color = settingColor;
	}
}

이제는 Cube1에 탑재될 OtherObjectControl 클래스의 스크립트를 다음과 같이 작성합니다. 이 스크립트는 Cube1이 클릭되었을 때, Cube2를 회전 시키고, Cube2의 색상을 변경하는 스크립트 입니다. Cube2를 제어하기 위해 Find 메소드를 사용하여 Cube2를 찾고, 하위 컴포넌트를 찾기 위해 GetComponent메소드를 사용하는 방법을 잘 보시기 바랍니다.

using UnityEngine;
using System.Collections;

public class OtherObjectControl : MonoBehaviour {

	public GameObject controlObject; //이렇게 필드명을 public 선언하면 인스펙터 뷰에서 대상이 되는 
	//게임 오브젝트를 선택할 수 있습니다. 

	private SetColor component; //제어할 스크립트 클래스 타입의 참조변수 생성합니다.

	void Start()
	{
		//"Cube2"라는 이름의 게임 오브젝트를 찾아 controlObject라는 이름을 붙여줍니다.
		controlObject = GameObject.Find ("Cube2");
	}

	void OnMouseDown()
	{
		//대상 오브젝트 회전
		controlObject.transform.Rotate (0, 200 * Time.deltaTime, 0);

		//controlOject의 내장 컴포넌트 중 SetColor을 찾아 component라는 이름을 붙여줍니다.
		component = controlObject.GetComponent<SetColor>();

		//setColor의 소속된 필드 중 settingColor의 값이 Color.blue 인지 확인합니다.
		if (component.settingColor == Color.blue) {
			component.settingColor = Color.red; //Color.blue가 맞으면 Color.red로 변경합니다.
		}
		else {
			component.settingColor = Color.blue; //Color.blue가 아니면 Color.blue로 변경합니다.
		}
		component.SettingColor(); //SettingColor()메소드를 호출하여 색상변경을 실행합니다.
	}
}

각 스크립트를 Cube2와 Cube1에 탑재 시키고, 실행하한 후 Cube1을 클릭 시 Cube2의 회전과 색상이 변경되는 것을 확인하실 수 있을 것입니다. 끝.