코드 대량 제작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);
        }
    }

좋은 웹페이지 즐겨찾기