zoukankan      html  css  js  c++  java
  • 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换

    C#中,某些类型会定义隐式类型转换和操作符重载。Unity中,有些对象也定义了隐式类型转换和操作符重载。典型情况有:UnityEngine.Object。UnityEngine.Object的销毁是调用 Destory。被调用过Destory的对象,并不是真的变成null了,但是再对它操作会导致异常。

    Unity重载了UnityEngine.Object "==","!="操作符,和 implicit 转换。

    public static bool operator ==(Object x, Object y);
    public static bool operator !=(Object x, Object y);
    
    public static implicit operator bool(Object exists);

    因此,在Unity中,判断某个GameObject是否被Destory掉了的判断方法是,判断它是否==null,或者直接用它做if的判断条件。

    脚本系统中的操作符重载和隐式类型转换

    热更脚本系统为了支持Unity的这些特性,也增加了操作符重载。打开上次的项目,我们对代码作一些修改,可以看到脚本中大部分操作符重载同样可行。

    package
    {
        
        [Doc]
        /**
         * ...
         * @author 
         */
        public class Main
        {
            
            
            public function Main() 
            {    
            }
    
            public function update():void
            {    
            }
            
        }
        
    }
    import unityengine.GameObject;
    import unityengine.UObject;
    //新建一个GameObject
    var obj:GameObject = new GameObject("test");
    if( obj != null)
    {
        trace("打印obj");
        trace("obj:", obj);
    }
    //销毁GameObject
    UObject.destroyImmediate_(obj);
    
    if(!obj) //隐式类型转换生效。
    {
        trace("隐式类型转换,obj转为bool,由于obj已被销毁,所以为false");
        trace("obj:", obj);
    }
    
    if( obj === null )
    {
        trace("obj is null");
    }
    else
    {
        trace("严格相等比较:obj 不为 null");
        trace("obj not null");
    }

     执行结果如下:

    然后我们再来测试其他操作符重载:

    Unity中,向量和矩阵有操作符重载。现在我们把脚本修改成如下代码:

    package
    {
        
        [Doc]
        /**
         * ...
         * @author 
         */
        public class Main
        {
            
            
            public function Main() 
            {    
            }
    
            public function update():void
            {    
            }
            
        }
        
    }
    import unityengine.Matrix4x4;
    import unityengine.Vector3;
    import unityengine.Vector4;
    
    var v:Vector3 = new Vector3(4, 5, 6);
    //Vector3的加减乘除
    trace( v,"+ Vector3.one =", v + Vector3.one);
    trace( v, "- Vector3.one =", v - Vector3.one);
    trace( v, "* 5 =", v * 5 );
    trace( v, "/ 5 =", v / 5 );
    
    //定义一个4x4矩阵
    var m4:Matrix4x4 = Matrix4x4.scale( Vector3.one * 2 );
    trace(m4);
    
    //演示矩阵和Vector3相乘。
    var v4:Vector4 = new Vector4( v.x, v.y, v.z, 1 );
    trace(  "m4 * v4 = ", m4 * v4 );

    执行结果如下:

     当您使用了错误的操作符重载时,如果编译期能够检查,则编译器会提示错误。

    例如, Matrix4x4和Vector4直接相乘,必须是矩阵X向量。所以,如下代码会导致编译错误:

    import unityengine.Matrix4x4;
    import unityengine.Vector3;
    import unityengine.Vector4;
    
    var v:Vector3 = new Vector3(4, 5, 6);
    
    //定义一个4x4矩阵
    var m4:Matrix4x4 = Matrix4x4.scale( Vector3.one * 2 );
    trace(m4);
    
    //演示矩阵和Vector3相乘。
    var v4:Vector4 = new Vector4( v.x, v.y, v.z, 1 );
    
    var f = v4 * m4;

    编译器报错:

     如果您选择隐藏变量类型,则编译可以通过,但是这样,不会获得预期的执行效果。

    import unityengine.Matrix4x4;
    import unityengine.Vector3;
    import unityengine.Vector4;
    
    var v:Vector3 = new Vector3(4, 5, 6);
    
    
    var m4:* = Matrix4x4.scale( Vector3.one * 2 );
    trace(m4);
    
    var v4:* = new Vector4( v.x, v.y, v.z, 1 );
    
    //这是不正确的乘法,脚本系统将返回NaN
    var f = v4 * m4;
    trace( f);

     如此我们就了解了脚本提供的操作符重载功能。

  • 相关阅读:
    经典回溯问题--八皇后dfs递归回溯求解【DFS】
    CSP认证考试(第九次)第一题
    C++字符串和数字格式转化(使用sprintf()和sscanf()函数)
    2016蓝桥杯C++A组第六题 寒假作业【暴力搜索】
    先序非递归建立二叉树
    sqlsrv数据库复杂语句1
    tp5域名配置
    JavaScript使用 value 属性
    数据库随机查询6条数据
    文件目录问题
  • 原文地址:https://www.cnblogs.com/ashei/p/8892778.html
Copyright © 2011-2022 走看看