API 参考
NetworkPlugin
Section titled “NetworkPlugin”客户端网络插件核心类。
class NetworkPlugin implements IPlugin { readonly name: string; readonly version: string;
// 访问器 get networkService(): GameNetworkService; get syncSystem(): NetworkSyncSystem; get spawnSystem(): NetworkSpawnSystem; get inputSystem(): NetworkInputSystem; get localPlayerId(): number; get isConnected(): boolean;
// 生命周期 install(core: Core, services: ServiceContainer): void; uninstall(): void;
// 连接管理 connect(options: NetworkServiceOptions & { playerName: string; roomId?: string; }): Promise<boolean>; disconnect(): Promise<void>;
// 预制体注册 registerPrefab(prefabType: string, factory: PrefabFactory): void;
// 输入发送 sendMoveInput(x: number, y: number): void; sendActionInput(action: string): void;}RpcService
Section titled “RpcService”通用 RPC 服务基类,支持自定义协议。
class RpcService<P extends ProtocolDef> { // 访问器 get state(): NetworkState; get isConnected(): boolean; get client(): RpcClient<P> | null;
constructor(protocol: P);
// 连接管理 connect(options: NetworkServiceOptions): Promise<void>; disconnect(): void;
// RPC 调用 call<K extends ApiNames<P>>( name: K, input: ApiInput<P['api'][K]> ): Promise<ApiOutput<P['api'][K]>>;
// 消息发送 send<K extends MsgNames<P>>(name: K, data: MsgData<P['msg'][K]>): void;
// 消息监听 on<K extends MsgNames<P>>(name: K, handler: (data: MsgData<P['msg'][K]>) => void): this; off<K extends MsgNames<P>>(name: K, handler?: (data: MsgData<P['msg'][K]>) => void): this; once<K extends MsgNames<P>>(name: K, handler: (data: MsgData<P['msg'][K]>) => void): this;}GameNetworkService
Section titled “GameNetworkService”游戏网络服务,继承自 RpcService,提供游戏特定的便捷方法。
class GameNetworkService extends RpcService<GameProtocol> { // 发送玩家输入 sendInput(input: PlayerInput): void;
// 监听状态同步(链式调用) onSync(handler: (data: SyncData) => void): this;
// 监听实体生成 onSpawn(handler: (data: SpawnData) => void): this;
// 监听实体销毁 onDespawn(handler: (data: DespawnData) => void): this;}NetworkState
Section titled “NetworkState”const enum NetworkState { Disconnected = 0, Connecting = 1, Connected = 2}NetworkServiceOptions
Section titled “NetworkServiceOptions”interface NetworkServiceOptions extends RpcClientOptions { url: string;}RpcClientOptions
Section titled “RpcClientOptions”interface RpcClientOptions { codec?: Codec; onConnect?: () => void; onDisconnect?: (reason?: string) => void; onError?: (error: Error) => void;}PrefabFactory
Section titled “PrefabFactory”type PrefabFactory = (scene: Scene, spawn: SpawnData) => Entity;PlayerInput
Section titled “PlayerInput”interface PlayerInput { frame: number; moveDir?: { x: number; y: number }; actions?: string[];}NetworkIdentity
Section titled “NetworkIdentity”class NetworkIdentity extends Component { netId: number; ownerId: number; bIsLocalPlayer: boolean; bHasAuthority: boolean;}NetworkTransform
Section titled “NetworkTransform”class NetworkTransform extends Component { position: { x: number; y: number }; rotation: number; velocity: { x: number; y: number };}NetworkSyncSystem
Section titled “NetworkSyncSystem”class NetworkSyncSystem extends EntitySystem { // 内部使用,由 NetworkPlugin 自动管理}NetworkSpawnSystem
Section titled “NetworkSpawnSystem”class NetworkSpawnSystem extends EntitySystem { registerPrefab(prefabType: string, factory: PrefabFactory): void;}NetworkInputSystem
Section titled “NetworkInputSystem”class NetworkInputSystem extends EntitySystem { addMoveInput(x: number, y: number): void; addActionInput(action: string): void; clearInput(): void;}import { NetworkServiceToken, NetworkSyncSystemToken, NetworkSpawnSystemToken, NetworkInputSystemToken} from '@esengine/network';
// 使用const networkService = services.get(NetworkServiceToken);服务器端 API
Section titled “服务器端 API”RpcServer
Section titled “RpcServer”class RpcServer<P extends ProtocolDef> { constructor(protocol: P, options: RpcServerOptions);
// 启动/停止服务器 start(): Promise<void>; stop(): void;
// 注册 API 处理器 handle<K extends ApiNames<P>>( name: K, handler: (input: ApiInput<P['api'][K]>, ctx: RpcContext) => Promise<ApiOutput<P['api'][K]>> ): void;
// 广播消息 broadcast<K extends MsgNames<P>>(name: K, data: MsgData<P['msg'][K]>): void;
// 发送给特定客户端 sendTo<K extends MsgNames<P>>(clientId: string, name: K, data: MsgData<P['msg'][K]>): void;}RpcServerOptions
Section titled “RpcServerOptions”interface RpcServerOptions { port: number; codec?: Codec; onStart?: (port: number) => void; onConnection?: (clientId: string) => void; onDisconnection?: (clientId: string, reason?: string) => void; onError?: (error: Error) => void;}RpcContext
Section titled “RpcContext”interface RpcContext { clientId: string;}gameProtocol
Section titled “gameProtocol”默认游戏协议,包含加入/离开 API 和状态同步消息:
const gameProtocol = rpc.define({ api: { join: rpc.api<JoinRequest, JoinResponse>(), leave: rpc.api<void, void>(), }, msg: { input: rpc.msg<PlayerInput>(), sync: rpc.msg<SyncData>(), spawn: rpc.msg<SpawnData>(), despawn: rpc.msg<DespawnData>(), },});协议消息类型
Section titled “协议消息类型”SyncData
Section titled “SyncData”interface SyncData { time: number; entities: IEntityState[];}SpawnData
Section titled “SpawnData”interface SpawnData { netId: number; ownerId: number; prefab: string; position: { x: number; y: number }; rotation: number;}DespawnData
Section titled “DespawnData”interface DespawnData { netId: number;}JoinRequest
Section titled “JoinRequest”interface JoinRequest { playerName: string; roomId?: string;}JoinResponse
Section titled “JoinResponse”interface JoinResponse { playerId: number; roomId: string;}EntitySyncState
Section titled “EntitySyncState”interface EntitySyncState { netId: number; position?: { x: number; y: number }; rotation?: number;}createSnapshotBuffer
Section titled “createSnapshotBuffer”function createSnapshotBuffer<T>(config: { maxSnapshots: number; interpolationDelay: number;}): ISnapshotBuffer<T>;createTransformInterpolator
Section titled “createTransformInterpolator”function createTransformInterpolator(): ITransformInterpolator;createHermiteTransformInterpolator
Section titled “createHermiteTransformInterpolator”function createHermiteTransformInterpolator(config: { bufferSize: number;}): IHermiteTransformInterpolator;createClientPrediction
Section titled “createClientPrediction”function createClientPrediction(config: { maxPredictedInputs: number; reconciliationThreshold: number;}): IClientPrediction;