简单实现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文件放到了一起

这里为了方便查看所以将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包”来加载测试。


结尾

本人还只是一个菜鸟,这是第一次分享写文章,代码比较简易且非常稚嫩,还希望大佬们多多包含。

本案例仅提供一种方法思路。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值