用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (一)

我们的热更新脚本在实际使用中,当然也要支持常用的第三方组件,例如这里介绍一个非常实用的第三方UI库:FairyGUI.

什么是FairyGUI

这里照搬FaiyGUI官网的介绍:

重新定义 UI 制作流程,全可视化,零代码,是一款同时适用于程序员、设计师和游戏策划的UI制作工具。

配合FairyGUI-SDK,在各个游戏引擎都能得到高效的渲染表现,独特的FairyBatching技术可自动优化复杂界面的DC数量。

我们这里自然是使用它的Unity组件啦。

我们这篇文章的主旨并非是介绍如何使用FairyGUI制作界面,而是如果让FairyGUI制作的界面可以被我们的热更脚本驱动。

因此,这里我们可以先跳过FairyGUI的编辑器,直接下载它提供的Unity Demo,来进行热更新的改造演示。

在这里下载FairyGUI的Unity组件

导入FairyGUI

  1. 新建一个新的Unity工程。
  2. 将FairyGUI的package导入进来。
  3. 进入 Assets->FairyGUI->Examples->Scenes。这里展示了FairyGUI的全部Demo。

我们这一次先演示最简单的热更新处理,因此本次先选用一个不需要在脚本中继承和扩展FairyGUI的组件的例子。

我们选择Example 23,2D图像滤镜Demo。

准备热更新

  1. 首先我们将这个场景另存为F_Filter。
  2. 导入ActionScript3 虚拟机的unity插件包,并生成热更新项目。如果您不知道怎么操作,可以查看这里
  3. ActionScript3插件包已更新,请下载最新的插件包  v0.96f6 以及以后版本

场景分析:

  • 场景中的UIPanel物件,上面承载了UI界面。
  • UIPanel物件上有FilterMain.cs脚本,里面控制了UI的逻辑。
  • 现在我们尝试将此场景的逻辑改为通过ActionScript3脚本热更新。

操作步骤:

  1. 移除FilterMain.cs。我们将在ActionScript3中操作逻辑。
  2. UIPanel物件下的 UIPanel (Script)设置为禁用状态。我们将在AS3解释器初始化完成后,重新启用它。
  3. 进入Assets->ASRuntimePlayer,将 AS3Player预设和AS3StartupProgress预设拖到场景上。
  4. 将AS3Player物件下的Action Script Start Up 脚本组件的Document Class 设置为Filter。

现在我们将C#脚本的内容移植到ActionScript3脚本中。

原Demo在Start 方法中,将UI上的滑块事件添加了一个处理程序,然后在处理程序中更改UI元素的滤镜参数。见代码:

void Start()
    {
        _mainView = this.GetComponent<UIPanel>().ui;

        BlurFilter blurFilter = new BlurFilter();
        blurFilter.blurSize = 2;
        _mainView.GetChild("n21").filter = blurFilter;

        _s0 = _mainView.GetChild("s0").asSlider;
        _s1 = _mainView.GetChild("s1").asSlider;
        _s2 = _mainView.GetChild("s2").asSlider;
        _s3 = _mainView.GetChild("s3").asSlider;
        _s4 = _mainView.GetChild("s4").asSlider;

        _s0.value = 100;
        _s1.value = 100;
        _s2.value = 100;
        _s3.value = 200;
        _s4.value = 20;

        _s0.onChanged.Add(__sliderChanged);
        _s1.onChanged.Add(__sliderChanged);
        _s2.onChanged.Add(__sliderChanged);
        _s3.onChanged.Add(__sliderChanged);
        _s4.onChanged.Add(__sliderChanged);
    }

    void __sliderChanged(EventContext context)
    {
        int cnt = _mainView.numChildren;
        for (int i = 0; i < cnt; i++)
        {
            GObject obj = _mainView.GetChildAt(i);
            if (obj.filter is ColorFilter)
            {
                ColorFilter filter = (ColorFilter)obj.filter;
                filter.Reset();
                filter.AdjustBrightness((float)(_s0.value - 100) / 100f);
                filter.AdjustContrast((float)(_s1.value - 100) / 100f);
                filter.AdjustSaturation((float)(_s2.value - 100) / 100f);
                filter.AdjustHue((float)(_s3.value - 100) / 100f);
            }
            else if (obj.filter is BlurFilter)
            {
                BlurFilter filter = (BlurFilter)obj.filter;
                filter.blurSize = (float)_s4.value / 100;
            }
        }
    }

