코드 대량 제작prefab
코드 대량 제작prefab
유닛의 게임에서 미공이 제작한 대량의 게임 모형은 우리가 처리해야 한다. 보통prefab로 제작한 후에 asset Bundle 패키지로 제작하여 해당하는 물체를 얻어야 한다.이 블로그에서 우리는 대량으로 prefab로 신속하게 제작하는 과정을 간단하게 설명한다.
선생성 메뉴와 마우스 우클릭 단축키
[MenuItem("GameObject/ Prefab", false, 0)]
이것은 유닛 엔진에 메뉴를 생성할 수 있습니다.
선택한 물체 처리
GameObject[] objs = Selection.gameObjects;
여러 개가 선택되면 순서대로 처리합니다.
개별 처리
BodyBindTransform 스크립트 바인딩
우리는 주로 인물 모형과 게임 npc를 처리하기 때문에 특정한 스크립트를 연결해야 한다.다른 사용에서도 필요에 따라 필요한 스크립트를 추가할 수 있다.
GameObject obj = objs[index];
BodyBindTransform bodybind = obj.GetComponent();
if (bodybind == null)
bodybind = obj.AddComponent();
bodybind.BindBody();
충돌체 추가
인물의prefab이기 때문에 어떤 충돌체는 있어야 한다. 다음은 적당한 충돌체를 첨가하여 순서대로 첨가하기 편리하고 충돌체의 크기를 신속하게 조정했다.업무의 효율을 크게 높일 수 있다.
Collider col = obj.GetComponentInChildren();
if (col == null)
{
GameObject box = new GameObject("BoxCollider");
box.transform.SetParent(obj.transform);
box.transform.localPosition = Vector3.zero;
box.transform.localEulerAngles = Vector3.zero;
box.transform.localScale = Vector3.one;
CapsuleCollider collier = box.AddComponent();
Rigidbody rig = box.AddComponent();
rig.isKinematic = true;
rig.freezeRotation = true;
rig.useGravity = false;
collier.center = new Vector3(0, 1.1f, 0);
collier.radius = 0.5f;
collier.height = 2.0f;
collier.direction = 1;
collier.isTrigger = true;
Transform effet_chest = bodybind.GetBindParent("effect_chest");
box.transform.SetParent(effet_chest.parent);
}
SkinnedMeshRenderer 설정
이러한 SkinnedMeshRendererer를 설정합니다.EditorUtility.SetDirty(obj) 함수 EditorUtility.SetDirty: 이 함수는 엔진에 관련 대상이 속하는 Prefab가 변경되었음을 알려 줍니다.편리하게 사용자 정의 대상의 속성을 변경할 때 소속된 Prefab로 자동으로 업데이트됩니다.
SkinnedMeshRenderer[] skins = obj.GetComponentsInChildren();
for (int i = 0; i < skins.Length; i++)
{
GameObject skinmesh = skins[i].gameObject;
SkinnedMeshRenderer mesh = skins[i];
mesh.receiveShadows = false;
mesh.useLightProbes = false;
mesh.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
EditorUtility.SetDirty(obj);
}
특수효과의 귀속점 설정
Transform effect_root = obj.transform.Find("effect_root");
if (effect_root != null)
effect_root.localEulerAngles = Vector3.zero;
상태 표시기가 있는지 확인
public static bool CheckAnimatorOk(GameObject go)
{
Animator anim = go.GetComponent();
if (anim != null)
{
anim.applyRootMotion = true;
anim.cullingMode = AnimatorCullingMode.AlwaysAnimate;
if (anim.runtimeAnimatorController == null)
{
Debug.LogError(" ");
return false;
}
}
return true;
}
경로 설정 및 prefab로 만들기
이것도 가장 중요한 프리패치 코드를 만드는 데 유닛이 자체로 가지고 있는 함수를 호출했다.
PrefabUtility.CreatePrefab(path, go, ReplacePrefabOptions.Default);
다음은 모든 코드입니다. 그 중에서 CheckAnimatorOK 함수는 본고에서 제시했고 뒤에 있는CreatePrefabInternal 함수는 바로 윗글의prefab를 만드는 함수입니다.
[MenuItem("GameObject/ Prefab", false, 0)]
public static void CreateNormalPrefabByFbx()
{
GameObject[] objs = Selection.gameObjects;
for (int index = 0; index < objs.Length; index++)
{
GameObject obj = objs[index];
BodyBindTransform bodybind = obj.GetComponent();
if (bodybind == null)
bodybind = obj.AddComponent();
bodybind.BindBody();
Collider col = obj.GetComponentInChildren();
if (col == null)
{
GameObject box = new GameObject("BoxCollider");
box.transform.SetParent(obj.transform);
box.transform.localPosition = Vector3.zero;
box.transform.localEulerAngles = Vector3.zero;
box.transform.localScale = Vector3.one;
CapsuleCollider collier = box.AddComponent();
Rigidbody rig = box.AddComponent();
rig.isKinematic = true;
rig.freezeRotation = true;
rig.useGravity = false;
collier.center = new Vector3(0, 1.1f, 0);
collier.radius = 0.5f;
collier.height = 2.0f;
collier.direction = 1;
collier.isTrigger = true;
Transform effet_chest = bodybind.GetBindParent("effect_chest");
box.transform.SetParent(effet_chest.parent);
}
SkinnedMeshRenderer[] skins = obj.GetComponentsInChildren();
//if (skins.Length != 1)
//{
// Debug.LogError("skin mesh " + obj.name);
// continue;
//}
for (int i = 0; i < skins.Length; i++)
{
GameObject skinmesh = skins[i].gameObject;
SkinnedMeshRenderer mesh = skins[i];
mesh.receiveShadows = false;
mesh.useLightProbes = false;
mesh.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
EditorUtility.SetDirty(obj);
}
Transform effect_root = obj.transform.Find("effect_root");
if (effect_root != null)
effect_root.localEulerAngles = Vector3.zero;
if (!CheckAnimatorOk(obj)) return;
string prefabpath = tempPrefabFolderPath + obj.name + ".prefab";
CreatePrefabInternal(obj, prefabpath);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Unity WebGL] 캐시에서 콘텐츠를 로드하지 않게 만드는 방법방법은 파일 URL(예: version=007, script.js?v=1150)에 GET 매개변수를 추가하여 스타일 또는 자바스크립트 콘텐츠를 강제로 새로고침하려는 경우와 같습니다. 그런 다음 파일이 다음과 같이 변...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.