zoukankan      html  css  js  c++  java
  • ILRuntime_NewbieGuide—入门

    注:这里不会讲ILRuntime的热更新原理,如果还不是很清楚原理,请先移步到官方文档:https://ourpalm.github.io/ILRuntime/public/v1/guide/index.html

    我主要是讲如何把ILRuntime_HotGame这样一个简易的框架像做lua热更新一样使用。 基于ILRuntime的热更新实现的可以直接使用的框架。

    下面一小段引用前辈的话:

    ILRuntime部分已经在Unity工程中整合,除非有未实现的ILRuntime适配器需要添加,或者ILRuntime有重大更新,否则不建议修改这部分。在C#热更项目中写好功能后编译,框架已经写好编译后事件,VS会直接将生成到Unity项目的dll的扩展名修改成bytes,以避免Unity将热更dll直接编译入最终的Assemble中。 Unity项目中的Enter类为起始类,可以修改Config路径为自己的远程路径。 Unity项目中的UBuildTools类为编辑器辅助类,在Unity编辑器中运行,可以打最终包,也可以打AssetBundle包。

    在C#热更项目部分新加的类建议都从AHotBase继承,这样可以直接使用很多基类方法。 AHotBase类不是从MonoBehaviour继承的,ILRuntime的原作者建议热更项目中尽量不要继承自MonoBehaviour。

    框架将只会在Unity主工程中添加资源和预设,一般不会修改UHotGames的代码,所有的代码都将在AHotGames热更项目中添加和实现。

    以下为主要内容:

    1.目录介绍:

    目录结构

    上图是目录结构: AHotGames是C#热更项目。 UHotGames是Unity项目。 Config.txt是AB加载配置。


    2.工程准备:

    下载我的github工程:切到feature_first分支 https://github.com/getker/ILRuntime_NewbieGuide/tree/feature_first 下载最原始的工程,一步一步跟着下面学习。

    unity打开UHotGames,大概是下面这个样子:

    打开Main场景,跑一下,用vs打开Enter.cs脚本看一下,Start方法里是下载并调用ILRuntime来加载AHotGames写的热更代码的部分,框架中,AHotGames生成的代码再AssetsRemoteResourcesDll下。(到这里都是前辈框架里面的基本东西)

    3.新手上路:

    打开AHotGames项目的AHotGames.sln,此时应该默认用vs打开了。 如果发现你的AHotGames项目中的引用有很多个叹号,那就一个一个引用去找到它。举个例子:

    这里面UnityEngine.dll有警告,那就切到UHotGames的vs工程,找到UnityEngine.dll的路径,回到AHotGames添加UnityEngine.dll的引用。剩下几个叹号同样解决。(全部搞定后还是不行就关闭AHotGames再重新打开。)

    AHotGames工程讲解:

    在这个框架中,作者把AEmptyUI.cs做成所有UI预设的类,所以当我们添加了一个面板的时候,应该复制粘贴一个这样的基类,并且为了方便管理,也应该把脚本名称和类名改成和面板的预设名称一致。


    4.实战

    新建一个Train场景,给Train场景的MainCamera挂一个Enter.cs脚本(你新建一个空物体作为Manager挂更好),并创建面板如下:

    相应看到上面这两张图你应该可以制作出这个名叫UITrain的面板,把它作为预设拖到RemoteResources文件夹下,在Hierarchy删除它,最后保存一下Train场景。


    5.重头戏

    回到AHotGames项目(即我们的热更新项目),如下图:在uis目录下新建UITrain.cs脚本;在最外层新建一个tools目录,下面新建脚本LoadByResources.cs。

    UITrain.cs脚本是和我们unity工程UITrain预设对应的,LoadByResources.cs是我写的一个用Resources加载图片的脚本(很简单,且技术含量不高,若是大佬看见了,勿喷,只是简单的例子,应付一下)。

    具体代码如下(github的wiki上面粘贴代码不好弄,下面的代码大家将就一下):

    UITrain.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using UnityEngine.UI;
    using UnityEngine;
    using System.Collections;
    
    public class UITrain : AHotBase
    {
        private Image image;
        private Button leftBtn;
        private Button rightBtn;
        private int currentImg = 0;//当前图片序号
        private int totalImg = 5;//图片总数,默认为5
        private string assetPath;//路径
        private string directoryPath = "/Resources/Pictures/1/";
        
        protected override void InitComponents()
    	{
            image = FindWidget<Image>("Image_Bg");
            leftBtn = FindWidget<Button>("LeftBtn");
            rightBtn = FindWidget<Button>("RightBtn");
    
            leftBtn.onClick.AddListener(LeftBtnClick);
            rightBtn.onClick.AddListener(RightBtnClick);
        }
    
        void LeftBtnClick()
        {
            Debug.Log("LeftBtnClick");
            leftBtn.interactable = false;
            currentImg--;
            if (currentImg < 0)
            {
                currentImg = (totalImg - 1);
            }
            LoadImage();
        }
    
        void RightBtnClick()
        {
            Debug.Log("RightBtnClick");
            rightBtn.interactable = false;        
            currentImg++;
            if (currentImg > (totalImg - 1))
            {
                currentImg = 0;
            }
            LoadImage();
        }
    
        void LoadImage()
        {
            if (!leftBtn.interactable) { leftBtn.interactable = true; }
            if (!rightBtn.interactable) { rightBtn.interactable = true; }
            
            assetPath = @"file:///" + Application.dataPath + directoryPath + currentImg.ToString() + ".jpg";//给路径赋值
            LoadByResources.ResourcesLoadSync(image, assetPath);
        }
    }
    

    LoadByResources.cs

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class LoadByResources
    {
        /// <summary>
        /// Resources同步加载
        /// </summary>
        /// <param name="image"></param>
        /// <param name="currentImg"></param>
        public static void ResourcesLoadSync(Image image, string assetPath)
        {
            Debug.Log("ResourceLoadSync");
            string[] path = assetPath.Split('/');
            string resourcePath = path[path.Length - 1].Substring(0, path[path.Length - 1].LastIndexOf('.'));
            Debug.Log(resourcePath);
            image.sprite = Resources.Load<Sprite>("Pictures/1/" + resourcePath);
        }
    }
    

    6.尾声:

    写好了之后,打开AEntrance.cs脚本,把里面的//LoadAnotherUI();注释起来,改为LoadAnotherClass("UITrain","UITrain.prefab"); 这就是让它加载我们自己的UITrain面板。 然后重新生成一下项目:

    由于框架已经加入了生成事件,VS会将生成到Unity项目的RemoteResources/Dll目录下的dll的扩展名修改为bytes,所以Unity只会将它作为文本文件load一下,并不会进行编译(这句话是拿前辈的)。

    回到unity,先打包一下,运行MyTools/打包工具 中 “Build AssetBundles”命令,将RemoteResources目录下的所有资源打包成ab(弄好预设的那个时候应该打包一下才好);然后运行unity,效果如下:

    如果上面你没成功,那就看看报错,找找是哪里出错了,上面的整一个过程都贼简单的。 至此,你已经能做了一个小小的demo(观众:就是一个按按钮切换图片的东西,你真无聊),但,你会发现,其实我们最终点的热更新资源还没有出来,对的,因为这篇wiki实在是太啰嗦了,我放到下一个wiki讲。

    https://github.com/getker/ILRuntime_NewbieGuide/wiki/%E8%BF%9B%E9%98%B6

    我爱学习,学习使我快乐。
  • 相关阅读:
    AOD.net
    C# Eval()和Bind()
    .Net使用微軟自帶的用戶驗證和登錄授權
    .Net面試4套
    .Net面試題
    MVC开发模式
    .Net自帶Ajax和GridView
    HTML系列(HTMl+CSS+JavaScript+Jquery)--un
    .Net母版页
    .NetDOM操作--un
  • 原文地址:https://www.cnblogs.com/kerven/p/10237280.html
Copyright © 2011-2022 走看看