简单实现Unity3D移动端(PC可用)Mod系统制作
关于“Mod系统”
近期有在制作一个安卓端“Mod系统”,其实本质上是将文件打包成对应平台的assetbundle文件,然后再让游戏在启动时读取、加载。原理非常简单,目前我使用的Unity 2021.1.2f1c1版本,理论上应该会向后进行支持,
方案实际上较为简单,这里只是提供了一种比较快捷的方法,仅供参考。
“Mod文件”制作代码
先直接上代码:
// 2021 Olsc
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
public class BuildAssetBundles
{
[MenuItem("Mods/打包Mod")]
[System.Obsolete]
static void CreateAssetBundle() {
string path = EditorUtility.SaveFilePanel("保存Mod", "", "Mod", "assetbundle");
if (path.Length != 0)
{
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
//打包成AssetBundle文件
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildTarget.Android);
}
}
}
将上面的BuildAssetBundles.cs文件放入Unity项目文件下的Editor文件夹中。
此时,你会发现顶部出现了这个选项,代表加载成功。
如何使用它制作“MOD文件”?
首先我们在场景里建立一个模型文件。【模型来源于网络,仅供本例参考使用!】
// 注意!这里我将模型文件设定成了“Mod”的名字,后面会用到。
然后将它拖回项目中创建一个Prefab文件,如下图所示:
然后我们选中这个Prefab文件,点击上面的“”打包Mod“按钮:
在弹出的窗口中选择导出位置,然后等待导出。
导出成功后,本地目录就会出现assetbundle文件:
这里为了方便查看所以将Assetbundle和Prefab文件放到了一起。
至此,导出”Mod“成功。顺带一提贴图可以使用本地的shader文件,其他渲染管线还未进行过导出测试。
如何加载“Mod文件”?
照例,先上代码:
//2021 Olsc
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.Networking;//之所以引用这个是因为案例稍微改一改可以使用在加载服务器Mod文件上。
using System;
public class Mods_Loading : MonoBehaviour
{
private void Start()
{
#if UNITY_EDITOR
//编辑器中Mod.assetbundle的位置在项目目录下的Mods文件夹里
AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(Application.dataPath + "/Mods/Mod.assetbundle"));
#elif UNITY_ANDROID
//安卓设备中Mod.assetbundle的位置,这里设置的默认是在Android/data/包名/Mods文件夹里
AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(Application.persistentDataPath + "/Mods/Mod.assetbundle"));
#endif
//还记得上面我让大家注意的模型文件在场景中的名称吗?就是这个"Mod”
GameObject obj = ab.LoadAsset<GameObject>("Mod");
//默认加载出Mod文件后,Mod文件会默认在地图的(0,0,0)位置,这里是事先给Mod文件一个位置变量
obj.gameObject.transform.localPosition = new Vector3(-7.5f, 24.15636f, -9.654362f);
//Mod文件生成
Instantiate(obj);
}
}
将文件挂载到场景里随便一个物体上,就可以直接测试运行。
问题
我在运行完场景后,发现在编辑器里,“Mod文件”并没有成功加载,已经确保了各个文件的位置设置成功,这是怎么回事呢?
且看BuildAssetBundles.cs文件中的这一行:
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildTarget.Android);
最后一个值为:BuildTarget.Android,即生成的“Mod文件”仅供安卓设备使用,编辑器里并不适用。
可以根据修改后面的变量值,重新生成适合相应平台的“Mod包”来加载测试。
结尾
本人还只是一个菜鸟,这是第一次分享写文章,代码比较简易且非常稚嫩,还希望大佬们多多包含。
本案例仅提供一种方法思路。