Example #1
0
        public void TestSkinnedMeshReferences()
        {
            var fbxPath = FindPathInUnitTests("Prefabs/skin.fbx");
            var root    = AssetDatabase.LoadMainAssetAtPath(fbxPath) as GameObject;

            Assert.That(root);

            var exportPath = GetRandomFbxFilePath();

            // Convert it to a prefab
            var prefab = ConvertToNestedPrefab.Convert(root,
                                                       fbxFullPath: exportPath, prefabFullPath: Path.ChangeExtension(exportPath, "prefab"));

            Assert.That(prefab);

            AssertSameHierarchy(root, prefab, ignoreRootName: true, ignoreRootTransform: true);

            // check that the bones make sense
            var actualSkinnedMesh   = prefab.GetComponentInChildren <SkinnedMeshRenderer>();
            var expectedSkinnedMesh = root.GetComponentInChildren <SkinnedMeshRenderer>();

            var rootBone = actualSkinnedMesh.rootBone;
            var joint2   = rootBone.Find("joint2");
            var joint3   = rootBone.Find("joint2/joint3");

            Assert.That(actualSkinnedMesh.bones.Length, Is.EqualTo(3));
            var bones = new HashSet <Transform>(actualSkinnedMesh.bones);

            Assert.That(bones.Contains(rootBone));
            Assert.That(bones.Contains(joint2));
            Assert.That(bones.Contains(joint3));
            Assert.That(!bones.Contains(expectedSkinnedMesh.rootBone));
        }
Example #2
0
        public IEnumerator TestReferencesInScene()
        {
            // test that references that scene objects hold to the converted object
            // are maintained
            var a = GameObject.CreatePrimitive(PrimitiveType.Cube);
            var b = GameObject.CreatePrimitive(PrimitiveType.Sphere);

            b.transform.SetParent(a.transform);

            var c         = new GameObject();
            var reference = c.AddComponent <ReferenceComponent>();

            reference.m_goList    = new GameObject[] { a, b };
            reference.m_collider  = a.GetComponent <BoxCollider>();
            reference.m_transform = b.transform;

            yield return(null);

            var fbxPath = GetRandomFbxFilePath();

            // Convert it to a prefab
            var prefab = ConvertToNestedPrefab.Convert(a,
                                                       fbxFullPath: fbxPath, prefabFullPath: Path.ChangeExtension(fbxPath, "prefab"));

            Assert.That(prefab);
            Assert.That(!a);

            var newA = prefab;
            var newB = prefab.transform.GetChild(0).gameObject;

            Assert.That(reference.m_goList.Length, Is.EqualTo(2));
            Assert.That(reference.m_goList[0], Is.EqualTo(newA));
            Assert.That(reference.m_goList[1], Is.EqualTo(newB));
            Assert.That(reference.m_collider, Is.EqualTo(newA.GetComponent <BoxCollider>()));
            Assert.That(reference.m_transform, Is.EqualTo(newB.transform));

            // Test undo and redo still maintains the right references
            Undo.PerformUndo();

            Assert.That(reference.m_goList.Length, Is.EqualTo(2));
            Assert.That(reference.m_goList[0], Is.EqualTo(a));
            Assert.That(reference.m_goList[1], Is.EqualTo(b));
            Assert.That(reference.m_collider, Is.EqualTo(a.GetComponent <BoxCollider>()));
            Assert.That(reference.m_transform, Is.EqualTo(b.transform));

            Undo.PerformRedo();

            Assert.That(reference.m_goList.Length, Is.EqualTo(2));
            Assert.That(reference.m_goList[0], Is.EqualTo(newA));
            Assert.That(reference.m_goList[1], Is.EqualTo(newB));
            Assert.That(reference.m_collider, Is.EqualTo(newA.GetComponent <BoxCollider>()));
            Assert.That(reference.m_transform, Is.EqualTo(newB.transform));
        }