现在我们将这个逻辑脚本改写为ActionScript3热更新脚本:

  1. 打开热更新项目,新建Filter类。
  2. 将如下代码复制到Filter类中。

    package
    {
        /**
         * ...
         * @author
         */
        public class Filter
        {
    
            public function Filter()
            {
    
            }
    
        }
    
    }
    
    import fairygui.BlurFilter;
    import fairygui.ColorFilter;
    import fairygui.EventContext;
    import fairygui.GComponent;
    import fairygui.GObject;
    import fairygui.GSlider;
    import fairygui.Stage;
    import fairygui.UIPackage;
    import fairygui.UIPanel;
    import unityengine.Application;
    import unityengine.GameObject;
    import unityengine.MonoBehaviour;
    class FilterMain extends MonoBehaviour
    {
        var _mainView:GComponent;
        var _s0:GSlider;
        var _s1:GSlider;
        var _s2:GSlider;
        var _s3:GSlider;
        var _s4:GSlider;
    
        function Awake()
        {
            Application.targetFrameRate = 60;
    
            UIPackage.addPackage______("UI/Filter");
        }
    
        function Start()
        {
            _mainView = UIPanel(this.getComponent(UIPanel)).ui;
    
            var blurFilter:BlurFilter= new BlurFilter();
            blurFilter.blurSize = 2;
            _mainView.getChild("n21").filter = blurFilter;
    
            _s0 = _mainView.getChild("s0").asSlider;
            _s1 = _mainView.getChild("s1").asSlider;
            _s2 = _mainView.getChild("s2").asSlider;
            _s3 = _mainView.getChild("s3").asSlider;
            _s4 = _mainView.getChild("s4").asSlider;
    
            _s0.value = 100;
            _s1.value = 100;
            _s2.value = 100;
            _s3.value = 200;
            _s4.value = 20;
    
            _s0.onChanged.add(__sliderChanged);
            _s1.onChanged.add(__sliderChanged);
            _s2.onChanged.add(__sliderChanged);
            _s3.onChanged.add(__sliderChanged);
            _s4.onChanged.add(__sliderChanged);
        }
    
        function __sliderChanged(context:EventContext):void
        {
            var cnt:int = _mainView.numChildren;
            for (var i:int = 0; i < cnt; i++)
            {
                var obj:GObject = _mainView.getChildAt(i);
                if (obj.filter is ColorFilter)
                {
                    var filter1:ColorFilter= ColorFilter(obj.filter);
                    filter1.reset();
                    filter1.adjustBrightness((_s0.value - 100) / 100);
                    filter1.adjustContrast((_s1.value - 100) / 100);
                    filter1.adjustSaturation((_s2.value - 100) / 100);
                    filter1.adjustHue((_s3.value - 100) / 100);
                }
                else if (obj.filter is BlurFilter)
                {
                    var filter2:BlurFilter = BlurFilter(obj.filter);
                    filter2.blurSize = _s4.value / 100;
                }
            }
        }
    
    }
    
    MonoBehaviour( GameObject.find("UIPanel").getComponent(UIPanel)).enabled = true;
    GameObject.find("UIPanel").addComponent(FilterMain);
  3. 我们看到as3的代码和C#基本改动不大,几乎直接拷贝复制再改改即可。关注最后两行:我们在包外代码中激活了UIPanel,并挂载了脚本中定义的FilterMain类。
  4. 点击编译。
  5. 在unity中点击播放。我们看到脚本已成功生效。

原文地址:https://www.cnblogs.com/ashei/p/9020702.html

时间: 2024-10-07 12:45:35

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (一)的相关文章

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger

