啟用鎖定畫面輸入回呼¶
當主機 PC 切換至 Windows 鎖定畫面時,OS 安全策略會封鎖 OS 層級的鍵盤和滑鼠輸入。在遠端環境中,畫面和音訊串流仍可傳輸,但無法進行實際的遊戲操作。
過去,遠端使用者需要輸入 Windows 帳戶密碼來解除鎖定。然而,這種方式存在暴露 PC 完整控制權限的風險,且連線流程也較為繁瑣。
Remote Play Plugin 在 Hive Console 的 Remote Play 設定中提供了**不解除鎖定畫面即可遊玩**功能。啟用此功能後,鍵盤、滑鼠、觸控、搖桿、滾輪、縮放等所有輸入事件將直接傳遞至遊戲回呼。
主要行為¶
- 基於回呼的分發:所有輸入事件將以
eventType: "Control"的形式傳遞至透過RegisterCallback註冊的回呼函式。無論鎖定狀態如何均按相同方式運作,解除鎖定後回呼分發仍會持續。 - 繞過 OS 輸入路徑:不使用 OS 的
SendInput路徑,無論 Windows 鎖定狀態如何,都能接收一致的輸入事件。 - 直接注入遊戲:遊戲將回呼接收到的輸入資料直接注入內部輸入系統,在鎖定狀態和正常狀態下均處理相同的操作。
事前準備¶
在套用此功能之前,請準備以下內容:
- 匯入 Remote Play Plugin
- 註冊用於接收事件的回呼函式
- 支援的 SDK / 外掛程式版本:
- Remote Play Plugin 1.2.0 以上
- Hive SDK v4 26.4.0 以上
Warning
若在未透過 RegisterCallback 註冊回呼的情況下啟用 Hive Console 的**不解除鎖定畫面即可遊玩**功能,所有輸入事件將遺失,遠端操作將無法正常進行。請務必先註冊回呼。
Control 事件協議¶
啟用**不解除鎖定畫面即可遊玩**功能後,回呼傳遞的輸入事件與聊天事件採用相同的 JSON 格式,eventType 的值固定為 "Control"。實際輸入類型透過內部的 controlType 加以區分。
Envelope 共通結構¶
{
"version" : "1.02.00",
"eventType" : "Control",
"eventValue": {
"value": {
"controlType" : "<Key | Click | Wheel | Zoom>",
"controlValue": {
"value" : "<controlType-specific-value>",
"action" : "<controlType-specific-action>"
}
}
},
"etc" : { }
}
| 欄位 | 說明 |
|---|---|
version | 固定為 "1.02.00" |
eventType | 始終為 "Control" |
eventValue.value.controlType | 輸入類型,共 4 種:"Key" / "Click" / "Wheel" / "Zoom" |
eventValue.value.controlValue.value | 各 controlType 的資料(座標、鍵碼等) |
eventValue.value.controlValue.action | 各 controlType 的狀態或動作 |
etc | 空物件 |
controlType = "Key" - 鍵盤輸入¶
傳遞鍵盤單一按鍵的按下或放開狀態。Web 用戶端產生的鍵盤輸入和搖桿輸入均會轉換為 controlType。
| 欄位 | 值 |
|---|---|
controlValue.value | Windows 虛擬鍵碼的 16 進位字串(例:"0x41" = 'A',"0x57" = 'W',"0x20" = Space) |
controlValue.action | "Down" 或 "Up" |
搖桿方向碼根據映射設定(WASD / DIRECTION)拆分為單一按鍵事件後以 controlType 傳遞。遊戲端的鍵盤輸入和搖桿輸入看起來格式相同。斜向移動也由主機拆分為兩個單鍵事件後發送。
範例 - 按下 'A' 鍵
{
"version" : "1.02.00",
"eventType" : "Control",
"eventValue": {
"value": {
"controlType" : "Key",
"controlValue": { "value": "0x41", "action": "Down" }
}
},
"etc" : { }
}
範例 - 搖桿向上(WASD 映射時的 'W' 鍵)
{
"version" : "1.02.00",
"eventType" : "Control",
"eventValue": {
"value": {
"controlType" : "Key",
"controlValue": { "value": "0x57", "action": "Down" }
}
},
"etc" : { }
}
controlType = "Click" - 滑鼠及觸控座標輸入¶
傳遞滑鼠點擊、滑鼠移動及觸控座標。Web 用戶端產生的滑鼠輸入和觸控輸入均會自動轉換為以 GetClientRect() 為基準的遊戲視窗用戶端區域像素座標後傳遞。
| 欄位 | 值 |
|---|---|
controlValue.value | "x#y" 格式,單位為**遊戲視窗用戶端區域像素座標**(保留小數點後 1 位)。Web 用戶端的 0-1000 正規化座標在主機端轉換為像素後傳遞。 |
controlValue.action | "Down"、"Up" 或 "Move" |
Note
觸控輸入轉換為 Click 類型時,touchID 資訊不會被保留。
座標轉換參考¶
curWidth / curHeight 是以遊戲視窗 GetClientRect() 為基準的用戶端區域尺寸,因此在遊戲中可直接作為視窗座標使用。
| Web 用戶端位置 | 正規化座標(inbound) | 像素座標(curWidth=1053, curHeight=1585 範例) |
|---|---|---|
| 左上 | "0.0#0.0" | "0.0#0.0" |
| 右上 | "1000.0#0.0" | "1053.0#0.0" |
| 左下 | "0.0#1000.0" | "0.0#1585.0" |
| 右下 | "1000.0#1000.0" | "1053.0#1585.0" |
| 中央 | "500.0#500.0" | "526.5#792.5" |
範例 - 滑鼠點擊(Down -> Up)
{
"version" : "1.02.00",
"eventType" : "Control",
"eventValue": {
"value": {
"controlType" : "Click",
"controlValue": { "value": "526.5#792.5", "action": "Down" }
}
},
"etc" : { }
}
{
"version" : "1.02.00",
"eventType" : "Control",
"eventValue": {
"value": {
"controlType" : "Click",
"controlValue": { "value": "526.5#792.5", "action": "Up" }
}
},
"etc" : { }
}
範例 - 拖曳(Move)
{
"version" : "1.02.00",
"eventType" : "Control",
"eventValue": {
"value": {
"controlType" : "Click",
"controlValue": { "value": "645.1#681.7", "action": "Move" }
}
},
"etc" : { }
}
controlType = "Wheel" - 滑鼠滾輪¶
傳遞滑鼠滾輪的捲動操作。
| 欄位 | 值 |
|---|---|
controlValue.value | "x.0#y.0" 格式,為**滑鼠游標目前的像素座標**(以遊戲視窗用戶端區域為基準)。Web 用戶端發送的捲動步數資訊將遺失。 |
controlValue.action | "Up"(向上捲動)或 "Down"(向下捲動) |
範例 - 滾輪向下(滑鼠位置 1234.0 px, 567.0 px)
{
"version" : "1.02.00",
"eventType" : "Control",
"eventValue": {
"value": {
"controlType" : "Wheel",
"controlValue": { "value": "1234.0#567.0", "action": "Down" }
}
},
"etc" : { }
}
controlType = "Zoom" - 放大/縮小¶
傳遞攝影機或地圖畫面的放大/縮小操作。
| 欄位 | 值 |
|---|---|
controlValue.value | 固定為 "1"。Web 用戶端發送的縮放步數資訊將遺失。 |
controlValue.action | "In"(放大)或 "Out"(縮小) |
範例 - 放大
{
"version" : "1.02.00",
"eventType" : "Control",
"eventValue": {
"value": {
"controlType" : "Zoom",
"controlValue": { "value": "1", "action": "In" }
}
},
"etc" : { }
}
範例 - 縮小
{
"version" : "1.02.00",
"eventType" : "Control",
"eventValue": {
"value": {
"controlType" : "Zoom",
"controlValue": { "value": "1", "action": "Out" }
}
},
"etc" : { }
}
輸入類型轉換映射概述¶
以下是 Web 用戶端發送的原始輸入類型轉換為主機回呼事件的映射結構。
| Web 用戶端輸入 | 回呼 controlType | 主要轉換 / 資訊遺失 |
|---|---|---|
| Key | "Key" | 直接使用 VK 16 進位值 |
| Joystick | "Key" | 方向碼 -> WASD / DIRECTION 映射 -> 拆分為單鍵 |
| Click | "Click" | 座標正規化 -> 像素轉換 |
| Touch | "Click" | 座標正規化 -> 像素轉換,touchID 不傳遞(透過重複的 Down 判斷多點觸控) |
| Wheel | "Wheel" | 步數資訊 -> 替換為滑鼠像素座標 |
| Zoom | "Zoom" | 步數資訊 -> 固定為 "1" |
狀態(Event)/ 聊天(Message)事件不透過此 Control 事件傳遞,而是按照現有協議規範單獨傳遞。
遊戲端輸入處理指南¶
在 Hive Console 的 Remote Play 設定中啟用**不解除鎖定畫面即可遊玩**功能後,Remote Play 不會將輸入事件發送至 OS 輸入佇列,而是透過註冊的回呼直接傳遞給遊戲。
因此,回呼接收到的輸入事件需要直接傳遞給 Unity Input System 或 Unreal Input Subsystem 等遊戲內部輸入系統進行處理。
這種方式是為了繞過 Windows 鎖定畫面環境中 SendInput 和 SendKey 等 OS 層級輸入注入受到限制的問題而設計的。由於輸入事件直接在遊戲程序內部分發,建議不區分鎖定畫面狀態和正常狀態,使用相同的處理路徑。
也就是說,啟用**不解除鎖定畫面即可遊玩**功能後,建議接收此回呼傳遞的所有輸入事件,並將其傳遞給遊戲內部輸入系統的方式進行實作。這樣可以確保無論鎖定畫面狀態如何,都能保證一致的輸入處理和遠端遊玩行為。
- Unity:透過
InputSystem.QueueEvent或自訂輸入管理器進行分發 - Unreal Engine:透過
FSlateApplication::OnKeyDown / OnMouseButtonDown等 Slate 事件進行分發,或使用遊戲自訂輸入管理器
鎖定畫面環境下的背景渲染與音訊處理指南¶
在 Windows 鎖定畫面環境中使用 Remote Play,需要遊戲在背景狀態下也能正常運行。許多遊戲引擎在失去焦點或切換至背景狀態時,會停止渲染或限制幀率以降低 CPU 使用率,並暫停音訊播放。為保證遠端串流正常運行,需要修改設定使遊戲程序在背景也能繼續運行。
1. 根據 Remote Play 連線狀態的建議策略¶
遊戲需要確認 Remote Play 的連線狀態,判斷是否有遠端使用者正在連線。建議的行為如下:
| 連線狀態 | 建議行為 |
|---|---|
| 未連線 | 維持現有遊戲策略,切換至背景時可停止渲染和音訊 |
| 連線中 | 在背景狀態下也維持渲染,在背景狀態下也維持音訊輸出 |
連線狀態可透過狀態事件回呼(eventType: "Event",值 REMOTE_PLAY_CONNECTED / REMOTE_PLAY_DISCONNECTED)進行判斷。
2. 維持背景渲染¶
即使在鎖定畫面狀態下,Remote Play 也需要能夠擷取畫面,因此需要持續運行渲染循環。確認項目範例如下:
- 不停止幀更新
- 維持渲染循環
- 維持攝影機渲染
- 維持 UI 更新
- 確認背景幀限制策略
Warning
若在背景狀態下停止渲染,Remote Play 將持續發送最後一幀畫面,或顯示黑色畫面。
3. 維持背景音訊輸出¶
Remote Play 會擷取遊戲程序輸出的音訊並分發給遠端玩家。因此,需要停用以下類型的背景音訊封鎖策略:
- 失去焦點時暫停音訊
- 視窗停用時停止 Audio Engine
- 啟用背景靜音功能
Warning
若在背景狀態下停止音訊輸出,遠端玩家將無法聽到遊戲聲音。
各引擎注意事項與參考¶
Unity¶
Unity 在預設情況下,切換至背景時可能會限制更新。使用鎖定畫面 Remote Play 功能時,建議如下啟用背景執行:
如果存在失去焦點時停止音訊的自訂邏輯,請考慮 Remote Play 的連線狀態進行例外處理。
Unreal Engine¶
Unreal Engine 專案中也需要確認是否有限制失去焦點時的 Tick、渲染或音訊處理的設定。特別建議確認以下項目:
- Background Tick 的運行狀況
- Focus Lost 時的 Pause 處理情況
- Audio Mixer 的運行狀況
- 背景 FPS 限制策略
Remote Play 連線期間,需要實作即使在背景狀態下也能維持正常遊戲循環的方式。
建議操作情境¶
- 使用者切換至 Windows 鎖定畫面狀態
- Remote Play 用戶端連線
- 遊戲偵測到連線狀態,維持背景渲染和音訊輸出
- 繼續遊戲渲染
- 繼續遊戲音訊輸出
- Remote Play Plugin 正常擷取並發送畫面和音訊
- 遠端使用者即時接收遊戲畫面和聲音
- 輸入事件透過 Remote Play 輸入
Control回呼傳遞給遊戲內部輸入系統
必要確認事項概述
若要在鎖定畫面環境中正常使用 Remote Play,需滿足以下兩個條件:
- 需在 Hive Console 的 Remote Play 設定中啟用**不解除鎖定畫面即可遊玩**功能,並將輸入事件傳遞給遊戲內部輸入系統。
- Remote Play 連線期間,即使在背景狀態下也需要維持渲染和音訊處理。
若任一條件不滿足,可能因畫面停止、聲音輸出錯誤、操作困難等問題導致無法正常運行。