继上次分析了热更新的 Demo 后, 这次来介绍如何在热更新代码中使用 MonoBehaviour.
MonoBehaviour 挂载到 GameObject 对象上的脚本的基类. 平常 Unity 开发时, 简单的做法就是编写一个继承自 MonoBehaviour 的脚本, 将它挂载到要操纵的 GameObject 上, 赋予它各种行为.
当然, 在某些大型项目中, 可能并不推荐导出挂脚本的方式, 但是本文旨在介绍如何在脚本中继承并编写 MonoBehaviour, 暂时忽略这个问题.
本章的目标:
用脚本创建一个 MonoBehaviour. 并挂载到某个物体上, 在 Start 方法中使用协程加载 baidu 的首页的 html, 然后将它的 html 代码显示到文本框上.
操作步骤:
新建一个 Unity 热更新项目, 或者打开上次的项目. 如果您不知道怎么新建, 参考上一篇文章或者看官网
打开 HotFixDemoScene1, 将文本框改大.
打开热更新项目.
如果您使用的是 Unity2017.2 以后的版本, 需要注意以下问题: UnityEngine.WWW 这个类用于从网络下载数据. 但是自从 Unity2017.2 之后, Unity 将它的 API 拆分到了许多其他 dll 中. 默认系统只将 UnityEngine.CoreModule.dll 的 API 导出了, 但是 UnityEngine.WWW 并没有包含在这个 dll 里.
可以使用如下办法, 来确定某个类在哪个 dll 里: 在 VS 中, 写下要确定的这个类的名字.
右键点击刚才写的类名, 在弹出菜单中选择速览定义, 即可查看到这个类型所在的 dll.
这里我们定位到在 UnityEngine.UnitywebRequestWWWModule.dll 中
打开热更项目的 genapi.config.xml, 将这个 dll 配置到以下配置节中:
- <!--Configure DLLs to export-->
- <buildassemblys>
- <assembly value="D:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0\System.dll"></assembly>
- <assembly value="D:\Program Files\Unity\Editor\Data\Managed\UnityEngine\UnityEngine.CoreModule.dll"></assembly>
- <assembly value="D:\Program Files\Unity\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestWWWModule.dll"></assembly>
- <assembly value="D:\Program Files\Unity\Editor\Data\UnityExtensions\Unity\GUISystem\UnityEngine.UI.dll"></assembly>
- <assembly value="F:/ASTool_UnityTest/AS3HotFix_WWW\Library\ScriptAssemblies\Assembly-CSharp.dll"></assembly>
- </buildassemblys>
执行 bat/CreateUnityAPI.bat , 再次生成 Unity 的 API. 如此, 即可在热更新项目中使用 WWW 相关的类型
打开热更新项目的 Main.as.
本次我们将功能写在包外代码内, 因此将 Main 类型的代码清空, 然后贴下如下代码:
- package
- {
- [Doc]
- /**
- * ...
- * @author
- */
- public class Main
- {
- public function Main()
- {
- }
- public function update():void
- {
- }
- }
- }
- // 写在包外的代码, 会在 Main 这个类第一次被实例化之前执行一次.
- import system.collections.IEnumerator;
- import unityengine.Camera;
- import unityengine.GameObject;
- import unityengine.MonoBehaviour;
- import unityengine.Time;
- import unityengine.WWW;
- import unityengine.ui.Text;
- // 定义一个继承自 MonoBehaviour 的类型.
- class baidutest extends MonoBehaviour
- {
- //Start 方法会在 Update 前调用一次.
- function Start():IEnumerator
- {
- // 创建 WWW 对象, 并访问 www.baidu.com
- var www:WWW = new WWW("http://www.baidu.com");
- while ( !www.isDone)
- {
- // 更新 UI 元素.
- Text( GameObject.find("Text").getComponent(Text)).text = "loading from baidu" + Time.frameCount;
- // 使用 yield 关键字, 可以使用 Unity 协程
- yield return www;
- }
- // 加载完毕后, 将 html 内容显示到 UI 上.
- Text( GameObject.find("Text").getComponent(Text)).text = www.text.substr(1024,1024);
- // 销毁 WWW 对象.
- www.dispose();
- }
- }
- // 在主相机上挂载脚本中定义的 baidutest.
- Camera.main.gameObject.addComponent(baidutest);
见注释, 我们直接在脚本中定义一个 MonoBehaviour 的子类, 并且挂载到了相机上.
执行结果:
如此, 即实现了在脚本中使用 MonoBehaviour.
来源: https://www.cnblogs.com/ashei/p/8876963.html