原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链. 任意对象类型都有一个prototype属性,包括导入的Unity的API也有.我们可以和JS一样的对这个prototype进行操作,比如动态的添加成员,添加方法等. 如果您决定使用原型链,那么必须舍弃编译时类型检查.如果使用强类型,则编译器会认为动态添加的成员不存在,而提示编译错误.解决办法为去

二、unity游戏热更新专题

第 1 章 : 热更新技术学习介绍 课时1:101-热更新技术学习介绍 11:55 什么是热更新? 举例来说 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新打包,然后让玩家重新下载(浪费流量和时间,体验不好). 热更新可以在不重新下载客户端的情况下,更新游戏的内容. 热更新一般应用在手机网游上. 为什么C#脚本不可以直接更新? C#是一门编程语言,它运行之前需要进行编译,而这个编译的过程在移动

Unity代码热更新方案 JSBinding + SharpKit 介绍

目前Unity的代码更新方案有很多,主要以lua为主. JSBinding + SharpKit 是一种新的技术,他做了两件事情: JSBinding将C#导出到JS中,让你可以用JS写代码,就好像 lua 一样 SharpKit(sharpkit.net)将C#代码翻译成JS代码. 因此,他可以让你使用C#编译代码,之后一键转换成JS代码并正常运行.如果你的项目已经使用C#开发并希望能够更新代码,欢迎尝试使用. 本文先做简介,后续本博客将做详细介绍. 完全支持序列化功能.即可以在 Inspec

Unity逻辑热更新

声明:原博链接: http://blog.csdn.net/janeky/article/details/17652021只是把自己研究实践的过程记录下来 先直接上代码:两个类,一个检测资源更新,有更新则下载到本地(ResUpdate),一个是逻辑热更新(LogicUpdate)一.资源对比更新并下载.资源是否更新了是通过比对服务器与客户端的 资源版本表: version.txt该文本文档内容为: Cube.assetbundle,78a6cd06388449d16aea5f6eae395abf

[Unity XLua]热更新XLua入门(二)-俄罗斯方块实例篇

前言 在xLua没出来之前,开源的lua框架基本都是以界面用Lua开发为主,核心战斗用C#开发,但xLua出来之后主推C#开发,Lua用作HotFix,这里我展示的第一个例子就是基于界面的经典2D小游戏--俄罗斯方块,界面逻辑是用C#写,启动加载逻辑是用lua,后面我会继续第二个同样的Demo,但是以纯Lua为主,这个案例明天更新. 效果图 由于我不会美术,所以这里使用的开源的游戏资源,感谢此作者. 游戏启动 C#启动Lua逻辑 using UnityEngine; using System.C

Unity中热更新的实现方式

(1)使用lua脚本编写游戏的UI或者其他的逻辑,lua是一个精悍小巧的脚本语言,所以跨平台运行解析,而且不需要编译的过程 (2)使用C#light (3)使用C#反射技术(可以调用dll文件中的类,这个方法非常的麻烦,并且IOS平台不支持反射技术) 版权声明:本文为博主原创文章,未经博主允许不得转载.

Unity官方公布热更新方案性能对比

孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ?  什么是热更新 ?  为何要热更新 ?  如何在iOS 上对Unity 应用进行热更新 ?  支持Unity iOS 热更新的各种Lua 插件的对比 什么是热更新 ? 广义定义 ? 无需关闭服务器,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码. ? 狭义定义( iOS热更新) ? 无需将代码重新打包提交至AppStore,即可更新客户端的执行代码,即

Unity官方发布热更新方案性能对照

孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ?  什么是热更新 ?  为何要热更新 ?  怎样在iOS 上对Unity 应用进行热更新 ?  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 ? 广义定义 ? 无需关闭server,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码. ? 狭义定义( iOS热更新) ? 无需将代码又一次打包提交至AppStore,就可以更新clien

Unity3D热更新方案网摘总结

参考:http://blog.csdn.net/guofeng526/article/details/52662994 http://blog.csdn.net/u010019717/article/details/50853207 "热更新"这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技术,我们姑且这么叫它,相信很长时间内,大家依然还会这么叫,甚至有人叫它"暖更新". 一.什么是热更新? 广义定义 无需关闭服务器,不停机状态下修复漏