- Home /
Referencing a prefab in another prefab created programmatically
Howdy,
I'm currently trying to streamline part of my workflow of creating a slightly altered duplicate of a number of prefabs. The prefabs i have created manually contain a structure component script with an enum along with a few transforms as shown below:
I also have a 'structure component silhouette' script which should reference it's corresponding structure component
Via a button added in an editor script in a separate gameobject, a script grabs all prefabs in a given directory, and for each prefab does the following:
instantiate a copy of the prefab
remove the structure component script
add a 'Structure component silhouette' script
Set the pivots of the silhouette script (working)
Set the Comp reference to be the source prefab GameObject (not working)
Save the new object to a given directory (working)
The essence of my question is, what am i doing wrong here, i could go and drag and drop the existing structure component prefab into the new silhouette prefab, but i cannot seem to get it to stick programmatically. Code for this process shown below:
public class StructureComponentGenerator : MonoBehaviour
{
private List<GameObject> SilhouettesToCreate;
public string LoadFromPath;
public string SaveToPath;
public void GenerateSilhouettes()
{
SilhouettesToCreate = new List<GameObject>();
var entries = Directory.GetFiles(LoadFromPath);
foreach(var entry in entries)
{
if (entry.EndsWith(".prefab"))
{
Debug.Log(entry);
SilhouettesToCreate.Add(PrefabUtility.LoadPrefabContents(entry));
}
}
foreach(GameObject go in SilhouettesToCreate)
{
var sc = go.GetComponent<StructureComponent>();
var silhouette = Instantiate(go);
DestroyImmediate(silhouette.GetComponent<StructureComponent>());
var scs = silhouette.AddComponent<StructureComponentSilhouette>();
scs.componentType = sc.componentType;
silhouette.name = sc.name + "_S";
silhouette.name = silhouette.name.Substring(silhouette.name.LastIndexOf(@"\"), silhouette.name.Length - silhouette.name.LastIndexOf(@"\"));
Debug.Log(silhouette.name);
scs.pivots = new List<Transform>();
foreach(Transform t in silhouette.GetComponentsInChildren<Transform>())
{
scs.pivots.Add(t);
}
scs.comp = go;
PrefabUtility.SaveAsPrefabAsset(silhouette, SaveToPath + @"\" + silhouette.name + ".prefab", out var success);
if (success)
{
Debug.Log($"Successfully created prefab at {SaveToPath + @"\" + silhouette.name + ".prefab"}");
}
else
{
Debug.Log($"Failed to create prefab");
}
DestroyImmediate(silhouette);
}
}
}
the problem here seems to be the scs.comp = go; but i cannot figure out why that is not working. Any help would be appreciated.
Your answer
Follow this Question
Related Questions
Hiding gameobjects in hierarchy make it less expensive ? 0 Answers
Cant See More Than Two Levels Of Children In The Project Tab 1 Answer
How to make sure editor completed refreshing before running other codes? 1 Answer
Mark gameobject field as changed from prefab 2 Answers
Prefab mode doesn't show prefab, still shows old scene. 7 Answers