我正在尝试使用Haxe为Unity或Godot等游戏引擎编写脚本。
在这两种情况下,我都无法写出像
这样的行Translate(dir * 100.0);
其中dir是从Godot的.net dll导入的Vector2。统一。
我到目前为止找到的工作方案
Translate(Vector2.op_Multiply(dir, 100.0));
乍一看似乎是hxcs模块中的一个错误,但经过一些研究似乎是对Haxe类型系统的限制。
另一种选择是使用抽象类型来重载运算符,从而产生如下代码:
Translate(new Vector2WithOps(dir) * 100.0);
所以我的问题是:有没有办法绕过抽象类型的显式转换?
直观地看起来Haxe应该能够在从C#导入时自动应用运算符,并且应该能够推断乘法所需的类型并隐式执行对抽象类型的强制转换。我知道有两个技术原因至少是困难的,但我仍然希望有一种我还没有看到过的方法。
答案 0 :(得分:3)
所以我的问题是:有没有办法绕过抽象类型的显式转换?
是的,摘要允许定义implicit casts。您只需将from Vector2 to Vector2
添加到声明中:
abstract Vector2WithOps(Vector2) from Vector2 to Vector2 {}
这并不会让dir * 100.0
之类的东西神奇地发挥作用,但是你还需要一种方法来触发dir
到Vector2WithOps
的演员表,例如通过指定它输入的变量:
var dirWithOps:Vector2WithOps = dir;
还有一个名为type check的特殊语法来触发演员:
(dir : Vector2WithOps)
最终,最方便的选择是确保您已经开始使用Vector2WithOps
。只要您在自己的代码中创建新实例,但只有从本机API返回一个实例时,这种方法才会有效。这让我想起了一个Haxe问题,该问题考虑允许运算符通过static extensions重载,这在这里非常有用:#2803