Example #3
0
        protected GameObject ConvertAndComparePrefab(GameObject orig, string fbxPath = "", bool isInstance = false)
        {
            if (string.IsNullOrEmpty(fbxPath))
            {
                fbxPath = GetRandomFbxFilePath();
            }

            var prefabAsset = orig;

            if (isInstance)
            {
                prefabAsset = PrefabUtility.GetCorrespondingObjectFromSource(orig) as GameObject;
            }

            // Convert it to a prefab
            var prefab = ConvertToNestedPrefab.Convert(orig,
                                                       fbxFullPath: fbxPath, prefabFullPath: Path.ChangeExtension(fbxPath, "prefab"));

            Assert.That(prefab);

            if (isInstance)
            {
                // original should be destroyed now
                Assert.That(!orig);
            }

            // check that the hierarchy matches the original
            AssertSameHierarchy(prefabAsset, prefab, ignoreRootName: true, checkComponents: true);

            // check that the meshes and materials are now from the fbx
            var fbx = AssetDatabase.LoadMainAssetAtPath(fbxPath) as GameObject;

            Assert.That(fbx);
            AssertSameMeshesAndMaterials(fbx, prefab);

            if (isInstance)
            {
                // test undo and redo
                Undo.PerformUndo();
                Assert.That(!prefab);
                Assert.That(orig);

                Undo.PerformRedo();
                AssertSameHierarchy(prefabAsset, prefab, ignoreRootName: true, checkComponents: true);
                AssertSameMeshesAndMaterials(fbx, prefab);
            }

            return(prefab);
        }
Example #4
0
        public void TestInstanceNameMatchesFilename()
        {
            // create a cube, export it to random filename
            // make sure instance name gets updated when converting to prefab

            // Get a random directory.
            var path = GetRandomFileNamePath(extName: ".fbx");

            // Create a cube.
            var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

            // Convert it to a prefab
            var cubePrefab = ConvertToNestedPrefab.Convert(cube,
                                                           fbxFullPath: path, prefabFullPath: Path.ChangeExtension(path, ".prefab"));

            Assert.That(!cube);
            Assert.That(cubePrefab);

            Assert.AreEqual(Path.GetFileNameWithoutExtension(path), cubePrefab.name);
        }
Example #5
0
        public void SkinnedMeshTest()
        {
            // Create a cube with a bogus skinned-mesh rather than a static
            // mesh setup.
            var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

            cube.AddComponent <SkinnedMeshRenderer>();
            var meshFilter = cube.GetComponent <MeshFilter>();
            var meshRender = cube.GetComponent <MeshRenderer>();

            Object.DestroyImmediate(meshRender);
            Object.DestroyImmediate(meshFilter);

            // Convert it.
            var file       = GetRandomFbxFilePath();
            var cubePrefab = ConvertToNestedPrefab.Convert(cube, fbxFullPath: file, prefabFullPath: Path.ChangeExtension(file, ".prefab"));

            // Make sure it has a skinned mesh renderer
            Assert.That(cubePrefab.GetComponentsInChildren <SkinnedMeshRenderer>(), Is.Not.Empty);
        }
Example #6
0
        public void TestConvertInPrefabScene()
        {
            var origPrefabPath = FindPathInUnitTests("Prefabs/RegularPrefab_Regular.prefab");
            var root           = AssetDatabase.LoadMainAssetAtPath(origPrefabPath) as GameObject;
            var rootInstance   = PrefabUtility.InstantiatePrefab(root) as GameObject;

            Assert.That(rootInstance);
            PrefabUtility.UnpackPrefabInstance(rootInstance, PrefabUnpackMode.OutermostRoot, InteractionMode.AutomatedAction);
            var newPrefabPath = GetRandomPrefabAssetPath();
            // make sure the directory structure exists
            var dirName = Path.GetDirectoryName(newPrefabPath);

            if (!Directory.Exists(dirName))
            {
                Directory.CreateDirectory(dirName);
            }
            PrefabUtility.SaveAsPrefabAsset(rootInstance, newPrefabPath);

            var newPrefab = PrefabUtility.LoadPrefabContents(newPrefabPath);
            var childObj  = newPrefab.transform.GetChild(0).gameObject;
            var childDup  = Object.Instantiate(childObj) as GameObject;

            childDup.transform.parent = newPrefab.transform;
            Assert.That(childObj);
            Assert.That(childDup); // duplicate so we have an object to compare against

            var fbxPath = GetRandomFbxFilePath();

            // Convert it to a prefab
            var convertedObj = ConvertToNestedPrefab.Convert(childObj,
                                                             fbxFullPath: fbxPath, prefabFullPath: Path.ChangeExtension(fbxPath, "prefab"));

            Assert.That(convertedObj);

            AssertSameHierarchy(childDup, convertedObj, ignoreRootName: true, checkComponents: true);

            Assert.That(!childObj); // replaced by convertedObj
            Assert.That(convertedObj.transform.parent, Is.EqualTo(newPrefab.transform));
            PrefabUtility.UnloadPrefabContents(newPrefab);
        }
