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);

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

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换的更多相关文章

  1. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新

    unity热更新是一个经久不衰的话题.除了最常见的lua之外,还有如JSBinding,C#等等.这里介绍一个使用ECMAScript4进行热更新的方案.它吸收了各家的优点,特色很鲜明. 项目地址: ...

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

    原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链 ...

  3. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析

    如何创建工程 下载最新的Unity发布插件包. 打开Unity,新建一个项目 将插件包导入 在菜单中点击ASRuntime/Create ActionScript3 FlashDevelop HotF ...

  4. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件

    Unity开发中,常常会用到一些第三方组件.本文以实例介绍如何在热更新脚本中使用这些第三方组件. 首先说明几个基本步骤: 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更. 我们在脚本 ...

  5. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令

    ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利. 这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令 Unity中的 ...

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

    我们的热更新脚本在实际使用中,当然也要支持常用的第三方组件,例如这里介绍一个非常实用的第三方UI库:FairyGUI. 什么是FairyGUI 这里照搬FaiyGUI官网的介绍: 重新定义 UI 制作 ...

  7. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)

    上次讲解了FairyGUI的最简单的热更新办法,并对其中一个Demo进行了修改并做成了热更新的方式. 这次我们来一个更加复杂一些的情况:Emoji. FairyGUI的   Example 04 - ...

  8. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 热更新Live2D

    live2D是一个很强大的2D动画组件.我们可以使用AS3脚本对它进行热更新. live2D在Unity中的使用请看这里: 如何获取Live2D 总得来说,我们可以先去live2D官网下载它的Unit ...

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

    继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour. MonoBehaviour挂载到GameObject对象上的脚本的基类.平常Unity开发时,简单的做法就 ...

随机推荐

  1. MySQL搭建主从数据库 实现读写分离

    首先声明,实际生产中,网站为了提高用户体验,性能等,将数据库实现读写分离是有必要的,我们让主数据库去写入数据,然后当用户查询的时候,然后在从数据库读取数据,故能减轻数据库的压力,实现良好的用户体验! ...

  2. jquery 表双击某行时,取出某行中各列的数值.

      <script> $(function () { $("tr").dblclick(function () { var txt = $("table tr ...

  3. 到底什么是 "method group"

    class Program { delegate void NoParam(); delegate void WithOneParam(string name); static void Main(s ...

  4. redis命令详解

      redis中添加key value元素:set key value;       获取元素:get key ;   redis中添加集合:lpush key value1 value2 value ...

  5. Error loading MySQLdb module: No module named 'MySQLdb'----------- django成功连接mysql数据库的方法

    在进行django学习过程中,尝试使用框架连接mysql数据库,启动服务器的时候经常遇到Error loading MySQLdb module: No module named 'MySQLdb' ...

  6. python之路1

    python之路 http协议 html HTML2 CSS选择器 CSS属性操作 CSS属性操作/下 JavaScript(js)/上 JavaScript的对象 JavaScript的对象/下 前 ...

  7. IIS进行URL重写

    一.Why? 1.先来讲一讲为什么我们要使用url重写这个东西 2.因为我学习的后端是nodejs,然后我发现nodejs一个非常让人难受的事,就是它监听端口不是80和443时,你访问网页需要输入端口 ...

  8. hdu1060 Leftmost Digit---求N的N次方的首位(对数)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1060 题目描述:求N的N次方的第一位. 思路: 第一次做这种类型的题目,学到了如何运用对数. 首先推 ...

  9. [转]XHR简介

      在XHR诞生前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,在XHR诞生后就可以完全通过JS代码异步实现这一过程.XHR的诞生也使最初的网页制作转换为开发交互应用,拉开了WEB2.0的 ...

  10. Docker----起步

    最近学习了一下的docker相关的东西,下面介绍一下我个人的学习总结和体会.关于docker的详细介绍和优势,在网上随便都可以找得到,就不做介绍了.这个部分的内容比较简单,有Docker基础的朋友可以 ...