Ejemplo n.º 1
0
        private Material SaveAsMat(ref BakedData data)
        {
            if (targetGo == null || !targetGo.GetComponentInChildren <SkinnedMeshRenderer>())
            {
                EditorUtility.DisplayDialog("err", "SkinnedMeshRender is null!!", "OK");
                return(null);
            }

            SkinnedMeshRenderer smr     = targetGo.GetComponentInChildren <SkinnedMeshRenderer>();
            Texture2D           animMap = SaveAsAsset(ref data);
            Material            mat     = new Material(targetMat);

            mat.SetTexture("_AnimMap", animMap);
            mat.SetFloat("_AnimLen", data.animLen);
            Vector4 minPos = new Vector4(data.minPos.x, data.minPos.y, data.minPos.z, 0.0f);
            Vector4 maxPos = new Vector4(data.maxPos.x, data.maxPos.y, data.maxPos.z, 0.0f);

            mat.SetVector("_MinPos", minPos);
            mat.SetVector("_MaxPos", maxPos);

            string folderPath = CreateFolder();

            AssetDatabase.CreateAsset(mat, Path.Combine(folderPath, data.name + ".mat"));

            return(mat);
        }
Ejemplo n.º 2
0
        void OnGUI()
        {
            targetGo = (GameObject)EditorGUILayout.ObjectField(targetGo, typeof(GameObject), true);
            subPath  = targetGo == null ? subPath : targetGo.name;
            EditorGUILayout.LabelField(string.Format("保存路径output path:{0}", Path.Combine(path, subPath)));
            //获得一个长300的框
            Rect rect = EditorGUILayout.GetControlRect(GUILayout.Width(400));

            //将上面的框作为文本输入框
            path    = EditorGUI.TextField(rect, path);
            subPath = EditorGUILayout.TextField(subPath);

            //如果鼠标正在拖拽中或拖拽结束时,并且鼠标所在位置在文本输入框内
            if ((Event.current.type == EventType.DragUpdated ||
                 Event.current.type == EventType.DragExited) &&
                rect.Contains(Event.current.mousePosition))
            {
                //改变鼠标的外表
                DragAndDrop.visualMode = DragAndDropVisualMode.Generic;
                if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0)
                {
                    path = DragAndDrop.paths[0];
                }
            }

            stratege = (SaveStrategy)EditorGUILayout.EnumPopup("保存策略output type:", stratege);
            if (stratege == SaveStrategy.Prefab || stratege == SaveStrategy.Mat)
            {
                targetMat = (Material)EditorGUILayout.ObjectField(targetMat, typeof(Material), true);
            }

            if (GUILayout.Button("Bake"))
            {
                if (targetGo == null)
                {
                    EditorUtility.DisplayDialog("err", "targetGo is null, 请填第一个空!", "OK");
                    return;
                }

                if (baker == null)
                {
                    baker = new AnimMapBaker();
                }

                baker.SetAnimData(targetGo);

                List <BakedData> list = baker.Bake();

                if (list != null)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        BakedData data = list[i];
                        Save(ref data);
                    }
                }
            }
        }
Ejemplo n.º 3
0
        private Texture2D SaveAsAsset(ref BakedData data)
        {
            string    folderPath = CreateFolder();
            Texture2D animMap    = new Texture2D(data.animMapWidth, data.animMapHeight, TextureFormat.RGB24, false);

            animMap.LoadRawTextureData(data.rawAnimMap);
            AssetDatabase.CreateAsset(animMap, Path.Combine(folderPath, data.name + ".asset"));
            return(animMap);
        }
Ejemplo n.º 4
0
        private void SaveAsPrefab(ref BakedData data)
        {
            Material mat = SaveAsMat(ref data);

            if (mat == null)
            {
                EditorUtility.DisplayDialog("err", "mat is null!!", "OK");
                return;
            }

            GameObject go = new GameObject();

            go.AddComponent <MeshRenderer>().sharedMaterial = mat;
            go.AddComponent <MeshFilter>().sharedMesh       = targetGo.GetComponentInChildren <SkinnedMeshRenderer>().sharedMesh;
            string folderPath = CreateFolder();

            PrefabUtility.CreatePrefab(Path.Combine(folderPath, data.name + ".prefab").Replace("\\", "/"), go);
        }
Ejemplo n.º 5
0
        private void Save(ref BakedData data)
        {
            switch (stratege)
            {
            case SaveStrategy.AnimMap:
                SaveAsAsset(ref data);
                break;

            case SaveStrategy.Mat:
                SaveAsMat(ref data);
                break;

            case SaveStrategy.Prefab:
                SaveAsPrefab(ref data);
                break;
            }
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }