씬에 추가하지 않고 새로운 게임 오브젝트를 만드는 방법은 무엇입니까?


10

본질적으로 내 프리 팹 시스템을 만들고 있습니다. 게임 개체는 사람이 읽을 수있는 데이터 파일로 정의됩니다. 빈 GameObject를 만들고 데이터 파일에 정의 된 구성 요소와 함께로드하고 준비 대기하고 Instantiate()전화를 기다리고 싶습니다 . 그러나 GameObject go = new GameObject()새로운 게임 오브젝트를 사용할 때마다 장면에 추가됩니다.

프리 팹에 내장 된 Unity를 사용하여 프리 팹을 GameObject로로드 할 수 있으며 씬에 추가되지 않습니다. (아래 예 참조)

이것의 근거는 GameObjects를 포함하는 하나의 목록을 갖고 싶습니다. 일부는 Unity 프리 팹을로드하여 생성 한 것이고 다른 하나는 사용자 지정 프리 팹 시스템으로 생성 된 것입니다. 이는 런타임에 발생해야하며 Unity 에디터를 포함 할 수 없습니다 (최종 사용자가 자신의 데이터 파일을 정의 할 수 있기 때문에).

Unity가 자동으로 인스턴스화하지 않고 새 게임 오브젝트를 만들려면 어떻게해야합니까?


예를 들어 다음과 같이 전화를 걸 수 있습니다.

Resources.LoadAll("PrefabsDirectory", typeof(GameObject))

그리고 GameObjects의리스트를 얻을 것입니다. 어떤 것도 호출 할 때 씬에 추가되지 않습니다. 본질적으로, 나는 LoadAll내 자신의 프리 팹에 대한 메소드를 만들고 있으며 , 마찬가지로 호출이있을 때 GameObjects를 인스턴스화하고 싶지 않습니다.


1
나는 당신이 할 수 없습니다 두려워. 클래스의 인스턴스화를 지연해야한다고 생각합니다.
— Roberto

Unity에 손을 댄 이후로 오랜 시간이 지났지 만이 문제를 해결할 방법이 없다면, 바로 장면에서 오브젝트를 제거 하고 약간 비효율적으로 원하는 결과를 얻을 수 있습니까?
— 케빈 리드

@KevinReid 내가 할 수있는 유일한 방법 Destroy은 GameObject를 호출 하는 것입니다. 장면에서 제거하고 해제하여 사용할 수 없게 만듭니다.
— MichaelHouse

1
@PandaPajama는 좋은 생각을 가지고 있습니다. 호출 go.SetActive(false)은 객체 풀과 같은 것을 만드는 가장 좋은 방법입니다. 정확히 원하는 것은 아니지만 나중에 사용자 정의 인스턴스화를 위해 복제되는 작은 비활성 객체 그룹을 가질 수 있습니다.
— AndrewEkeren

1
@ Byte56 : 팩토리와 같은 팩토리를 사용하여 인스턴스화하는 동안 필요한 컴포넌트로 GO를 작성하는 것이 아니라 맞춤형 프리 팹을 정확히 사전에 구현하려는 이유는 무엇입니까? 내가 이해 한 바에 따르면 사용자가 "자신의 데이터 파일"을 사용하여 프리 팹을 "직렬화"할 수 있도록하려면 런타임에 해당 파일을 읽고 필요한 구성 요소를 인스턴스화해야합니다.
— Heisenbug

답변:


6

GameObject의 hideFlags를 변경할 수 있습니까?

방금 이것을 시도했습니다.

GameObject myGameObject = new GameObject ();
myGameObject.name = "Obvious Name";

myGameObject.hideFlags = HideFlags.HideInHierarchy;

... 저기 있지만 계층 구조에는 없습니다. 기술적으로는 장면에 있지만 플래그를 HideFlags.None으로 다시 변경할 때까지 표시되지 않습니다. 그것은 당신이 찾고있는 대답이 아니지만 적어도 개발자에게 이것을 배포하는 한 객체를 그룹화하는 것보다 깨끗합니다.


1
이 기능을 사용하지 않도록 설정하면 (어떤 스크립트도 실행되지 않음) 작동 할 수 있습니다. 시도해보고 알려 드리겠습니다. 그것은 여전히 ​​해결 방법이지만, 지금은 내가 남은 것이라고 생각합니다. 그리고 우리가 아는 한, 이것은 의심의 여지가 있지만 내부적으로 수행 된 것일 수 있습니다.
— MichaelHouse

1
@ Byte56 : 해결 방법이 어려웠지만 요즘에는 애니메이션을 미리 볼 때 Unity가 똑같은 일을한다는 사실을 발견했습니다. 장면에서 숨겨진 게임 오브젝트를 인스턴스화하고 전용 카메라로 미리보기 프레임으로 렌더링합니다. 아마도 그렇게 깨끗하게 들리지는 않지만 실제로이 솔루션은 내부적으로도 사용되는 것으로 보입니다.
— Heisenbug

1
늦게 받아 들여서 죄송합니다. 방금 이것을 구현하려고 왔으며 훌륭하게 작동합니다. 감사.
— MichaelHouse

0

불행히도 그 일을 정확히 할 수는 없습니다. 그러나 팩토리 패턴을 통해 동일한 디자인 패턴을 달성 할 수 있습니다 (예 : 객체의 건물을 추상화 한 다음 나중에 단일 명령으로 간단히 호출) .

