본문 바로가기

Unity/Common

Unity(C#) 업캐스팅 후 베이스 클래스 판별하다가 생긴 오류

반응형

상황을 설명하자면 다음과 같다.

각 오브젝트들을 정보와 함께 불러들여야 했는데, DB같은거 얹힐 시간은 없어서 리소스 폴더에서 스크립터블 오브젝트로 불러온 후 필요한 자원들은 추가로 로드하는 식으로 구현하려 했다.

 

스크립터블 오브젝트는 다음과 같이 구현했다.

public class Ball : ScriptableObject{} //Soccer와 Golf의 공통정보를 보관

public class Soccer : Ball {} //메쉬렌더러가 추가됨

public class Golf : Ball{}//메쉬가 추가됨

이런 구조를 외부에서 보관하고 불러오기 위해 관리하는 스크립트에선 다음과 같이 보관했었다.

//.... 중략 ....
public List<Ball> Balls;

//.... 중략 ....
public void AddBall(Ball ball){
Balls.Add(ball);
}

이렇게 처리해 나중에 외부에서 모아놓은 공들을 불러와 각자 방식으로 처리하려 했는데 요즘 멘탈이 안좋은게 설계할 때 영향을 끼쳐서

 

이 처리를 스크립터블오브젝트 내부에서 할 생각을 못하고 외부에서 하려고 낑낑댄 것이다.  그러다보니 코드도 늘어지고, 반복문 안에서 다운캐스팅하며 일일이 확인해가며 써야하는 기괴한 형태로 구현된 것이다.

 

그런데 생각해보니 상속을해서 다형성을 구성했다면, 메소드 또한 다형성이 가능하지 않겠는가? 이렇게하면 모여져 있어도 굳이 매순간 두개이상의 다운캐스팅과 비교문을 입력할 필요가 일체 없어진다.

 

예시론 다음과 같다. 간단히 Ball에서는 메소드 정의만하고 각 축구공과 골프공에서 원하는 식으로 덮어씌운다. 여기서는 축구공에 있는 메쉬렌더러와 골프공에 있는 메쉬를 각자 처리하도록 한다치면 아래와 같이 변환해서 사용만해도 일일이 비교해야하는 코스트를 줄일 수 있다.

//Class Ball
public virtual void SetComponent(UnityEngine.Object obj){};

//Class Soccer
public new void SetComponet(UnityEngine.Object obj){ MeshRenderer MR = obj as MeshRenderer;}

//Class Golf
public new void SetComponent(UnityEngine.Object obj){Mesh M = obj as Mesh;}

 

물론 더 좋은 방법이 있을 순 있지만, 지금의 내 지식으론 이게 한계이므로 더 공부해봐야겠다.

반응형