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)); }
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)); }
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); }
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); }
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); }
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); }
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); }
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)); }
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); } }