버그 해결을 위한 모든 질문을 던져
0 votes
244 views

안녕하세요. C# 초보 개발자입니다.

 링크에 있는 글을 참고해서 커스텀한 Update를 이용해서 유니티에서 게임을 제작하고 있습니다. 저도 이 본문처럼 IUpdatable이란 인터페이스를 제작했는데, UpdateManager에서 Add.Updatable()을 호출하는 부분에서 고민이 있습니다. 

 IUpdatable은 앞으로 생성될 수많은 MonoBehaviour 상속 클래스 및 MonoBehaviour를 상속받지 않는 클래스에서 사용하게 할 예정인데, 모든 OnEnable이나 생성자에 저 UpdateManager.AddUpdatable(this)를 하나하나 다 박아넣어주는 것이 보기에도 별로 안 좋고 비효율적이라고 생각이 듭니다. 저 IUpdatable이 들어있으면 무조건 UpdateManager.AddUpdatable(this)가 호출이 되었으면 하는데 어떤 것이 좋은 방법일지 알려주시면 정말 감사할 듯 합니다.

예시를 들자면

public class FieldObject : IUpdatable{

}

public class CustomMonoBehaviour: MonoBehaviour, IUpdatable{

}

var fo = new FieldObject();
if(fo is IUpdatable){
    UpdateManager.AddUpdatable(fo);
}

var m = new GameObject().GetComponent<CustomMonoBehaviour>();
if(m is IUpdatable){
    UpdateManager.AddUpdatable(m);
}

제가 아는 한 인터페이스에 생성자가 만들어질 리 없기 때문에 제가 생각한 방법은 이런 것인데 괜찮은지 모르겠습니다. 생성자 단에 넣는 것이 아니라, 인스턴스를 제작할 때, 같이 넣어주면 되지 않을까라는 생각이 들었습니다. 게임 코드 구조를 어떻게 짜냐에 따라 답이 달라질 수도 있을 것 같은데, 일단 질문드립니다.

 

읽어주셔서 감사합니다.

asked (5 point) , 244 views

2 answers

0 votes
우수 답변

중간에 상속 구조를 하나 끼워넣는것도 좋지만, 객체의 생명 주기 관리를 UpdateManager에 위임하는것도 좋아보입니다.

Factory 패턴으로 해당 오브젝트의 타입을 받아 객체를 생성 및 관리 풀에 넣어두고 반환해주는 메서드를 만들 것 같습니다.

public class UpdateManager

{

    public static IUpdatable Factory(ObjectType type)

    {

        IUpdatable updatable = null;

        switch(type)

        {

            case ObjectType.FieldObject: updatable = new FieldObject();

            case ObjectType.CustomMonoBehaviour: updatable = new CustomMonoBehaviour();

            default: Debug.LogError("not found object type.");

        }

        if(updatable != null)

        {

            UpdateManager.AddUpdatable(updatable);

            // 생성됐을 때, 적용시켜야 할 행위들...

        }

        return updatable;

    }

}

 

var fo = UpdateManager.Factory(ObjectType.FieldObject);

 

answered (42 point)
선택됨
답변 주셔서 감사합니다.

팩토리 패턴 쪽이 제가 생각하는 코드 구조에 더 알맞다고 생각이 드네요. 이 부분을 활용하면 깔끔하게 짤 수 있을 것 같습니다. 감사합니다!
+2 votes

IUpdateable 인터페이스 대신에 추상 클래스(abstract) 로 상속받아 구현하심은 어떠신가요?

 

마소:

https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/abstract

 

추상클래스 인터페이스 차이 설명된 블로그

https://see-ro-e.tistory.com/137

 

answered (224 point)
가장 먼저 생각한 방법이지만, 다중 상속 때문에 나중에 문제가 될 것 같아서 배제했던 방법이었습니다. 또한, 만약 LateUpdate나 FixedUpdate까지 저런 식으로 관리하게 되면 IFixedUpdate, ILateUpdate도 생길 것인데, 이 경우에 복잡해질 것 같아서 사용하지 않았습니다.

답변 주셔서 감사합니다.

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

221 질문
346 answers
356 댓글
375 users