- Home /
AssetDatabase.LoadMainAssetAtPath returns null
I am attempting to create a script which will make an asset bundle (.unity3d) out of each immediate subfolder of my StreamingAssets folder.
The problem I an encountering is that Object t is coming back null when it should be one of the subfolders of StreamingAssets.
Any feedback is appreciated, Thank you.
The Code in Question (C#):
public class ExportAssetBundles { [MenuItem("Assets/Build AssetBundle")] static void ExportResource () {
string[] directories = Directory.GetDirectories(Application.streamingAssetsPath);
for (int i = directories.Length-1; i >= 0; i--)
{
Debug.Log (directories[i]);//directories work properly
UnityEngine.Object t = AssetDatabase.LoadMainAssetAtPath(directories[i]);
Selection.activeObject = t;
if (t == null)
Debug.Log ("NULL");
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
string path = "Assets/"+Selection.activeObject.name+".unity3d";
BuildPipeline.BuildAssetBundle(t, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets);
}
}
}
Answer by hymn · Oct 16, 2014 at 07:45 PM
Problem Fixed as far as I can tell. The issue was with the path, when using AssetDatabase.LoadMainAssetAtPath you do not need to specify the location of the project, the path starts with "Assets/" and goes on from there. I added on a small function at the end of the code to chop the end off the filepath (the part you actually need) and used that part of the filepath rather than the whole thing, the Debug.Log will display what that path is.
I hope this stops anyone else from wasting way too much time on this.
Code:
using UnityEngine; using UnityEditor; using System.IO;
public class ExportAssetBundles
{
[MenuItem("Assets/Build AssetBundle")]
static void ExportResource ()
{
//Selection.activeObject is what this whole thing hinges on, how do i programmatically select something?
string[] directories = Directory.GetDirectories(Application.streamingAssetsPath);
for (int i = directories.Length-1; i >= 0; i--)
{
Debug.Log (directories[i]);//directories work properly
UnityEngine.Object t = AssetDatabase.LoadMainAssetAtPath("Assets/"+Path(directories[i]));
Selection.activeObject = t;
if (t == null)
Debug.Log (Path(directories[i]));
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
string path = "Assets/"+Path(directories[i])+".unity3d";
BuildPipeline.BuildAssetBundle(t, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets);
}
}
static string Path(string directory)
{
string str = null;
string[] strArr = null;
int count = 0;
str = directory;
char[] splitchar = { '/' };
strArr = str.Split(splitchar);
return strArr[strArr.Length-1];
}
}
yes you are right ,we should use the realtive path ins$$anonymous$$d of full path.
Your answer
![](https://koobas.hobune.stream/wayback/20220613165242im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Where should asset bundles go on Mac? 3 Answers
How to import the object from server to unity 2 Answers
How to build AssetBundle of folder? 0 Answers
Can I select folder to set AssetBundle? 0 Answers