unity3d
Resurser
Sök…
Introduktion
Med resurser är det möjligt att dynamiskt ladda tillgångar som inte är en del av scenen. Det är mycket användbart när du måste använda tillgång på begäran, till exempel lokalisera flerspråkiga ljud, texter osv.
Tillgångar måste placeras i en mapp som heter Resurser . Det är möjligt att ha flera resursmappar spridda över projektets hierarki. Resources
granskar alla resursmappar du kan ha.
Varje tillgång som placeras i resurser kommer att inkluderas i byggandet, även om det inte refereras till i din kod. Sätt alltså inte in tillgångar i resurser på ett diskriminerande sätt.
//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();
}
}
Resurser 101
Introduktion
Unity har några "speciellt namngivna" mappar som möjliggör olika användningsområden. En av dessa mappar kallas resurser
Mappen Resurser är ett av endast två sätt att ladda tillgångar under körning i Unity (det andra är AssetBundles (Unity Docs)
Mappen Resurser kan finnas var som helst i mappen Tillgångar, och du kan ha flera mappar med namnet Resurser. Innehållet i alla "Resurser" -mappar slås samman under sammanställningstiden.
Det primära sättet att ladda en tillgång från en resursmapp är att använda resursfunktionen . Denna funktion tar en strängparameter som låter dig ange sökvägen för filen i förhållande till mappen Resurser. Observera att du INTE behöver ange filändelser när du laddar en tillgång
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));
}
}
Objekt som består av flera objekt kan också laddas från resurser. Exempel på sådana föremål är 3D-modeller med bakade texturer eller en multipel sprite.
//This example will load a multiple sprite texture from Resources named "A_Multiple_Sprite"
var sprites = Resources.LoadAll("A_Multiple_Sprite") as Sprite[];
Sätta ihop allting
Här är en av mina hjälparklasser som jag använder för att ladda alla ljud för alla spel. Du kan bifoga detta till alla GameObject i en scen och det kommer att ladda de angivna ljudfilerna från mappen Resurser / Ljud
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;
}
}
}
Slutanmärkningar
Enhet är smart när det gäller att inkludera tillgångar i din byggnad. Alla tillgångar som inte är serialiserade (dvs. används i en scen som ingår i en build) exkluderas från en build. Detta gäller dock INTE för någon tillgång i resursmappen. Gå därför inte överbord när du lägger till tillgångar i den här mappen
Tillgångar som laddas med Resources.Load eller Resources.LoadAll kan lossas i framtiden med hjälp av Resources.UnloadUnusedAssets eller Resources.UnloadAsset