学習を記録するだけです。これらのクラスと操作はさらに面倒です。注意しなければなりません、注意しなければなりません、注意しなければなりません。!!
パッケージ化するので、ここにクラスパッケージを書きますが、このクラスはかなり特殊なので、使いこなせばプラグインも書けるようになります。
このスクリプトは、Assets の下の Editor ファイルに配置する必要があります。
名前空間のインポート: UnityEditor を使用します。
ファイルによって残された名前空間: System.IO を使用します。
ここにフォルダーstreamingAssetsが作成され、パッケージ化されたファイルはこのフォルダーの下に配置されます
using UnityEditor;
using System.IO;
public class TextEditor : Editor
{
//写插件
[MenuItem("NewItem/Cube")]
public static void Create()
{
//资源打包
string path=Application.streamingAssetsPath;
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);//创建streamingAssets文件夹
}
//打包
BuildPipeline.BuildAssetBundles(path,
BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);
}
}
このスクリプトはマウントする必要はありません。ツールバーに表示され、パッケージ化されるたびに再実行する必要があります。
ここでファイルを作成し、パッケージ名を付けます。パッケージ化したいものはすべて、ここでパッケージ名を付ける必要があります。ここでは次のものだけをカットします。元のスクリプトにあるボールの付いたプレハブもパッケージ化されます。
ファイルをロードするには3つの方法があります
public class TestAB : MonoBehaviour
{
string path=Application.streamingAssetsPath+"/qiu";//qiu:打包后的预设文件
void Start()
{
StartCoroutine(LoadFromMemory(path));//1
LoadFile();//2
StartCoroutine(LoadFromServer());//3
}
//1.重内存中异步加载
IEnumerator LoadFromMemory(string name)
{
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(name));//打包后的预设
yield return request;
AssetBundle ab=request.assetBundle;
GameObject go = ab.LoadAsset<GameObject>("qiu");//qiu 原文件
Instantiate(go);
ab.Unload(false);//卸载资源和资源包
}
//2.从本地加载
void LoadFile()
{
AssetBundle ab = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "qiu"));//打包后的预设
GameObject qiu= ab.LoadAsset<GameObject>("qiu");//qiu 原文件
Instantiate(qiu);
ab.Unload(false);//卸载资源和资源包
}
//3.重服务器上加载
IEnumerator LoadFromServer()
{
string path = "file:///" + Application.streamingAssetsPath + "/qiu";//打包后的预设
UnityWebRequest request=UnityWebRequestAssetBundle.GetAssetBundle(path);
yield return request.SendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
GameObject qiu = ab.LoadAsset<GameObject>("qiu");//qiu 原文件
Instantiate(qiu);
ab.Unload(false);//卸载资源和资源包
}
void Update()
{
}
}
これは、対応するファイルのすべての列関係ファイルを見つける別の方法です。
public class TestAB : MonoBehaviour
{
string path=Application.streamingAssetsPath+"/qiu";//qiu:打包后的预设文件
//加载配置文件
void LoadManifest()
{
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/StreamingAssets");
AssetBundleManifest abm = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
string[] s = abm.GetAllDependencies("qiu");//qiu 材质包的名字 找出他所有的依赖关系
foreach (var item in s)
{
print(item);
}
ab.Unload(false);//卸载资源和资源包
}
}
ここでは記録と学習を行うため、パッケージ化されたファイルをサーバーにアップロードします。ここではサーバーとして Server を作成し、クライアントとして Client を作成します。
パッケージ化されたファイルをサーバー ファイルに手動でコピーする必要があります
以下では、コードを使用してファイルをクライアントにアップロードし、ホット アップデートを使用して更新します。
using UnityEngine.Networking;
using System.IO;
public class DownLoad : MonoBehaviour
{
public AssetBundle ab;
void Start()
{
StartCoroutine(Load());
}
//从服务器上加载文件到客户端
IEnumerator Load()
{
string path = "file:///" + Application.dataPath + "/Server/qiu";//Server 服务器端
UnityWebRequest request= UnityWebRequestAssetBundle.GetAssetBundle(path);
yield return request.SendWebRequest();
ab = DownloadHandlerAssetBundle.GetContent(request);
TextAsset ta = ab.LoadAsset<TextAsset>("qiu.lua.txt");//配置文件
string newPath = Application.dataPath + "/Client/qiu.lua.txt";//Client 客户端
File.WriteAllText(newPath, ta.text);
}
}
次はホットアップデートですが、これはLuaファイルではなくtxtファイルであることに注意してください。
まずホットアップデートを可能にするクラスを作成し、カメラにマウントします。
using XLua;
[Hotfix]
public class Test : MonoBehaviour
{
private GameObject cube;
void Start()
{
cube = Resources.Load<GameObject>("Cube");
}
void Update()
{
if(Input.GetMouseButtonDown(0))
{
Instantiate(cube);
}
}
}
ホットアップデートファイルを書き込む
ここでは、カメラでスクリプトを取得するためのコードを使用します
スクリプトを通じてクライアント上の ab パッケージを取得し、クラスのホット アップデートを実行します。
engine=CS.UnityEngine
xlua.hotfix(CS.Test,'Update',
function(self)
if engine.Input.GetMouseButtonDown(0) then
camera=engine.GameObject.Find('Main Camera')
download=camera:GetComponent('DownLoad')
ab=download.ab
qiu=ab:LoadAsset('qiu')
engine.GameObject.Instantiate(qiu)
end
end
)
以下は、ファイルを開いたり閉じたりするためのクラスで、別のクラスとして記述されており、後で呼び出すのに便利です (もちろん、パッケージ化操作を試しているだけの場合は、一度呼び出すだけでよく、必要ありません) ) このクラスはシングルトンとして記述されており、将来クラス メソッドでファイルを開く必要がある場合にこれを直接呼び出すことができ、毎回ファイルのオープン操作とクローズ操作を記述する必要はありません (これも単純なフレームワークです。電話しやすい)
ファイルのサフィックスに複数の異なるサフィックスがある場合、コルーチンの複数のメソッドで十分であることに注意してください。
using System.IO;
using XLua;
public class XLuaManager
{
//调用lua文件的简单框架
//单例
private XLuaManager() { }
private static XLuaManager instance=null;
public static XLuaManager Instance
{
get
{
if(instance == null)
{
instance = new XLuaManager();
Init();
}
return instance;
}
}
public static LuaEnv lua;
static void Init()//初始化lua文件
{
lua=new LuaEnv();
lua.AddLoader(FileLoader);
}
static byte[] FileLoader(ref string fileName)
{
string path = Application.dataPath + "/Lua/" + fileName + ".lua.txt";
return File.ReadAllBytes(path);
}
public void Dostring(string str)
{
lua.DoString(str);
}
public void Dispose()//释放资源
{
lua.Dispose();
}
}
ホット アップデートを実装する最後のステップです。ファイルを呼び出します。
public class TestLua : MonoBehaviour
{
void Start()
{
XLuaManager.Instance.Dostring("require('qiu')");
}
}
フレームワークの利点はここで実現されており、ファイルを開く必要がある場合、メソッドを呼び出して、開く必要のあるファイル名をパラメータとして渡すだけで済みます。