Example #7
0
        public void TestUndoNameReset()
        {
            // Get a random directory.
            var path = GetRandomFileNamePath(extName: "");

            // Get prefab convert settings and set maya compatible naming to true
            var convertToPrefabSettings = ExportSettings.instance.ConvertToPrefabSettings.info;

            convertToPrefabSettings.SetUseMayaCompatibleNames(true);

            // Make a cube with a non-maya compatible name
            var cube = CreateGameObject("cube 1");

            // Convert it to a prefab
            var cubePrefab = ConvertToNestedPrefab.Convert(cube,
                                                           fbxDirectoryFullPath: path, prefabDirectoryFullPath: path, exportOptions: convertToPrefabSettings);

            // Undo prefab convert
            Undo.PerformUndo();

            // Make sure name is same as original
            Assert.AreEqual("cube 1", cube.name);
        }
Example #8
0
        public void BasicTest()
        {
            // Get a random directory.
            var path = GetRandomFileNamePath(extName: "");

            // Create a cube.
            var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

            // Convert it to a prefab
            var cubePrefab = ConvertToNestedPrefab.Convert(cube,
                                                           fbxDirectoryFullPath: path, prefabDirectoryFullPath: path);

            // Make sure it's what we expect.
            Assert.That(!cube);                                   // original was deleted
            Assert.That(cubePrefab);                              // we got the new
            Assert.AreEqual("Cube", cubePrefab.name);             // it has the right name
            Assert.That(!EditorUtility.IsPersistent(cubePrefab)); // cubePrefab is an instance in the scene

            // Should be all the same triangles. But it isn't. TODO.
            // At least the indices should match in multiplicity.
            var cubeMesh       = GameObject.CreatePrimitive(PrimitiveType.Cube).GetComponent <MeshFilter>().sharedMesh;
            var cubePrefabMesh = cubePrefab.GetComponent <MeshFilter>().sharedMesh;

            //Assert.That(
            //  cubeMesh.triangles,
            //  Is.EqualTo(cubePrefabMesh.triangles)
            //);
            Assert.That(cubeMesh.triangles, Is.EquivalentTo(cubeMesh.triangles));

            // Make sure it's where we expect.
            var assetRelativePath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(cubePrefab);
            var assetFullPath     = Path.GetFullPath(Path.Combine(Application.dataPath,
                                                                  "../" + assetRelativePath));

            Assert.AreEqual(Path.GetFullPath(path), Path.GetDirectoryName(assetFullPath));
        }
