事件监听器
场景可以跟踪的事件,与玩家操作和场景变化相关。
场景可以订阅多个事件,以了解玩家在场景内或附近时的行为。
关于玩家执行的按钮和点击事件,参见 按钮事件.
玩家进入或离开场景
当某个头像走进或走出构成你的场景的地块,或者传送进入或离开时,都会创建一个你可以监听的事件。
此事件会被所有头像触发,包括玩家自己的头像。
import { onEnterScene, onLeaveScene } from '@dcl/sdk/src/players'
export function main() {
onEnterScene((player) => {
if (!player) return
console.log('已进入场景', player)
})
onLeaveScene((userId) => {
if (!userId) return
console.log('已离开场景', userId)
})
}在 onEnterScene 事件中,函数可以访问 获取玩家数据 返回的所有数据,通过 player 属性。在 onLeaveScene 事件中,函数只能访问玩家的 ID。
仅当前玩家
你可以过滤触发的事件,只对玩家自己的头像作出反应,而不是对周围可能存在的其他头像。
此示例首先获取玩家的 ID,然后订阅事件并将事件返回的 userId 与该玩家的 ID 进行比较。
查询场景中的所有玩家
通过遍历所有带有 PlayerIdentityData 组件的实体,查看当前在你的场景中的完整玩家列表。
玩家更改相机模式
了解相机模式非常有助于微调场景机制,以便更好地适配在此模式下更舒适的操作方式。例如,在第三人称视角下,小目标更难点击。
下面的代码片段使用 onChange 函数在相机每次变化时触发一个事件。它还会在场景加载时触发一个事件,并带有玩家的初始相机模式。
参见 检查玩家的相机模式.
玩家播放动画
使用 onChange 函数在 AvatarEmoteCommand 组件上在玩家每次播放表情时触发一个事件。这包括基础表情(跳舞、拍手、挥手等)以及代币表情。
该事件包含以下信息:
emoteUrn:所执行表情的名称(即: 挥手, 拍手, 亲吻)loop:表情是循环播放还是只播放一次timestamp:表情被触发的时间。state:EmoteState枚举中的一个值,描述生命周期事件:ES_STARTED(表情已开始;在旧客户端中,如果该字段缺失,这也是默认值),ES_FINISHED(一个非循环表情已完整播放到结束),或者ES_INTERRUPTED(表情因移动、传送、另一个表情、显式停止或离开场景而被中断)。参见 检测表情何时结束.
你也可以通过传入其他玩家的引用,而不是 engine.PlayerEntity.
玩家更改个人资料
使用 onChange 函数在 AvatarEquippedData 组件,在玩家更换穿戴物品或快捷访问轮盘上列出的表情时触发一个事件。同样,使用 onChange 函数在 AvatarBase 在玩家更改其基础头像属性(如发色、肤色、头像形状或名称)时触发一个事件。
该事件在 AvatarEquippedData 中包含以下信息:
wearableUrns:玩家当前已装备的穿戴物列表。emoteUrns:玩家当前在快捷访问轮盘中装备的表情列表。
该事件在 AvatarBase 中包含以下信息:
name:玩家的名称。bodyShapeUrn:对应男性或女性身体类型的 ID。skinColor:以Color3eyesColor:以Color3hairColor:以Color3
你也可以检测场景中其他玩家的穿戴物或头像变化,只需传入其他玩家的引用,而不是 engine.PlayerEntity.
你也可以检测场景中其他玩家的个人资料变化,只需传入其他玩家的引用,而不是 engine.PlayerEntity.
玩家锁定或解锁光标
玩家可以在两种光标模式之间切换: 锁定光标 模式,用于控制相机,或 解锁光标 模式,用于在 UI 上自由移动光标。
玩家可以通过点击 鼠标右键 或按下 Esc 键来解锁光标,再通过点击屏幕任意位置重新锁定光标。
添加一个 PointerLock 组件到场景中的 engine.CameraEntity 实体,并使用 onChange 函数在 PointerLock 组件在玩家在两种光标模式之间切换时触发一个事件。
你可以利用这些信息轻轻提示玩家,例如弹出一个 UI,说明这款游戏在光标解锁状态下体验更佳。或者你也可以通过更改 isPointerLocked 组件上的该值来强制玩家的光标模式。下面的示例总是将光标模式设为解锁:
打开探索器面板
你的场景可以使用 openExplorerUi 受限操作打开探索器内置的全屏面板(地图、设置、背包等)。这对于从场景 UI 引导玩家前往特定探索器功能很有用。
该 ExplorerUi 枚举包含以下值:
EU_SETTINGS(0)EU_MAP(1)EU_BACKPACK(2)EU_CAMERA_REEL(3)EU_COMMUNITIES(4)EU_PLACES(5)EU_EVENTS(6)
注意: 与其他受限操作(movePlayerTo, triggerEmote), openExplorerUi 类似,它只在玩家站在场景地块内时有效。
观察面板何时打开或关闭
使用 ExplorerUiEventsResult 组件,用于检测探索器面板何时打开或关闭。这是 engine.RootEntity上的一个只增不减组件,类似于 PointerEventsResult。每当某个面板打开或关闭时,它都会流式传输事件。
每个事件包含:
ui:事件对应的是哪个面板(一个ExplorerUi值)。timestamp:事件发生时的单调递增计数器。event:要么是{ $case: 'opened' }要么是{ $case: 'closed' }.
最后更新于