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


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.