控制台日志
浏览器开发者控制台是调试 PlayCanvas 脚本最基础且不可缺少的工具。现代浏览器均内置开发者工具,控制台用于查看日志、错误,以及理解代码背后的执行过程。
什么是控制台?
控制台是开发者工具中的命令行界面,可以:
- 显示日志:从 JavaScript 直接输出消息、变量值和对象状态。
- 显示错误和警告:查看 JavaScript 错误、引擎警告及主动记录的错误消息,通常附带调用栈,方便定位来源。
- 交互检查:直接执行 JavaScript,检查运行中应用的状态,适合更深入的调试。
打开控制台
不同浏览器的打开方式不同,常用方法有:
- 快捷键:Windows/Linux 上按 F12;macOS 上,Chrome、Edge、Firefox 可使用 Option + Command + J(⌥ + ⌘ + J)。Safari 使用 Option + Command + C(⌥ + ⌘ + C),可能需要先在 Preferences > Advanced > Show Develop menu in menu bar 中启用 Develop 菜单。
- 右键菜单:在运行中的 PlayCanvas 应用页面上右键,选择 Inspect 或 Inspect Element,再切换到 Console 标签页。
- 浏览器菜单:在主菜单中寻找 Developer Tools、Web Developer 等选项,例如 Chrome 的 More Tools > Developer Tools。
从脚本输出日志
JavaScript 的全局 console 对象是向控制台发送信息的主要方式。通常在 PlayCanvas 的 initialize、update 或事件处理函数中调用。
console.log()
最常见的方法,用于一般信息输出。
- 用途:记录状态消息、变量值,或检查函数是否被调用。
示例:
- ESM
- 经典脚本
import { Script, KEY_SPACE } from 'playcanvas';
export class MyLogger extends Script {
static scriptName = 'myLogger';
initialize() {
console.log('MyLogger script initialized on entity:', this.entity.name);
const initialPosition = this.entity.getPosition();
console.log('Initial Position:', initialPosition.toString());
}
update(dt) {
if (this.app.keyboard.wasPressed(KEY_SPACE)) {
console.log('Spacebar pressed!');
}
}
}
var MyLogger = pc.createScript('myLogger');
MyLogger.prototype.initialize = function() {
console.log('MyLogger script initialized on entity:', this.entity.name);
var initialPosition = this.entity.getPosition();
console.log('Initial Position:', initialPosition.toString());
};
MyLogger.prototype.update = function(dt) {
if (this.app.keyboard.wasPressed(pc.KEY_SPACE)) {
console.log('Spacebar pressed!');
}
};
console.warn()
用于表示潜在问题,或尚未构成错误但可能不符合预期的情况。
- 用途:提示非关键问题、已弃用 API 的用法或可疑数值。
- 外观:控制台中通常带黄色背景或图标。
示例:
// Inside some function
if (speed < 0) {
console.warn('Warning: Speed is negative (' + speed + '). Is this intentional?');
}
console.error()
用于记录导致代码无法正确工作的实际错误,PlayCanvas 引擎错误也使用此方法。
- 用途:报告逻辑错误、操作失败或严重故障。
- 外观:通常带红色背景或图标,并附调用栈,显示发生错误前的函数调用序列。
示例:
- ESM
- 经典脚本
initialize() {
this.targetEntity = this.app.root.findByName('RequiredTarget');
if (!this.targetEntity) {
console.error('Critical Error: Could not find RequiredTarget entity! Disabling script.', this.entity.name);
this.enabled = false; // Stop the script from running further
}
}
MyScript.prototype.initialize = function() {
this.targetEntity = this.app.root.findByName('RequiredTarget');
if (!this.targetEntity) {
console.error('Critical Error: Could not find RequiredTarget entity! Disabling script.', this.entity.name);
this.enabled = false; // Stop the script from running further
}
};
其他方法
console.info():类似console.log(),有时使用不同样式,例如 i 图标。console.debug():通常默认隐藏,适合不需要一直显示的详细调试消息。
输出不同数据类型
不仅可以输出字符串:
- 变量:
console.log('Player health:', this.health); - 对象和数组:
console.log('My Entity:', this.entity);、console.log('Children:', this.entity.children);- 大多数浏览器控制台允许展开对象和数组,交互式查看属性和值,非常适合检查实体、组件或材质等复杂数据。
输出显示在哪里?
无论通过编辑器的 Launch 按钮启动应用,还是运行已发布构建,日志都会显示在浏览器开发者控制台中,而非编辑器自身界面。测试时请保持开发者工具打开。
有效记录日志的建议
- 描述具体:不要只写
console.log('here');,应说明发生什么及相关数值,例如console.log('Player jumped!', this.entity.getPosition());。 - 提供上下文:尤其有多个脚本或实体时,应包含标识信息,例如
console.log(this.entity.name + ': Firing weapon.');。 - 记录关键数值:在关键位置输出变量、函数参数和返回值,跟踪数据流。
- 区分日志级别:合理使用
log、warn和error,让重要消息更醒目。 - 按条件输出:通过
if仅在特定情况发生时输出,减少刷屏。 - 清理日志:完成代码前移除临时或过量的
console.log;可能以后需要、但平时不必显示的日志可使用console.debug。
小结
浏览器控制台是调试的第一步。掌握 console.log 及相关方法,可以大幅减少查找脚本异常原因的时间。请熟悉打开控制台、输出信息和分析结果的过程。