unity3d
조립식 건물
수색…
통사론
- 공공 정적 개체 PrefabUtility.InstantiatePrefab (개체 대상);
- 공공 정적 개체 AssetDatabase.LoadAssetAtPath (문자열 자산 경로, 유형 유형);
- 공용 정적 Object Object.Instantiate (Object original);
- 공공 정적 개체 Resources.Load (문자열 경로);
소개
Prefab 은 구성 요소, 속성, 연결된 구성 요소 및 일련 화 된 속성 값을 사용하여 전체 GameObject를 저장할 수있는 자산 유형입니다. 이 기능이 유용 할 수있는 시나리오는 다음과 같습니다.
- 씬의 오브젝트 복제하기
- 여러 장면에서 공통 개체 공유
- 프리 패브를 한 번 수정하고 변경 사항을 여러 객체 / 장면에 적용 할 수 있음
- 주요 수정 사항을 하나의 기본 프리 패브에서 편집 가능하게하면서 사소한 수정으로 복제 오브젝트 생성
- 런타임에 GameObjects 인스턴스화하기
유니티에는 "모든 것이 조립식이어야합니다"라는 종류의 경험 법칙이 있습니다. 이것은 아마 과장이지만 코드 재사용과 GameObjects를 재사용 가능한 방식으로 구축하는 것을 권장합니다.이 방법은 메모리 효율적이고 좋은 디자인입니다.
프리 패브 작성하기
프리 팹을 만들려면 장면 계층의 게임 객체를 Assets 폴더 또는 하위 폴더로 드래그하십시오.
게임 객체 이름이 파란색으로 바뀌어 그것이 프리 팹에 연결 되었음을 나타냅니다.
이제이 객체는 클래스의 객체 인스턴스와 마찬가지로 프리 패브 (prefab) 인스턴스 입니다.
프리 팹은 인스턴스화 후에 삭제할 수 있습니다. 이 경우 이전에 연결된 게임 개체의 이름이 빨간색으로 바뀝니다.
조립식 검사관
계층 뷰에서 프리 팹을 선택하면 보통의 게임 객체와 약간 다른 인스펙터 인 것을 알 수 있습니다 :
대
굵게 속성 은 해당 값이 조립식 값과 다른 것을 의미합니다. 원래의 조립식 값에 영향을주지 않고 인스턴스화 된 조립식의 속성을 변경할 수 있습니다. 프리 패브 인스턴스에서 값이 변경되면 굵게 표시되며 프리 패브에서 동일한 값의 이후 변경 사항은 변경된 인스턴스에 반영되지 않습니다.
되돌리기 버튼을 클릭하여 원래의 프리 패브 값으로 되돌릴 수 있으며, 인스턴스에 값 변경 내용도 반영됩니다. 또한 개별 값을 되돌리려면이를 마우스 오른쪽 버튼으로 클릭하고 값을 다시 조립식 으로 되돌릴 수 있습니다. 구성 요소를 되돌리려면 구성 요소를 마우스 오른쪽 단추로 클릭하고 Reflection to Prefab을 누릅니다.
적용 버튼을 클릭하면 프리 패브 속성 값을 현재 게임 개체 속성 값으로 덮어 씁니다. "실행 취소"버튼이나 확인 대화 상자가 없으므로이 버튼을 조심스럽게 다루십시오.
Select 버튼은 프로젝트의 폴더 구조에서 연결된 프리 팹을 강조 표시합니다.
프리 패브 인스턴스화하기
프리 패브를 인스턴스화하는 두 가지 방법이 있습니다 : 디자인 타임 이나 런타임 중에.
디자인 타임 인스턴스화
디자인 타임에 프리 팹을 인스턴스화하면 동일한 객체의 여러 인스턴스를 시각적으로 배치 할 수 있습니다 (예 : 게임 레벨을 설계 할 때 나무 배치 ).
프리 패브를 시각적으로 인스턴스화하려면 프로젝트 뷰에서 장면 계층으로 드래그합니다.
에디터 확장을 작성하는 경우
PrefabUtility.InstantiatePrefab()
메소드를 프로그래밍 방식으로 호출하는 프리 팹을 인스턴스화 할 수도 있습니다.GameObject gameObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath("Assets/MainCamera.prefab", typeof(GameObject)));
런타임 인스턴스화
런타임시 프리 팹을 인스턴스화하는 것은 일부 논리에 따라 객체의 인스턴스를 만드는 데 유용합니다 (예 : 5 초마다 적을 생성 ).
프리 팹을 인스턴스화하려면 프리 팹 객체에 대한 참조가 필요합니다. 이 작업은 MonoBehaviour
스크립트에 public GameObject
필드를두고 Unity Editor에서 inspector를 사용하여 값을 설정하면됩니다 :
public class SomeScript : MonoBehaviour {
public GameObject prefab;
}
또는에서 조립식를 넣어 자원 폴더를 사용하여 Resources.Load
:
GameObject prefab = Resources.Load("Assets/Resources/MainCamera");
프리 팹 객체에 대한 참조가 있으면 코드의 임의의 부분 에서 Instantiate
함수를 사용하여 Instantiate
할 수 있습니다 (예 : 루프 내에서 여러 객체를 만드는 경우 ).
GameObject gameObject = Instantiate<GameObject>(prefab, new Vector3(0,0,0), Quaternion.identity);
참고 : 조립식 용어는 런타임에 존재하지 않습니다.
중첩 된 프리 패브
중첩 된 조립식은 현재 Unity에서 사용할 수 없습니다. 하나의 프리 팹을 다른 것으로 드래그하여 적용 할 수 있지만 하위 프리 팹의 모든 변경 사항은 중첩 된 프리 팹에 적용되지 않습니다.
그러나 간단한 해결 방법이 있습니다 - 부모 스크립트에 간단한 스크립트를 추가해야합니다. 간단한 스크립트를 사용하면 자식을 인스턴스화 할 수 있습니다.
using UnityEngine;
public class ParentPrefab : MonoBehaviour {
[SerializeField] GameObject childPrefab;
[SerializeField] Transform childPrefabPositionReference;
// Use this for initialization
void Start () {
print("Hello, I'm a parent prefab!");
Instantiate(
childPrefab,
childPrefabPositionReference.position,
childPrefabPositionReference.rotation,
gameObject.transform
);
}
}
부모 프리 패브 :
어린이 조립식 :
시작 전후의 장면 :