객체를 원할 때과 같은 것을 호출하면 Factory.CreateGameEntity()해당 메소드가 장면 뒤의 모든 것을 처리합니다.


생각보다 복잡하여 깨끗하지 않습니다. 답변에 대한 자세한 내용을 게시 할 것이지만 기본적으로 파서는 상당히 복잡해야합니다. 예를 들어, 조립식에 구성 요소가 있는지 테스트하려는 경우 인스턴스화하기 전에 간단합니다 GetComponent<>() != null. 내 데이터 파일을 사용하면 파서는 데이터에서 올바른 구성 요소를 검색해야합니다. 구성 요소 내부에서 값을 얻는 것과 동일합니다. 이 GameObject클래스는 파서에 의해 복제되어야하는 많은 기능을 제공합니다.
— MichaelHouse

이것이 불가능한 이유에 대한 증거 또는 근거를 제시 할 수 있다면,이 답변이 완성 될 것입니다.
— MichaelHouse

나는이에 대한 명확한 문서를 찾을 수 있다면 이제 모든 나는이 포럼 스레드입니다 찾을 수 있습니다 내가 나중에 보자 forum.unity3d.com/threads/... - answers.unity3d.com/questions/366273/... - answers.unity3d .com / questions / 19736 /…
— jhocking

0

go = new GameObject();장면에 추가 하지 않고 는 할 수 없습니다 .

저는 플레이어 기반이 지속적이어야하는 RTS를 연구하고 있으며 본질적으로 모든 작업을 직렬화하고 상점에서 수정 된 자산을 사용하여 런타임에 다시로드합니다.

대부분의 결과는 XML 또는 JSON으로 출력되므로 파일을로드하고 원하는대로 조작하는 것이 매우 간단합니다.


고마워 마크. 씬에 추가하지 않고 새로운 게임 오브젝트를 만들 수 없다는 증거 나 근거를 제공 할 수 있습니까? 나는 내 자신의 직렬화 코드를 가지고 있기 때문에 문제가되지 않는다. 제안 해 주셔서 감사합니다.
— MichaelHouse

-1

올바른 방법은 prefab을 만들고 prefab을 Object로 할당 한 다음 인스턴스화 할 때마다이 Object의 참조를 사용하여 GameObject로 캐스트하는 것입니다.

예 :

private Object prefab;


public static GameObject Create(void)
{
   return (Instantiate(prefab , position , rotation) as GameObject);
}

1
기존의 조립식 시스템을 사용하고 있습니다. 내 질문에서 알 수 있듯이 본질적으로 자체 조립식 시스템을 만들고 있습니다. 요구 사항 중 일부는 "Unity Editor를 포함 할 수 없습니다"입니다. 프리 팹 생성에는 Unity 에디터가 사용됩니다.
— MichaelHouse

그렇게 할 수 없다면 개발자가 SDK를 사용하여 자신의 데이터를 만들 수있는 라이센스가 필요합니다. 내가 틀리지 않으면, 그들은 블링 블링없이 코드를 공유하지 않을 것이다. 그러나 일부 사람들은 Unity에서 자신의 게임 엔진으로 장면을 내보낼 수 있다는 것을 알고 있습니다
— Ericool

선택한 답변을 사용하여 자체 조립식 시스템을 만들었으므로 분명히 가능합니다. 내 프로필에서 찾은 과정에서 수행 방법을 배울 수 있습니다.
— MichaelHouse

고마워, 난 졸업 된 게임 프로그래머입니다 :) 글쎄 당신이 당신을 위해 그 위대한 성공한다면, 게임을 만들 필요가 없습니다
— Ericool

기본적으로 최종 사용자가 프리 팹을 만들 수있는 시스템입니다. 모드 및 기타 최종 사용자 제작 콘텐츠 게임에서 매우 유용합니다. (그래, 나는 그것이 게임을 만드는 데 꽤 유용하다고 생각한다).
— MichaelHouse

-1

프리 팹을 변수에로드하여 나중에 인스턴스화 할 수 있도록하려면 다음 코드를 사용합니다.

 GameObject ball = (GameObject)(Resources.Load ("myPrefab"));

Unity 5.5 프로젝트 에서이 작업을 수행했습니다. 정상적으로 인스턴스화 될 때까지 인스턴스화 할 수 있지만 장면이나 계층의 일부에서는 인스턴스화 할 수 없습니다.


질문을 잘못 읽은 것 같습니다. 이 답변에는 기본 조립식 시스템을 사용하는 것이 포함됩니다 . 이 질문은 접근 할 수없는 커스텀 프리 팹 시스템 을 만드는 맥락에서 묻습니다 . 하단의 예제는이를 더욱 강조합니다.
— Gnemlock

"Unity가 자동으로 인스턴스화하지 않고 어떻게 새로운 GameObject를 만들 수 있습니까?" 질문 과이 코드가 대답했습니다. 맞춤형 로딩 시스템으로 원하는 결과를 얻도록 코드를 변경할 수 있습니다.
— darthhawk

이것은 본질적으로 질문에 포함 된 예에서 설명하는 것입니다. 또한 프리 팹에는 적합하지만 데이터 파일에서 새로운 게임 오브젝트를 생성하는 것은 아닙니다.
— MichaelHouse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.