[InitializeOnLoad]
public static class SavePrefabFile
{
static SavePrefabFile()
{
PrefabStage.prefabSaved += OnPrefabSaved;
}
static void OnPrefabSaved(GameObject prefab)
{
// path is empty? how can I get the right path from prefab?
var path = AssetDatabase.GetAssetPath(prefab);
}
}
it must be something wrong with PrefabStage.prefabSaved
callback, since PrefabUtility.prefabInstanceUpdated
works well.
static SavePrefabFile()
{
// PrefabStage.prefabSaved -= OnPrefabSaved;
// PrefabStage.prefabSaved += OnPrefabSaved;
PrefabUtility.prefabInstanceUpdated += OnPrefabSaved;
}
static void OnPrefabSaved(GameObject prefab)
{
// all those value were null if use callback of `PrefabState.prefabSaved`
var PrefabInstanceHandle = PrefabUtility.GetPrefabInstanceHandle(prefab);
var CorrespondingObjectFromSource = PrefabUtility.GetCorrespondingObjectFromSource(prefab);
var OutermostPrefabInstanceRoot = PrefabUtility.GetOutermostPrefabInstanceRoot(prefab);
var NearestPrefabInstanceRoot = PrefabUtility.GetNearestPrefabInstanceRoot(prefab);
var CorrespondingObjectFromOriginalSource = PrefabUtility.GetCorrespondingObjectFromOriginalSource(prefab);
var path = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(prefab);
}
void Start()
{
#if UNITY_EDITOR
// Assuming you have a reference to the prefab game object
GameObject prefabGameObject = gameObject;
// Get the prefab path
string prefabPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(prefabGameObject);
Debug.Log("Prefab Path: " + prefabPath);
#endif
}
Try:
static void OnPrefabSaved(GameObject prefabRoot)
{
var prefabStage = (PrefabStage)StageUtility.GetStage(prefabRoot);
var path = prefabStage.assetPath;
}