작성
·
41
0
You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor ()
이라는 메세지가 뜹니다
작동하는데는 문제가 없는 것 같지만 자꾸 뜨니까 거슬려서 해결 하고 싶습니다.
아래는 코드입니다.
using UnityEngine;
public class Managers : MonoBehaviour
{
static Managers s_instance; // 유일성 보장된다
static Managers Instance { get { Init(); return s_instance; } } // 유일한 매니저를 갖고 온다
InputManager _input = new InputManager();
ResourceManager _resource = new ResourceManager();
public static InputManager Input { get { return Instance._input; } }
public static ResourceManager Resource { get { return Instance._resource; } }
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
Init();
}
// Update is called once per frame
void Update()
{
_input.OnUpdate();
}
static void Init()
{
if (s_instance == null)
{
// 초기화
GameObject go = GameObject.Find("@Managers");
if(go == null)
{
go = new GameObject { name = "@Managers" };
go.AddComponent<Managers>(); //?
}
DontDestroyOnLoad(go);
s_instance = go.GetComponent<Managers>();
}
}
}
아래에는 오류가 뜨는 부분입니다.
go.AddComponent<Managers>(); //?
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다. 이강토님.
현재 겪고 계시는 오류 메시지는 MonoBehaviour
와 관련된 것으로, MonoBehaviour
는 유니티에서 스크립트가 GameObject에 부착되어야지만 동작할 수 있습니다. 코드 상에서는 new
키워드를 사용하여 MonoBehaviour
를 직접 생성하려고 하고 있어서 문제가 발생하는 것입니다.
특히, InputManager
와 ResourceManager
를 초기화하는 부분에서 new
키워드를 사용하고 있는데, 이들 클래스가 MonoBehaviour
를 상속받지 않는다면 문제가 되지 않겠지만, 그렇다면 ScriptableObject
또는 다른 C# 클래스 형태로 선언되어야 합니다.
또한, 적절한 초기화 기법을 사용하는 것도 중요합니다. 만약 InputManager
나 ResourceManager
가 MonoBehaviour
를 상속받고 있다면, 이들을 생성할 때도 AddComponent<T>()
방식을 사용하고 부모 GameObject
에 부착하는 방식으로 코드를 수정해야 합니다.
아래 링크에서 유사한 문제가 논의된 사례를 확인해 보실 수 있습니다:
- 싱글톤 관련 질문있습니다. - 이 게시물에서는 유사한 싱글톤 패턴을 적용하면서 발생할 수 있는 다양한 문제와 초기화 방법에 대한 조언을 얻을 수 있습니다.
이 문제를 해결하기 위한 핵심 포인트는 MonoBehaviour
가 아닌, 일반 클래스로 선언이 가능한지 검토하는 것입니다. 그렇지 못하다면 AddComponent
방식을 사용하는지 확인해야 합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.