基础_资源加载

目录

[TOC]

一、使用版本

使用的Unity版本:2018.3.Of2

二、程序集

1.在Unity中创建程序集

  • 创建的脚本默认在Assembly-CSharp.dll程序集中。
  • 通过“鼠标右键–Create–Assembly Definition”可以创建程序集的定义文件,可在此文件中定义程序集名称。
  • 上述程序及定义文件所影响的范围为:同级文件夹及其子文件夹下的脚本。

2.程序集定义文件

如下图所示:

picture0

注意:默认的Assembly-CSharp.dll程序集自动引用所有其他的程序集。

三、Unity中的资源加载方式

1.拖拽到组件上(不会使用)

public GameObject PrefabA;
private void Start()
{
    //资源加载
    //方法一:拖拽到组件上
    Instantiate(PrefabA);
}

2.Resources.Load(一般不用)

//方法二:Resources.Load()
Resources.Load("PrefabA");

3.AssetBundle(常用)

AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/AB包名");
GameObject obj = Instantiate(assetBundle.LoadAsset<GameObject>("Preafab名称"));

4.AssetDataBase.LoadAssetAtPath(框架中使用)

//方法四:AssetDataBase.LoadAssetAtPath()
//加载路径为Assets文件夹下的路径,需要加上后缀
GameObject go = Instantiate(UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>("Assets/GameData/Prefabs/Prefab名称.prefab"));

四、CSharp中的xml序列化

数据类:

    [Serializable]
    public class Model
    {
        [XmlAttribute]
        public int Id { get; set; }
        [XmlAttribute]
        public string Name { get; set; }
        [XmlArray]
        public List<int> Nums;
    }

1.对象转为xml

public void ToXml(Model model)
{
    //Step1:文件流——创建xml文件
    FileStream fs = new FileStream(Application.dataPath + "/TestModel.xml", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
    //Step2:写入流
    StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
    //Step3:创建xml序列化器
    XmlSerializer xmlSerializer = new XmlSerializer(model.GetType());
    //Step4:序列化对象到写入流中
    xmlSerializer.Serialize(sw, model);
    //Step5:关闭流
    sw.Close();
    fs.Close();
}

2.xml转为对象

public Model FromXml()
{
    //Step1:文件流——读取xml文件
    FileStream fs = new FileStream(Application.dataPath + "/TestModel.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
    //Step2:创建xml序列化器
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(Model));
    //Step3:反序列化
    Model model = (Model)xmlSerializer.Deserialize(fs);
    //Step4:关闭流
    fs.Close();
    return model;
}

五、二进制序列化

1.对象转为二进制

public void ToBinary(Model model)
{
    //Step1:文件流——创建二进制文件
    FileStream fs = new FileStream(Application.dataPath + "/TestModel.bytes", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
    //Step2:创建二进制序列化器
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    //Step3:序列化对象到文件流中
    binaryFormatter.Serialize(fs, model);
    //Step4:关闭流
    fs.Close();
}

2.二进制转为对象

public Model FromBinary()
{
    //Step1:文件流——读取二进制文件
    FileStream fs = new FileStream(Application.dataPath + "/TestModel.bytes", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
    //Step2:创建二进制序列化器
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    //Step3:反序列化
    Model model = (Model)binaryFormatter.Deserialize(fs);
    //Step4:关闭流
    fs.Close();
    return model;
}

六、UnityAsset序列化

1.创建Asset

[CreateAssetMenu(fileName = "MyAssetCfg", menuName = "CreateAsset", order = 1)]
    public class MyAssetCfg : ScriptableObject
    {
        public int Id;
        public string Name;
        public List<float> DelayTime;
    }

2.读取Asset

MyAssetCfg amyAssetCfg =UnityEditor.AssetDatabase.LoadAssetAtPath<MyAssetCfg>("Assets/Scripts/MyAssetCfg.asset");