服务 / TeleportService
TeleportService Class
多场景和传送服务
Table of contents
Methods
asyncGetPlayerRoomInfo(userId: string): Promise<RoomInfo> |
|---|
| 获取指定玩家所在的房间信息 |
asyncTeleportToRoom(roomId: string, userIds: string[], options?: TeleportOptions): Promise<TeleportResult> server |
| 异步传送到指定房间 |
asyncTeleportToScene(sceneName: string, userIds: string[], options?: TeleportOptions): Promise<TeleportResult> server |
| 异步传送到当前游戏的指定场景 |
getSourceInfo(teleportId: string): RoomInfo server |
| 获取传送的来源信息 |
getTeleportData(teleportId: string): TeleportData server |
| 获取调用传送接口时在TeleportOptions中设置的数据 |
Methods
asyncGetPlayerRoomInfo
• Static asyncGetPlayerRoomInfo(userId): Promise<RoomInfo>
获取指定玩家所在的房间信息
Parameters
userId string | 目标玩家的 userId range: 依据 userId 的长度而定 |
|---|
Returns
Promise<RoomInfo> | 指定玩家所在的房间信息 |
|---|
ts
@Component
export default class Server extends Script {
protected onStart(): void {
// 传送功能需要在服务端发起,在客户端使用会报错
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 当玩家加入时,倒计时5s后发起传送
setTimeout(() => {
// 假定我们想传送到UserId为"123456"的玩家所在房间一起游玩
const targetUserId: string = "123456";
// 先用asyncGetPlayerRoomInfo获取玩家所在的房间信息
TeleportService.asyncGetPlayerRoomInfo(targetUserId).then((roomInfo) => {
// 拿到RoomId
const roomId: string = roomInfo.roomId;
// 将要传送到新场景的玩家加入数组
const playerToTeleport: string[] = [player.userId];
// 可以填充要携带的额外数据
const opt: TeleportOptions = {
teleportData: "This is test data."
}
// 调用接口传送到目标房间
TeleportService.asyncTeleportToRoom(roomId, playerToTeleport, opt);
});
}, 5 * 1000);
});
}
}
}@Component
export default class Server extends Script {
protected onStart(): void {
// 传送功能需要在服务端发起,在客户端使用会报错
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 当玩家加入时,倒计时5s后发起传送
setTimeout(() => {
// 假定我们想传送到UserId为"123456"的玩家所在房间一起游玩
const targetUserId: string = "123456";
// 先用asyncGetPlayerRoomInfo获取玩家所在的房间信息
TeleportService.asyncGetPlayerRoomInfo(targetUserId).then((roomInfo) => {
// 拿到RoomId
const roomId: string = roomInfo.roomId;
// 将要传送到新场景的玩家加入数组
const playerToTeleport: string[] = [player.userId];
// 可以填充要携带的额外数据
const opt: TeleportOptions = {
teleportData: "This is test data."
}
// 调用接口传送到目标房间
TeleportService.asyncTeleportToRoom(roomId, playerToTeleport, opt);
});
}, 5 * 1000);
});
}
}
}asyncTeleportToRoom
• Static asyncTeleportToRoom(roomId, userIds, options?): Promise<TeleportResult> server
异步传送到指定房间
Parameters
roomId string | 要传送的目标游戏Id default:undefined range: 依据 roomid 的长度决定 |
|---|---|
userIds string[] | 要传送的玩家userId数组 default:undefined range: 依据 roomid 的长度决定 |
options? TeleportOptions | 可选的额外传送信息. 不支持 createNewPrivateRoom 参数,设置为true也不会创建新房间 default:undefined |
Returns
Promise<TeleportResult> | Promise<TeleportResult>,本次请求正常则返回resolve,异常则返回reject |
|---|
Precautions
指定房间不存在或者可容纳人数不足,则会失败。参与传送的玩家数量越多,失败率越高
Precautions
不支持 createNewPrivateRoom 参数,设置为true也不会创建新房间
ts
@Component
export default class TeleportScript extends Script {
protected onStart(): void {
// 服务端逻辑
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 当玩家加入时,倒计时5s后发起传送,避免玩家加入立即传送,不易观察
setTimeout(() => {
// 假定我们想传送到UserId为"123456"的玩家所在房间一起游玩
const targetUserId: string = "123456";
// 先用asyncGetPlayerRoomInfo获取玩家所在的房间信息
TeleportService.asyncGetPlayerRoomInfo(targetUserId).then((roomInfo) => {
// 拿到RoomId
const roomId: string = roomInfo.roomId;
// 将要传送到新场景的玩家加入数组
const playerToTeleport: string[] = [player.userId];
// 可以填充要携带的额外数据
const opt: TeleportOptions = {
teleportData: "This is test data."
}
// 声明成功和失败的回调函数,用于处理传送接口的回调结果。
// 成功的情况一般不需要处理,会继续走后续跳转流程。
// 如果失败了,有可能是超时或者有报错,可以从回调的数据中读取信息做进一步处理。
const onSuccess = () => { }
const onFailed = (result: mw.TeleportResult) => {
switch (result.status) {
case mw.TeleportStatus.success:
break;
case mw.TeleportStatus.ignored:
// 触发太频繁了,本次请求被忽略
break;
case mw.TeleportStatus.timeout:
// 超时了,可以选择重试传送或者提示玩家
break;
case mw.TeleportStatus.error:
// 将错误信息发给所有参与的客户端
for (const userId in result.userIds) {
const player = Player.getPlayer(userId)
if (player) {
Event.dispatchToClient(player, "TeleportResult", result);
}
}
}
};
// 传送功能需要在服务端发起,在客户端使用会报错
TeleportService.asyncTeleportToRoom(roomId, playerToTeleport, opt).then(onSuccess, onFailed);
}).catch((error: Error) => {
console.error(`getPlayerRoomInfo has error: ${error.message}`);
})
}, 5 * 1000);
});
} else {
// 客户端逻辑
Event.addServerListener("TeleportResult", (result: mw.TeleportResult) => {
console.error(`Teleport has error:`);
console.error(`errorCode: ${result.errorCode}`);
console.error(`message: ${result.message}`);
});
}
}
}@Component
export default class TeleportScript extends Script {
protected onStart(): void {
// 服务端逻辑
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 当玩家加入时,倒计时5s后发起传送,避免玩家加入立即传送,不易观察
setTimeout(() => {
// 假定我们想传送到UserId为"123456"的玩家所在房间一起游玩
const targetUserId: string = "123456";
// 先用asyncGetPlayerRoomInfo获取玩家所在的房间信息
TeleportService.asyncGetPlayerRoomInfo(targetUserId).then((roomInfo) => {
// 拿到RoomId
const roomId: string = roomInfo.roomId;
// 将要传送到新场景的玩家加入数组
const playerToTeleport: string[] = [player.userId];
// 可以填充要携带的额外数据
const opt: TeleportOptions = {
teleportData: "This is test data."
}
// 声明成功和失败的回调函数,用于处理传送接口的回调结果。
// 成功的情况一般不需要处理,会继续走后续跳转流程。
// 如果失败了,有可能是超时或者有报错,可以从回调的数据中读取信息做进一步处理。
const onSuccess = () => { }
const onFailed = (result: mw.TeleportResult) => {
switch (result.status) {
case mw.TeleportStatus.success:
break;
case mw.TeleportStatus.ignored:
// 触发太频繁了,本次请求被忽略
break;
case mw.TeleportStatus.timeout:
// 超时了,可以选择重试传送或者提示玩家
break;
case mw.TeleportStatus.error:
// 将错误信息发给所有参与的客户端
for (const userId in result.userIds) {
const player = Player.getPlayer(userId)
if (player) {
Event.dispatchToClient(player, "TeleportResult", result);
}
}
}
};
// 传送功能需要在服务端发起,在客户端使用会报错
TeleportService.asyncTeleportToRoom(roomId, playerToTeleport, opt).then(onSuccess, onFailed);
}).catch((error: Error) => {
console.error(`getPlayerRoomInfo has error: ${error.message}`);
})
}, 5 * 1000);
});
} else {
// 客户端逻辑
Event.addServerListener("TeleportResult", (result: mw.TeleportResult) => {
console.error(`Teleport has error:`);
console.error(`errorCode: ${result.errorCode}`);
console.error(`message: ${result.message}`);
});
}
}
}asyncTeleportToScene
• Static asyncTeleportToScene(sceneName, userIds, options?): Promise<TeleportResult> server
异步传送到当前游戏的指定场景
Parameters
sceneName string | 要传送的目标场景名称 default: range: 依据场景名称而定 |
|---|---|
userIds string[] | 要传送的玩家 userId 数组 default: range: 数组大小自定义 |
options? TeleportOptions | 可选的额外传送信息 default:undefined |
Returns
Promise<TeleportResult> | Promise<TeleportResult>,本次请求正常则返回resolve,异常则返回reject |
|---|
Precautions
仅限当前游戏的场景间传送,场景名不存在则会传送失败
ts
@Component
export default class TeleportScript extends Script {
protected onStart(): void {
// 服务端逻辑
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 当玩家加入时,倒计时5s后发起传送,避免玩家加入立即传送,不易观察
setTimeout(() => {
// 假定已经在编辑器中创建了一个名为"Scene1"的场景
const sceneName: string = "Scene1";
// 将要传送到新场景的玩家加入数组
const playerToTeleport: string[] = [player.userId];
// 可以填充要携带的额外数据
const opt: TeleportOptions = {
teleportData: "This is test data."
}
// 声明成功和失败的回调函数,用于处理传送接口的回调结果。
// 成功的情况一般不需要处理,会继续走后续跳转流程。
// 如果失败了,有可能是超时或者有报错,可以从回调的数据中读取信息做进一步处理。
const onSuccess = () => { }
const onFailed = (result: mw.TeleportResult) => {
switch (result.status) {
case mw.TeleportStatus.success:
break;
case mw.TeleportStatus.ignored:
// 触发太频繁了,本次请求被忽略
break;
case mw.TeleportStatus.timeout:
// 超时了,可以选择重试传送或者提示玩家
break;
case mw.TeleportStatus.error:
// 将错误信息发给所有参与的客户端
for (const userId in result.userIds) {
const player = Player.getPlayer(userId)
if (player) {
Event.dispatchToClient(player, "TeleportResult", result);
}
}
}
};
// 传送功能需要在服务端发起,在客户端使用会报错
TeleportService.asyncTeleportToScene(sceneName, playerToTeleport, opt).then(onSuccess, onFailed);
}, 5 * 1000);
});
} else {
// 客户端逻辑
Event.addServerListener("TeleportResult", (result: mw.TeleportResult) => {
console.error(`Teleport has error:`);
console.error(`errorCode: ${result.errorCode}`);
console.error(`message: ${result.message}`);
});
}
}
}@Component
export default class TeleportScript extends Script {
protected onStart(): void {
// 服务端逻辑
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 当玩家加入时,倒计时5s后发起传送,避免玩家加入立即传送,不易观察
setTimeout(() => {
// 假定已经在编辑器中创建了一个名为"Scene1"的场景
const sceneName: string = "Scene1";
// 将要传送到新场景的玩家加入数组
const playerToTeleport: string[] = [player.userId];
// 可以填充要携带的额外数据
const opt: TeleportOptions = {
teleportData: "This is test data."
}
// 声明成功和失败的回调函数,用于处理传送接口的回调结果。
// 成功的情况一般不需要处理,会继续走后续跳转流程。
// 如果失败了,有可能是超时或者有报错,可以从回调的数据中读取信息做进一步处理。
const onSuccess = () => { }
const onFailed = (result: mw.TeleportResult) => {
switch (result.status) {
case mw.TeleportStatus.success:
break;
case mw.TeleportStatus.ignored:
// 触发太频繁了,本次请求被忽略
break;
case mw.TeleportStatus.timeout:
// 超时了,可以选择重试传送或者提示玩家
break;
case mw.TeleportStatus.error:
// 将错误信息发给所有参与的客户端
for (const userId in result.userIds) {
const player = Player.getPlayer(userId)
if (player) {
Event.dispatchToClient(player, "TeleportResult", result);
}
}
}
};
// 传送功能需要在服务端发起,在客户端使用会报错
TeleportService.asyncTeleportToScene(sceneName, playerToTeleport, opt).then(onSuccess, onFailed);
}, 5 * 1000);
});
} else {
// 客户端逻辑
Event.addServerListener("TeleportResult", (result: mw.TeleportResult) => {
console.error(`Teleport has error:`);
console.error(`errorCode: ${result.errorCode}`);
console.error(`message: ${result.message}`);
});
}
}
}getSourceInfo
• Static getSourceInfo(teleportId): RoomInfo server
获取传送的来源信息
Parameters
teleportId string | 要查询的传送 Id default: range:依据 teleportId 长度而定的 |
|---|
Returns
RoomInfo | 玩家传送的来源信息 |
|---|
ts
@Component
export default class Server extends Script {
protected onStart(): void {
// 获取传送来源信息的接口需要在服务端发起,在客户端使用会报错
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 用玩家的teleportId属性来查询来源信息
const sourceInfo = TeleportService.getSourceInfo(player.teleportId);
if (sourceInfo) {
console.log("Teleport from:");
console.log(`GameId: ${sourceInfo.gameId}`);
console.log(`RoomId: ${sourceInfo.roomId}`);
} else {
// 不是传送进入的当前场景,则没有来源信息
console.log("Not join by Teleport.")
}
});
}
}
}@Component
export default class Server extends Script {
protected onStart(): void {
// 获取传送来源信息的接口需要在服务端发起,在客户端使用会报错
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 用玩家的teleportId属性来查询来源信息
const sourceInfo = TeleportService.getSourceInfo(player.teleportId);
if (sourceInfo) {
console.log("Teleport from:");
console.log(`GameId: ${sourceInfo.gameId}`);
console.log(`RoomId: ${sourceInfo.roomId}`);
} else {
// 不是传送进入的当前场景,则没有来源信息
console.log("Not join by Teleport.")
}
});
}
}
}getTeleportData
• Static getTeleportData(teleportId): TeleportData server
获取调用传送接口时在TeleportOptions中设置的数据
Parameters
teleportId string | 要查询的传送Id default: range: 依据 teleportId 的长度决定 |
|---|
Returns
TeleportData | 传送时携带的数据 |
|---|
ts
@Component
export default class Server extends Script {
protected onStart(): void {
// 获取传送时携带的数据的接口需要在服务端发起,在客户端使用会报错
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 用玩家的teleportId属性来查询传送时携带的数据
const data = TeleportService.getTeleportData(player.teleportId);
if (data) {
console.log(`Teleport data: ${data}`);
} else {
// 不是传送进入的当前场景,则没有携带的数据;也可能是传送时未指定数据
console.log("Not join by Teleport or no data.")
}
});
}
}
}@Component
export default class Server extends Script {
protected onStart(): void {
// 获取传送时携带的数据的接口需要在服务端发起,在客户端使用会报错
if (SystemUtil.isServer()) {
Player.onPlayerJoin.add((player: Player) => {
// 用玩家的teleportId属性来查询传送时携带的数据
const data = TeleportService.getTeleportData(player.teleportId);
if (data) {
console.log(`Teleport data: ${data}`);
} else {
// 不是传送进入的当前场景,则没有携带的数据;也可能是传送时未指定数据
console.log("Not join by Teleport or no data.")
}
});
}
}
}