ScriptableObject脚本化对象在unity项目中可以作为配置文件,也可以用来做存储,和xml等类似。因为是官方提供的数据类型,可视化编辑方面也十分优秀,使用频率还是非常高的。下面通过一个“多国语言配置”的例子,详细了解一下ScriptableObject。效果如图。
Localization.cs
public class Localization : ScriptableObject
{
public string title = "Language";
public List<Content> list;
void OnEnable()
{
if (list == null)
list = new List<Content>();
}
public void Add(Content content)
{
list.Add(content);
}
public void Remove(Content content)
{
list.Remove(content);
}
public void RemoveAt(int index)
{
list.RemoveAt(index);
}
}
[System.Serializable]
public class Content
{
public string en;
public string cn;
public string jp;
}
public class CreateScriptableObject : Editor
{
public static void CreateAsset<Type>() where Type : ScriptableObject
{
Type item = ScriptableObject.CreateInstance<Type>();
string root = Application.dataPath + "/Resources";
if (!Directory.Exists(root))
{
Directory.CreateDirectory(root);
}
string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Resources/" + typeof(Type) + ".asset");
AssetDatabase.CreateAsset(item, path);
AssetDatabase.SaveAssets();
EditorUtility.FocusProjectWindow();
Selection.activeObject = item;
}
[MenuItem("Assets/Create/CreateLocalization")]
public static void CreateLocalization()
{
CreateAsset<Localization>();
}
}
Translate.cs
public class Translate : MonoBehaviour
{
Localization languages;
[SerializeField] List<Toggle> toggles;
[SerializeField] List<Text> textList;
void Awake()
{
languages = Resources.Load<Localization>("Localization");
for (int i = 0; i < toggles.Count; i++)
{
int id = i;
toggles[i].onValueChanged.AddListener((bool value) => OnToggleClick(id, value));
}
}
void Start()
{
OnToggleClick(0, true);
}
void OnToggleClick(int id, bool value)
{
if (value)
{
//Debug.Log(id.ToString() + ":" + value);
switch (id)
{
case 0: //en
for (int i = 0; i < textList.Count; i++)
{
textList[i].text = languages.list[i].en;
}
break;
case 1: //cn
for (int i = 0; i < textList.Count; i++)
{
textList[i].text = languages.list[i].cn;
}
break;
case 2: //jp
for (int i = 0; i < textList.Count; i++)
{
textList[i].text = languages.list[i].jp;
}
break;
}
}
}
}