TS/lua做图注意事项

代码不执行,不报错的原因与排查思路:

请查看print能否输出信息到控制台 (官方we 安装插件后会占用这个,需要手动删文件 以切换到ydwe的控制台)

通常一行代码出错后 整个lua代码逻辑 都会被终止了。所以要找到是在哪一行代码终止的

  1. 可能调用了不存在的物编(请在不执行代码前输出信息查看到底是哪行代码开始终止了)
  2. 进入了死循环,A脚本使用了B脚本的静态函数 B脚本使用了A脚本的静态函数 编译后的lua会有A require("B") B require("A")导致死循环(引用作为类型可排除,因为类型引用信息在编译后会被丢弃,主要是静态函数调用)

ts import 编译后为lua require。 ts中的静态初始化代码会被执行。比如有一个静态属性 static g =CreateGroup() 那么这个CreateGroup 会在import/require引用时就会调用 尽量把初始化写到方法里 如果直接在静态值上使用方法赋值在使用时就要小心一点了 注意依赖顺序

App.start() 都执行不进去 控制台也启动不了

通常是由于App.ts 的import 的其他TS文件中的静态属性调用了_G全局的jass初始化函数引起的 () 或互相require依赖死循环

TS的import编译到lua 后 会放到最上面 。 所以顺序要注意了:比如ts

import GlobalVars from "./solar/common/GlobalVars";
GlobalVars.init()
import BaseUtil from "./solar/util/BaseUtil";
BaseUtil.init()

将得到lua

local ____GlobalVars = require("solar.common.GlobalVars")
local GlobalVars = ____GlobalVars.default
local ____BaseUtil = require("solar.util.BaseUtil")
local BaseUtil = ____BaseUtil.default
GlobalVars:init()
BaseUtil.init()

这意味着 如果require BaseUtil 时需要访问GlobalVars:init() 后的数据的话就会出错。 因为ts的顺序看上去是GlobalVars:init() 在前面 但实际编译后是所有require 在最前 然后才是代码块

扩展阅读

print 如果是官方we可能会占用了这个函数 导致无法输出报错信息 (控制台标题看是福柏级YDWE,还是War3Plugin)

print打印不出来是因为游戏根目录有2个.dll文件要删掉,一个叫version.dll ,一个叫dz_we_plugin.dll

注意事项

不要用this.属性去引用static的类属性 应该通过类名.属性引用

require 的无self方法可以将变量声明为NoSelf类型。这样在调用变量方法时 Lua会以.调用 而不是:调用 如:

const CJ:NoSelf = require('jass.common')

如果在VSCODE里修改了代码 游戏里不生效的可能原因: