本文是学习Siki学院Ocean老师的《Unity商业游戏底层资源加载框架(Unity2018.1)》视频课程的学习笔记和总结
程序集
Unity中自定义程序集,需要进行依赖设定,设置完成之后,点击Apply保存
资源加载方式
- 直接挂载到组件上
- 通过Resources.Load()的方式加载:要加载的资源必须放置在Resources文件夹下面
- 通过AssetBundle方式加载:绝大部分公司都是使用这种方式加载
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class BundleEditor { /// <summary> /// 打包AssetBundle包 /// </summary> [MenuItem("Tools/Build Bundle")] public static void Build() { BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget); AssetDatabase.Refresh(); } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ResourceTest : MonoBehaviour { private void Start() { //使用AssetBundle加载资源,并实例化 AssetBundle bundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/attack"); GameObject prefab = bundle.LoadAsset<GameObject>("attack"); GameObject.Instantiate(prefab); } }
- 通过AssetDataBase.LoadAtPtah()方式加载
XML序列化和反序列化
using System.Collections.Generic;
using System.Xml.Serialization;
[System.Serializable]
public class TestSerialize
{
[XmlAttribute("Id")]
public int Id { get; set; }
[XmlAttribute("Name")]
public string Name { get; set; }
[XmlElement("List")]
public List<int> List = new List<int>();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Xml.Serialization;
public class Test: MonoBehaviour
{
private void Start()
{
//SerializeTest();
DeseralizeTest();
}
private void SerializeTest()
{
TestSerialize testSerialize = new TestSerialize()
{
Id = 1,
Name = "测试",
List = new List<int>() { 2, 3 }
};
XmlSerialize(testSerialize);
}
private void DeseralizeTest()
{
TestSerialize testSerialize = XmlDeserialize();
Debug.LogFormat("Id:{0},Name:{1}", testSerialize.Id, testSerialize.Name);
foreach (var item in testSerialize.List)
{
Debug.Log(item);
}
}
/// <summary>
/// 序列化
/// </summary>
/// <param name="testSerialize"></param>
private void XmlSerialize(TestSerialize testSerialize)
{
FileStream fileStream = null;
StreamWriter sw = null;
try
{
fileStream = new FileStream(Application.dataPath + "/test.xml", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
sw = new StreamWriter(fileStream, System.Text.Encoding.UTF8);
XmlSerializer xs = new XmlSerializer(testSerialize.GetType());
xs.Serialize(sw, testSerialize);
}
catch (System.Exception e)
{
Debug.LogError(e);
}
finally
{
if (sw != null)
sw.Close();
if (fileStream != null)
fileStream.Close();
}
}
/// <summary>
/// 反序列化
/// </summary>
/// <returns></returns>
private TestSerialize XmlDeserialize()
{
FileStream fs = null;
try
{
fs = new FileStream(Application.dataPath + "/test.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
XmlSerializer xs = new XmlSerializer(typeof(TestSerialize));
TestSerialize testSerialize = xs.Deserialize(fs) as TestSerialize;
return testSerialize;
}
catch (System.Exception e)
{
Debug.LogError(e);
}
finally
{
if (fs != null)
fs.Close();
}
return null;
}
}
二进制序列化和反序列化
using System.Collections.Generic;
[System.Serializable]
public class TestSerialize
{
public int Id { get; set; }
public string Name { get; set; }
public List<int> List = new List<int>();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public class Test: MonoBehaviour
{
private void Start()
{
//BinarySerializeTest();
BinaryDeserializeTest();
}
#region Binary
private void BinarySerializeTest()
{
TestSerialize testSerialize = new TestSerialize()
{
Id = 10010,
Name = "BinarySerialize测试",
List = new List<int>() { 100, 150 }
};
BinarySeralize(testSerialize);
}
/// <summary>
/// 二进制序列化
/// </summary>
/// <param name="testSerialize"></param>
private void BinarySeralize(TestSerialize testSerialize)
{
FileStream fs = null;
try
{
fs = new FileStream(Application.dataPath + "/test.bytes", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, testSerialize);
}
catch (System.Exception e)
{
Debug.LogError(e);
}
finally
{
if (fs != null)
fs.Close();
}
}
private void BinaryDeserializeTest()
{
TestSerialize testSerialize = BinaryDeseralize();
Debug.LogFormat("Id:{0},Name:{1}", testSerialize.Id, testSerialize.Name);
foreach (var item in testSerialize.List)
{
Debug.Log(item);
}
}
/// <summary>
/// 二进制反序列化
/// </summary>
/// <returns></returns>
private TestSerialize BinaryDeseralize()
{
FileStream fs = null;
try
{
fs = new FileStream(Application.dataPath + "/test.bytes", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
BinaryFormatter bf = new BinaryFormatter();
TestSerialize testSerialize = bf.Deserialize(fs) as TestSerialize;
return testSerialize;
}
catch (System.Exception e)
{
Debug.LogError(e);
}
finally
{
if (fs != null)
fs.Close();
}
return null;
}
#endregion
}
Assets序列化
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "TestAssets",menuName ="CreateAssets",order = 0)]
public class AssetsSerialize : ScriptableObject
{
public int Id;
public string Name;
public List<string> TestList;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ResourceTest : MonoBehaviour
{
private void Start()
{
ReadTestAssets();
}
#region Assets
private void ReadTestAssets()
{
AssetsSerialize assetsSerialize = UnityEditor.AssetDatabase.LoadAssetAtPath<AssetsSerialize>("Assets/Scripts/TestAssets.asset");
Debug.Log(assetsSerialize.Id);
Debug.Log(assetsSerialize.Name);
foreach (var item in assetsSerialize.TestList)
{
Debug.Log(item);
}
}
#endregion
}