Example #9
0
        public void ExhaustiveTests()
        {
            // Try convert in every corner case we can imagine.

            // Test Convert on an object in the scene
            {
                var a        = CreateHierarchy();
                var aConvert = ConvertToNestedPrefab.Convert(a, fbxFullPath: GetRandomFbxFilePath(), prefabFullPath: GetRandomPrefabAssetPath());
                // original hierarchy was deleted, recreate
                a = CreateHierarchy();
                AssertSameHierarchy(a, aConvert, ignoreRootName: true);
            }

            // Test Convert on a prefab asset.
            // Expected: creates a new fbx and a new prefab.
            {
                var a           = CreateHierarchy();
                var aPrefabPath = GetRandomPrefabAssetPath();
                var bPrefabPath = GetRandomPrefabAssetPath();

                // Convert an existing prefab (by creating a new prefab here).
                var aPrefab = PrefabUtility.SaveAsPrefabAsset(a, aPrefabPath); // PrefabUtility.CreatePrefab(aPrefabPath, a);

                // Provide a different prefab path if convert needs to create a new file.
                var aConvert = ConvertToNestedPrefab.Convert(aPrefab, fbxFullPath: GetRandomFbxFilePath(), prefabFullPath: bPrefabPath);

                // Make sure we exported to the new prefab, didn't change the original
                Assert.That(PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(aConvert), Is.EqualTo(bPrefabPath));
                Assert.IsTrue(aPrefab);
                Assert.AreNotEqual(aPrefab, aConvert);
            }

            // Test Convert on a prefab instance.
            // Expected: creates a new fbx and new prefab; 'a' points to the new prefab now. Old prefab still exists.
            {
                var a           = CreateHierarchy();
                var aPrefabPath = GetRandomPrefabAssetPath();
                var aPrefab     = PrefabUtility.SaveAsPrefabAsset(a, aPrefabPath);
                var bPrefabPath = GetRandomPrefabAssetPath();
                var aConvert    = ConvertToNestedPrefab.Convert(a, fbxFullPath: GetRandomFbxFilePath(), prefabFullPath: bPrefabPath);
                Assert.AreEqual(bPrefabPath, PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(aConvert));
                Assert.AreEqual(aPrefabPath, AssetDatabase.GetAssetPath(aPrefab));
                Assert.AreNotEqual(aPrefabPath, PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(aConvert));
                AssertSameHierarchy(aPrefab, aConvert, ignoreRootName: true);
            }

            // Test Convert on an fbx asset
            // Expected: uses the old fbx and creates a new prefab
            {
                var a        = CreateHierarchy();
                var aFbx     = ExportToFbx(a);
                var aConvert = ConvertToNestedPrefab.Convert(aFbx, fbxFullPath: GetRandomFbxFilePath(), prefabFullPath: GetRandomPrefabAssetPath());
                Assert.AreNotEqual(aFbx, aConvert);
                // ignore root transform since the default functionality of the FBX exporter is to reset the root's position on export
                AssertSameHierarchy(a, aConvert, ignoreRootName: true, ignoreRootTransform: true);
            }

            // Test Convert on an fbx instance
            // Expected: uses the old fbx and creates a new prefab
            {
                var a            = CreateHierarchy();
                var aFbx         = ExportToFbx(a);
                var aFbxInstance = PrefabUtility.InstantiatePrefab(aFbx) as GameObject;
                var aConvert     = ConvertToNestedPrefab.Convert(aFbxInstance, fbxFullPath: GetRandomFbxFilePath(), prefabFullPath: GetRandomPrefabAssetPath());
                Assert.AreNotEqual(aFbx, aConvert);
                AssertSameHierarchy(a, aConvert, ignoreRootName: true, ignoreRootTransform: true);
            }

            // Test Convert on an fbx instance, but not the root.
            // Expected: creates a new fbx and creates a new prefab
            {
                var a            = CreateHierarchy();
                var aFbx         = ExportToFbx(a);
                var aFbxInstance = PrefabUtility.InstantiatePrefab(aFbx) as GameObject;
                PrefabUtility.UnpackPrefabInstance(aFbxInstance, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction);
                var aFbxInstanceChild = aFbxInstance.transform.GetChild(0).gameObject;
                var aConvertFbxPath   = GetRandomFbxFilePath();
                var aConvert          = ConvertToNestedPrefab.Convert(aFbxInstanceChild, fbxFullPath: aConvertFbxPath, prefabFullPath: GetRandomPrefabAssetPath());
                AssertSameHierarchy(a.transform.GetChild(0).gameObject, aConvert, ignoreRootName: true);
            }
        }