前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour

作者头像
用户1687945
发布2018-05-02 11:39:44
1.3K0
发布2018-05-02 11:39:44
举报

继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour。

MonoBehaviour挂载到GameObject对象上的脚本的基类。平常Unity开发时,简单的做法就是编写一个继承自MonoBehaviour的脚本,将它挂载到要操纵的GameObject上,赋予它各种行为。

当然,在某些大型项目中,可能并不推荐导出挂脚本的方式,但是本文旨在介绍如何在脚本中继承并编写MonoBehaviour,暂时忽略这个问题。

本章的目标:

       用脚本创建一个MonoBehaviour。并挂载到某个物体上,在Start方法中使用协程加载 baidu 的首页的html,然后将它的html代码显示到文本框上。

操作步骤:

  1. 新建一个Unity热更新项目,或者打开上次的项目。如果您不知道怎么新建,参考上一篇文章或者看官网
  2. 打开HotFixDemoScene1,将文本框改大。
  1. 打开热更新项目。
  2. 如果您使用的是Unity2017.2以后的版本,需要注意以下问题:UnityEngine.WWW这个类用于从网络下载数据。但是自从Unity2017.2之后,Unity将它的API拆分到了许多其他dll中。默认系统只将UnityEngine.CoreModule.dll的API导出了,但是UnityEngine.WWW并没有包含在这个dll里。
    1. 可以使用如下办法,来确定某个类在哪个dll里:在VS中,写下要确定的这个类的名字。
    2. 右键点击刚才写的类名,在弹出菜单中选择速览定义,即可查看到这个类型所在的dll。
代码语言:txt
复制
1. 这里我们定位到在UnityEngine.UnityWebRequestWWWModule.dll中
2. 打开热更项目的genapi.config.xml,将这个dll配置到以下配置节中:  
3. 执行 bat/CreateUnityAPI.bat ,再次生成Unity的API。如此,即可在热更新项目中使用WWW相关的类型
代码语言:javascript
复制
<!--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>
  1. 打开热更新项目的 Main.as。
  2. 本次我们将功能写在包外代码内,因此将Main类型的代码清空,然后贴下如下代码:
代码语言:javascript
复制
 1 package
 2 {
 3     
 4     [Doc]
 5     /**
 6      * ...
 7      * @author 
 8      */
 9     public class Main
10     {
11 
12         public function Main() 
13         {
14         }
15         
16         public function update():void
17         {
18             
19         }        
20     }
21     
22 }
23 
24 //写在包外的代码,会在Main这个类第一次被实例化之前执行一次。
25 
26 import system.collections.IEnumerator;
27 import unityengine.Camera;
28 import unityengine.GameObject;
29 import unityengine.MonoBehaviour;
30 import unityengine.Time;
31 import unityengine.WWW;
32 import unityengine.ui.Text;
33 
34 //定义一个继承自MonoBehaviour的类型。
35 class baidutest extends MonoBehaviour
36 {
37     //Start方法会在Update前调用一次。
38     function Start():IEnumerator
39     {
40         //创建WWW对象,并访问 www.baidu.com
41         var www:WWW = new WWW("http://www.baidu.com");
42         while (    !www.isDone) 
43         {
44             //更新UI元素.
45             Text( GameObject.find("Text").getComponent(Text)).text = "loading from baidu " + Time.frameCount;
46             //使用 yield关键字,可以使用Unity协程
47             yield return www;
48         }
49         
50         
51         //加载完毕后,将html内容显示到UI上。
52         Text( GameObject.find("Text").getComponent(Text)).text = www.text.substr(1024,1024);
53         //销毁WWW对象。
54         www.dispose();
55         
56     }
57     
58 }
59 
60 //在主相机上挂载脚本中定义的baidutest。
61 Camera.main.gameObject.addComponent(baidutest);
  1. 见注释,我们直接在脚本中定义一个MonoBehaviour的子类,并且挂载到了相机上。
  2. 执行结果:

如此,即实现了在脚本中使用MonoBehaviour。

 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1l1wacrkzlbqn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本章的目标:
  • 操作步骤:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档