unity3d
Ressourcen
Suche…
Einführung
Mit der Ressourcenklasse können Assets, die nicht Teil der Szene sind, dynamisch geladen werden. Dies ist sehr nützlich, wenn Sie On-Demand-Assets verwenden müssen, z. B. mehrsprachige Audios, Texte usw.
Assets müssen in einem Ordner namens Resources abgelegt werden. Es ist möglich, mehrere Ressourcenordner über die Projekthierarchie zu verteilen. Resources
prüft alle Ressourcenordner, die Sie möglicherweise haben.
Jedes in Resources platzierte Asset wird in den Build aufgenommen, auch wenn es nicht in Ihrem Code angegeben ist. Fügen Sie daher Ressourcen nicht wahllos in Resources ein.
//Example of how to load language specific audio from Resources
[RequireComponent(typeof(AudioSource))]
public class loadIntroAudio : MonoBehaviour {
void Start () {
string language = Application.systemLanguage.ToString();
AudioClip ac = Resources.Load(language + "/intro") as AudioClip; //loading intro.mp3 specific for user's language (note the file file extension should not be used)
if (ac==null)
{
ac = Resources.Load("English/intro") as AudioClip; //fallback to the english version for any unsupported language
}
transform.GetComponent<AudioSource>().clip = ac;
transform.GetComponent<AudioSource>().Play();
}
}
Ressourcen 101
Einführung
Unity verfügt über einige speziell benannte Ordner, die eine Vielzahl von Anwendungen ermöglichen. Einer dieser Ordner heißt "Ressourcen".
Der Ordner "Resources" ist eine von nur zwei Möglichkeiten, Assets zur Laufzeit in Unity zu laden ( die andere ist AssetBundles (Unity Docs).
Der Ordner "Resources" kann sich an beliebiger Stelle innerhalb des Assets-Ordners befinden, und Sie können mehrere Ordner mit dem Namen Resources haben. Der Inhalt aller 'Resources'-Ordner wird während der Kompilierzeit zusammengeführt.
Die primäre Methode zum Laden eines Assets aus einem Resources-Ordner besteht in der Verwendung der Resources.Load- Funktion. Diese Funktion benötigt einen String-Parameter, mit dem Sie den Pfad der Datei relativ zum Ordner Resources angeben können. Beachten Sie, dass Sie beim Laden eines Assets KEINE Dateierweiterungen angeben müssen
public class ResourcesSample : MonoBehaviour {
void Start () {
//The following line will load a TextAsset named 'foobar' which was previously place under 'Assets/Resources/Stackoverflow/foobar.txt'
//Note the absence of the '.txt' extension! This is important!
var text = Resources.Load<TextAsset>("Stackoverflow/foobar").text;
Debug.Log(string.Format("The text file had this in it :: {0}", text));
}
}
Objekte, die aus mehreren Objekten bestehen, können auch aus Ressourcen geladen werden. Beispiele hierfür sind 3D-Modelle mit eingebetteten Texturen oder mehrere Sprites.
//This example will load a multiple sprite texture from Resources named "A_Multiple_Sprite"
var sprites = Resources.LoadAll("A_Multiple_Sprite") as Sprite[];
Alles zusammen setzen
Hier ist eine meiner Helfer-Klassen, mit denen ich alle Sounds für jedes Spiel laden kann. Sie können dies an jedes GameObject in einer Szene anhängen und die angegebenen Audiodateien werden aus dem Ordner 'Resources / Sounds' geladen
public class SoundManager : MonoBehaviour {
void Start () {
//An array of all sounds you want to load
var filesToLoad = new string[] { "Foo", "Bar" };
//Loop over the array, attach an Audio source for each sound clip and assign the
//clip property.
foreach(var file in filesToLoad) {
var soundClip = Resources.Load<AudioClip>("Sounds/" + file);
var audioSource = gameObject.AddComponent<AudioSource>();
audioSource.clip = soundClip;
}
}
}
Abschließende Anmerkungen
Unity ist intelligent, wenn es darum geht, Assets in Ihren Build einzubinden. Alle Assets, die nicht serialisiert sind (dh in einer Szene verwendet werden, die in einem Build enthalten ist) werden von einem Build ausgeschlossen. Dies gilt jedoch NICHT für alle Ressourcen im Ordner Ressourcen. Gehen Sie daher beim Hinzufügen von Assets zu diesem Ordner nicht über Bord
Assets, die mit Resources.Load oder Resources.LoadAll geladen werden, können zukünftig mit Resources.UnloadUnusedAssets oder Resources.UnloadAsset entladen werden