Wenn du eine Komponente scriptest, dann kannst du diese ja mehrere Male auf beliebige GameObjects packen.
public class Test : MonoBehaviour
{
public int zahl;
}
Jede Instanz dieser Klasse kann dann seinen Wert für jede der Felder (hier: "Zahl") haben.
Hier siehst du zwei Instanzen desselben Scripts auf einem GameObject, und jede hat ihren eigenen Wert für die Variable.
Wenn du nun nicht von MonoBehaviour erbst, sondern von "ScriptableObject", dann kannst du das Script nicht mehr auf GameObjects ziehen. Es verliert die Fähigkeit, eine Komponente zu sein. Was du dafür aber machen kannst, ist das CreateAssetMenuAttribute drüber zu packen, so wie ich das oben gemacht habe. Damit fügst du für dein ScriptableObject einen Menüpunkt im Asset/Create-Menü hinzu. Das ist das Menü, das erscheint, wenn du in deinen Assets rechtsklickst.
Durch
[CreateAssetMenu(menuName = "Language/Key")]
entsteht also:
Wenn du da jetzt draufklickst, entsteht ein neues Asset, eine Datei, die eine Instanz deiner Klasse darstellt. So wie bei Komponenten, nur halt nicht auf einem GameObject als Komponente angebracht, sondern einfach als Datei in den Assets. Sieht dann so aus:
Wenn du dieses Ding dann markierst, siehst du im Inspektor wieder alle Felder (in diesem Fall: "Zahl"), die die Klasse hat. Und wieder kann jede Instanz deiner Klasse einen eigenen Wert haben, der sich von den Werten der anderen Objekte derselben Sorte unterschiedet.
Wenn du jetzt also die ScriptableObject-Klasse, die ich oben gepostet habe, 1:1 in dein Projekt kopierst (Das obligatorische "using UnityEngine;" darüber aber nicht vergessen), dann kannst du lauter solche Objekte erzeugen. Statt einer Zahl hat aber jedes "LanguageKey"-Objekt, das du erstellst, drei Strings als Felder: "de", "en" und "fr". Das kannst du beliebig ändern oder erweitern.
Wenn du jetzt eines der LanguageKey-Objekte markierst, kannst du einen bestimmen String in allen benötigten Sprachen angeben:
(In den Screenshots heißt die Klasse MyLanguageKey, weil ich sonst die Klasse doppelt gehabt hätte)
Wenn du jetzt das, was du im zweiten Code-Ausschnitt siehst, in dein System einbaust, kannst du diese drei Strings abfragen, nachdem du das Objekt in das Feld gezogen hast:
Hier hast du noch eine ganze Klasse, die das ganze demonstriert:
using UnityEngine;
public class LanguageKeyTest : MonoBehaviour
{
public LanguageKey languageKey;
private void Start()
{
Debug.Log("Englisch: " + languageKey.en);
Debug.Log("Deutsch: " + languageKey.de);
Debug.Log("Französisch: " + languageKey.fr);
}
}