Unity 3 - GamObject.Find().GetComponent<>();
유니티에서 어떤 게임 오브젝트에 포함된 스크립트의 필드나 메서드를 다른 스크립트에서 사용하고 싶은 경우가 많다. 예를 들어 체력이 감소하면 UI의 바가 줄어든다거나, 킬 수가 올라갈 때마다 돈의 소지량도 증가하는 등을 구현하려면, 다른 스크립트에 접근하는 것이 필수적이다.
그러나 다른 클래스의 현재 인스턴스의 값을 변화하고 싶은 것이지, 새로운 객체를 만들어 해당 메서드를 사용하는 것이 아니라는 것이 유니티에서 주의할 점이다. 우리는 원하는 게임 오브젝트가 가지고 있는 필드를 변형하여 값을 수정하고 싶기 때문에 new operator를 사용하는 것은 의미가 없다. 따라서 기존의 생성된 오브젝트가 가지고 있는 클래스 자체에 직접 접근해야 한다.
이를 위해서는 먼저 해당 오브젝트의 변수를 만들고, Find와 GetComponent<>를 통해 해당 스크립트를 찾아 만든 변수에 넣어주면 된다.
public class GameManager : MonoBehaviour
{
public GameObject prefabMoney;
public long money;
public long moneyIncreaseAmount;
public TMP_Text moneyText;
private GameObject currentSlime;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
ShowInfo();
}
void ShowInfo()
{
if (money == 0)
{
moneyText.text = "$ 0";
}
else
{
moneyText.text=money.ToString("####,####");
}
}
}
public class Health : MonoBehaviour
{
[SerializeField] private float health=5.0f; // SerializeField는 private이라도 유니티에디터에서 public처럼 값의 변화를 확인할 수 있게 해줌.
private float MAX_HEALTH = 5.0f;
GameManager gameManager;
void Start()
{
gameManager=GameObject.Find("GameManager").GetComponent<GameManager>(); // 다른 클래스의 필드나 메서드는 이방식으로 사용하면 됨.
}
// Update is called once per frame
void Update()
{
}
public void Damage(float amount)
{
if (amount < 0)
{
throw new System.ArgumentOutOfRangeException("Cannot have negative damage");
}
this.health -= amount;
if(health<=0)
{
Die();
}
}
public void Heal(float amount)
{
if (amount < 0)
{
throw new System.ArgumentOutOfRangeException("Cannot have negative heal");
}
if(health+amount>MAX_HEALTH)
{
this.health = MAX_HEALTH;
}
else
{
this.health += amount;
}
}
private void Die()
{
gameManager.money += gameManager.moneyIncreaseAmount;
Destroy(this.gameObject);
}
}
위 코드는 prefab에 부착된 Die() 메서드가 호출 될 때마다(몹이 한 마리씩 죽을 때마다) GameManager object에 부착된 GameManager script의 money를 증가시키는 코드이다.
이를 위해 GameManager 클래스 변수 gameManager를 만들고, GameObject.Find("GameManager").GetComponenet<GameManager>();를 통해 이미 있는 클래스에 접근하여 money와 moneyIncreaseAmount를 사용하였다.
이렇게 해당 클래스를 찾아서 접근하는 방법 이외에, 해당 변수를 아예 static으로 만드는 방법도 있다. Static이 붙으면 클래스 객체가 생성되지 않더라도 접근할 수 있으므로 외부 스크립트에서 클래스명.변수명 으로 바로 접근할 수 있는 간편한 점이 있다. 다만 이 경우에는 public static으로 선언한 필드와 메서드만 사용가능하므로 이전 방법보다는 조금 더 제한적이라고 할 수 있다.
**클래스 변수를 만들고 대입해도 public 필드와 메서드만 사용가능.
댓글
댓글 쓰기