亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

C#游戲開發(fā):Facepunch.Steamworks集成指南與核心功能實(shí)戰(zhàn)

C#游戲開發(fā):Facepunch.Steamworks集成指南與核心功能實(shí)戰(zhàn) 1. 項(xiàng)目概述為什么選擇 Facepunch.Steamworks如果你是一名使用 Unity 或 .NET 進(jìn)行游戲開發(fā)的 C# 程序員并且你的游戲計(jì)劃上架 Steam 平臺(tái)那么集成 Steamworks API 幾乎是必經(jīng)之路。Valve 官方的 Steamworks SDK 功能強(qiáng)大但它是用 C 編寫的這意味著在 C# 項(xiàng)目中直接使用它你需要處理繁瑣的平臺(tái)調(diào)用P/Invoke、復(fù)雜的結(jié)構(gòu)體轉(zhuǎn)換和手動(dòng)內(nèi)存管理。幾年前我接手一個(gè) Unity 項(xiàng)目需要接入 Steam 成就和排行榜第一次嘗試使用原生 SDK 時(shí)光是讓一個(gè)簡單的“獲取好友列表”功能跑起來就花了大半天時(shí)間調(diào)試各種指針和內(nèi)存問題過程相當(dāng)痛苦。就在那時(shí)我發(fā)現(xiàn)了 Facepunch.Steamworks。簡單來說它是一個(gè)完全用 C# 編寫的 Steamworks API 封裝庫。它的核心價(jià)值在于將 Valve 那套面向 C 的、過程式的、略顯晦澀的 API徹底重構(gòu)成了符合 C# 開發(fā)者習(xí)慣的、面向?qū)ο蟮?、流暢的接口。它不是簡單的“包裝紙”而是一次徹底的“重新設(shè)計(jì)”。舉個(gè)例子在官方 SDK 或 Steamworks.NET另一個(gè)流行的封裝里獲取好友列表你需要先獲取數(shù)量再循環(huán)索引獲取每個(gè)好友的 ID最后再根據(jù) ID 獲取詳細(xì)信息代碼充滿了循環(huán)和臨時(shí)變量。而在 Facepunch.Steamworks 里你只需要一行foreach循環(huán)直接拿到一個(gè)包含所有信息的Friend對象集合代碼簡潔明了意圖清晰。這個(gè)開源項(xiàng)目由 Facepunch Studios《Rust》和《Garry‘s Mod》的開發(fā)商維護(hù)他們自己在商業(yè)項(xiàng)目中重度使用因此庫的穩(wěn)定性和實(shí)用性經(jīng)過了實(shí)戰(zhàn)檢驗(yàn)。對于獨(dú)立開發(fā)者和小型團(tuán)隊(duì)來說它極大地降低了接入 Steam 功能如成就、統(tǒng)計(jì)、云存檔、多人聯(lián)機(jī)、創(chuàng)意工坊的技術(shù)門檻和開發(fā)時(shí)間。本教程將基于我多次項(xiàng)目的實(shí)戰(zhàn)經(jīng)驗(yàn)帶你從零開始快速、免費(fèi)地將 Facepunch.Steamworks 集成到你的 Unity 或 .NET 項(xiàng)目中并深入講解幾個(gè)核心功能模塊的實(shí)現(xiàn)細(xì)節(jié)與避坑指南。2. 環(huán)境準(zhǔn)備與項(xiàng)目集成在開始敲代碼之前我們需要搭建好基礎(chǔ)環(huán)境。整個(gè)過程可以概括為“一拿、一放、一引、一配”四個(gè)步驟。雖然官方 Wiki 有說明但其中一些細(xì)節(jié)對于新手來說容易踩坑我會(huì)結(jié)合自己的經(jīng)驗(yàn)詳細(xì)拆解。2.1 獲取必要的文件包Facepunch.Steamworks 本身是一個(gè)純 C# 的托管庫但它底層仍然需要調(diào)用 Valve 官方的原生 Steamworks 二進(jìn)制文件。因此你需要準(zhǔn)備兩個(gè)東西Facepunch.Steamworks 托管庫從項(xiàng)目的 GitHub Release 頁面下載最新的穩(wěn)定版本。通常是一個(gè).zip文件解壓后里面包含針對不同 .NET 框架版本如 net46, netstandard2.0 等編譯的Facepunch.Steamworks.dll文件。對于 Unity 項(xiàng)目我們通常使用net46或netstandard2.0版本。Steamworks SDK Redistributables這是 Valve 官方的原生庫。你需要去 Steamworks 官網(wǎng)需開發(fā)者賬號登錄下載 SDK但 Facepunch.Steamworks 對其有版本依賴。關(guān)鍵點(diǎn)來了你必須下載與 Facepunch.Steamworks 版本兼容的 SDK 版本。例如當(dāng)前 Facepunch.Steamworks 穩(wěn)定版可能要求 SDK 版本 1.55。這個(gè)兼容版本號通常在 Facepunch.Steamworks 的 GitHub 倉庫首頁或 Release Notes 里明確寫明。下載后找到sdk/redistributable_bin文件夾這里面包含了steam_api.dll,steam_api64.dll,libsteam_api.so,libsteam_api.dylib等針對 Windows、Linux、macOS 不同平臺(tái)的原生庫文件。注意絕對不要混用不同版本的 SDK 和 Facepunch.Steamworks 庫否則會(huì)導(dǎo)致難以排查的運(yùn)行時(shí)崩潰或功能異常。每次更新 Facepunch.Steamworks 時(shí)務(wù)必檢查并更新對應(yīng)的 SDK 版本。2.2 在 Unity 項(xiàng)目中的集成步驟假設(shè)你有一個(gè) Unity 項(xiàng)目集成步驟如下放置原生庫在 Unity 項(xiàng)目的Assets文件夾下通常我習(xí)慣放在Assets/Plugins里創(chuàng)建適當(dāng)?shù)淖游募A結(jié)構(gòu)例如Assets/Plugins/Steamworks/Redistributables。將上一步redistributable_bin文件夾下的所有文件復(fù)制到這里。放置托管庫將下載的Facepunch.Steamworks.dll例如來自netstandard2.0文件夾也復(fù)制到 Unity 項(xiàng)目的Assets文件夾下比如Assets/Plugins/Steamworks/Managed。配置 Unity 平臺(tái)設(shè)置至關(guān)重要這是最容易出錯(cuò)的一步。在 Unity Editor 的 Project 窗口選中你導(dǎo)入的各個(gè) DLL 文件在 Inspector 面板中進(jìn)行如下設(shè)置Facepunch.Steamworks.Win32.dll和Facepunch.Steamworks.Win64.dll這兩個(gè)是 Windows 平臺(tái)特定的封裝庫。你需要根據(jù)你的目標(biāo)平臺(tái)進(jìn)行選擇。對于Win32.dll在 “Platforms” 設(shè)置中取消勾選 “Any Platform”然后只勾選 “Windows” 平臺(tái)并在其下方的 “CPU” 中選擇 “x86”。對于Win64.dll同樣取消 “Any Platform”只勾選 “Windows” “CPU” 選擇 “x86_64”。Facepunch.Steamworks.Posix.dll這是用于 macOS 和 Linux 的庫。設(shè)置時(shí)取消 “Any Platform”在 “Include Platforms” 中勾選 “Editor” 和 “Standalone”。然后在 “Platform Settings” 的 “OS” 下拉菜單中分別選擇 “OSX” 和 “Linux”并確保對應(yīng)的平臺(tái)被勾選。steam_api.dll等原生庫通常保持默認(rèn)設(shè)置即可Unity 能自動(dòng)識別。但為了保險(xiǎn)起見可以檢查一下它們是否在正確的平臺(tái)被啟用。實(shí)操心得我強(qiáng)烈建議為不同平臺(tái)的構(gòu)建單獨(dú)創(chuàng)建不同的構(gòu)建目標(biāo)文件夾并在構(gòu)建前仔細(xì)檢查 “Player Settings” - “Other Settings” - “Configuration” 中的 “Scripting Backend” 和 “Api Compatibility Level”。對于 Facepunch.Steamworks使用.NET Standard 2.0或.NET Framework作為 API 兼容性級別通常是最穩(wěn)妥的。使用 IL2CPP 后端時(shí)也需要確保所有原生庫的架構(gòu)配置正確。2.3 在純 .NET 項(xiàng)目中的集成對于非 Unity 的 .NET Core 或 .NET Framework 控制臺(tái)/桌面應(yīng)用過程更簡單通過 NuGet 包管理器安裝Facepunch.Steamworks包。這是最推薦的方式因?yàn)樗鼤?huì)自動(dòng)處理依賴。# 在包管理器控制臺(tái) Install-Package Facepunch.Steamworks或者通過 .NET CLI:dotnet add package Facepunch.Steamworks手動(dòng)將 Steamworks SDK 的redistributable_bin文件夾內(nèi)容復(fù)制到你的項(xiàng)目輸出目錄例如bin/Debug/net6.0下確保steam_api.dll等文件與你的可執(zhí)行文件在同一目錄。在代碼中初始化 SteamClient 時(shí)確保應(yīng)用程序的當(dāng)前工作目錄或DllImport的搜索路徑能夠找到這些原生 DLL。3. 核心初始化與基礎(chǔ)框架搭建集成文件只是第一步讓 Steamworks 在運(yùn)行時(shí)活起來才是關(guān)鍵。初始化流程看似簡單但每一步都有其意義和潛在的坑。3.1 創(chuàng)建 SteamManager 單例在 Unity 中一個(gè)常見的、穩(wěn)健的做法是創(chuàng)建一個(gè)永不銷毀的SteamManager單例游戲?qū)ο髵燧d一個(gè)腳本來管理 SteamClient 的生命周期。using UnityEngine; using Steamworks; using System; public class SteamManager : MonoBehaviour { public static SteamManager Instance { get; private set; } public static bool Initialized { get; private set; } private void Awake() { // 單例模式確保全局只有一個(gè) SteamManager if (Instance ! null Instance ! this) { Destroy(gameObject); return; } Instance this; DontDestroyOnLoad(gameObject); // 嘗試初始化 SteamClient InitializeSteam(); } private void InitializeSteam() { try { // 設(shè)置你的 AppId。這個(gè) ID 必須在 Steamworks 后臺(tái)為你的游戲配置好。 // 注意在開發(fā)時(shí)你可以使用 Steamworks 提供的測試 AppId (如 480)。 SteamClient.Init(480); // 替換為你的實(shí)際 AppId if (!SteamClient.IsValid) { Debug.LogError(SteamClient 初始化失敗。請確保\n1. Steam 客戶端正在運(yùn)行。\n2. 當(dāng)前登錄的賬戶擁有該 AppId 的許可。\n3. 原生庫文件放置正確。); return; } Initialized true; Debug.Log($Steam 初始化成功用戶: {SteamClient.Name}, SteamID: {SteamClient.SteamId}); } catch (Exception e) { Debug.LogError($Steam 初始化過程發(fā)生異常: {e.Message}); } } private void Update() { // 必須定期調(diào)用 RunCallbacks以處理來自 Steam 的回調(diào)Callbacks和事件Events。 if (Initialized) { SteamClient.RunCallbacks(); } } private void OnApplicationQuit() { // 程序退出時(shí)安全地關(guān)閉 SteamClient。 if (Initialized) { SteamClient.Shutdown(); } } }關(guān)鍵點(diǎn)解析SteamClient.Init(AppId): 這是啟動(dòng)一切的核心。傳入你在 Steamworks 合作伙伴后臺(tái)創(chuàng)建的游戲 AppId。在開發(fā)測試階段Valve 提供了一個(gè)名為“Spacewar”AppId 480的通用測試應(yīng)用任何擁有 Steam 客戶端的開發(fā)者都可以用來測試功能無需上傳自己的游戲。但在發(fā)布前務(wù)必替換成你自己的 AppId。SteamClient.RunCallbacks(): 這是 Facepunch.Steamworks 的“心跳”。Steam 客戶端通過異步回調(diào)Callback或事件Event通知你的游戲各種狀態(tài)變化如好友上線、收到聊天消息、成就解鎖完成等。你必須在一個(gè)游戲循環(huán)如 Unity 的Update中頻繁調(diào)用此方法每秒幾十次以確保這些回調(diào)能被及時(shí)處理。如果忘記調(diào)用你會(huì)發(fā)現(xiàn)很多異步操作如解鎖成就沒有反應(yīng)。SteamClient.Shutdown(): 在程序退出前調(diào)用進(jìn)行資源清理。雖然不調(diào)用有時(shí)也不會(huì)立即出錯(cuò)但為了良好的編程習(xí)慣和避免潛在的內(nèi)存泄漏建議總是調(diào)用。3.2 處理 Steam 客戶端未運(yùn)行的情況不是所有玩家都會(huì)一直開著 Steam。你的游戲應(yīng)該優(yōu)雅地處理這種情況。private void InitializeSteam() { // 首先檢查 Steam 客戶端是否正在運(yùn)行 try { SteamClient.Init(480, true); // 第二個(gè)參數(shù)如果為 true當(dāng) Steam 未運(yùn)行時(shí)會(huì)嘗試啟動(dòng)它。 } catch (System.Exception e) { // 最常見的異常是 Steamworks.InitFailedException表明 Steam 未運(yùn)行或初始化失敗。 Debug.LogWarning($無法初始化 Steamworks: {e.Message}. 游戲?qū)⒁噪x線模式運(yùn)行。); // 在這里設(shè)置一個(gè)離線模式標(biāo)志并禁用所有依賴 Steam 的功能如多人聯(lián)機(jī)、云存檔。 Initialized false; return; } // ... 后續(xù)初始化邏輯 }避坑技巧對于單機(jī)游戲你可能希望即使 Steam 未運(yùn)行游戲也能啟動(dòng)。這時(shí)可以捕獲初始化異常并將游戲設(shè)置為“離線模式”。但要注意所有依賴 Steam 的 API如SteamClient.IsValid在初始化失敗后都將不可用你的代碼需要做好空值檢查和功能降級。4. 核心功能模塊實(shí)戰(zhàn)詳解初始化完成后我們就可以暢游 Steamworks 提供的豐富功能了。Facepunch.Steamworks 將這些功能組織成不同的接口Interface如SteamFriends,SteamUserStats,SteamRemoteStorage等使用起來非常直觀。4.1 用戶與好友系統(tǒng)這是最基礎(chǔ)的功能。通過SteamFriends接口你可以獲取當(dāng)前用戶的信息及其好友列表。if (SteamManager.Initialized) { // 獲取當(dāng)前登錄的 Steam 用戶信息 var mySteamId SteamClient.SteamId; var myName SteamClient.Name; var myLevel SteamClient.SteamLevel; // Steam 等級 var myState SteamClient.State; // 在線狀態(tài)在線、離開、忙碌等 Debug.Log($我是 {myName} (ID: {mySteamId}), 等級 {myLevel}, 狀態(tài): {myState}); // 獲取好友列表 - Facepunch 風(fēng)格的簡潔 API var friends SteamFriends.GetFriends(); Debug.Log($你有 {friends.Count} 位好友); foreach (var friend in friends) { // friend 是一個(gè)完整的 Friend 對象包含豐富信息 Console.WriteLine($好友: {friend.Name}); Console.WriteLine($ ID: {friend.Id}); Console.WriteLine($ 在線: {friend.IsOnline}); Console.WriteLine($ 正在玩: {friend.IsPlayingThisGame}); Console.WriteLine($ 狀態(tài): {friend.State}); // 你甚至可以獲取好友的 Rich Presence游戲內(nèi)狀態(tài) var richPresence friend.GetRichPresence(map); if (richPresence ! null) { Console.WriteLine($ 正在地圖: {richPresence}); } } }與 Steamworks.NET 的對比回憶一下引言中的例子Facepunch 的 API 設(shè)計(jì)優(yōu)勢在這里體現(xiàn)得淋漓盡致。你不再需要手動(dòng)管理好友數(shù)量、循環(huán)索引和多次 API 調(diào)用直接一個(gè)GetFriends()返回可遍歷的集合代碼可讀性和編寫效率大幅提升。4.2 成就與統(tǒng)計(jì)系統(tǒng)成就Achievements和統(tǒng)計(jì)Stats是提升游戲粘性的重要功能。Facepunch.Steamworks 通過SteamUserStats接口提供了簡潔的訪問方式。4.2.1 成就的解鎖與查詢public class AchievementManager : MonoBehaviour { private void Start() { if (!SteamManager.Initialized) return; // 首先必須請求加載用戶的成就和統(tǒng)計(jì)數(shù)據(jù)。 // 這是一個(gè)異步操作但 Facepunch 提供了同步和異步兩種方式。 SteamUserStats.RequestCurrentStats(); // 檢查某個(gè)成就是否已解鎖 var achievement new Achievement(ACH_WIN_ONE_GAME); // “ACH_WIN_ONE_GAME” 是你在 Steamworks 后臺(tái)定義的成就 API 名稱 if (achievement.State) { Debug.Log(成就‘贏得一場比賽’已解鎖); } else { Debug.Log(成就‘贏得一場比賽’尚未解鎖。); } // 解鎖成就 achievement.Trigger(); // 這會(huì)立即在本地觸發(fā)并異步上傳到 Steam 服務(wù)器。 // 你也可以通過接口直接操作 SteamUserStats.SetAchievement(ACH_KILL_100_ENEMIES); // 重要修改成就或統(tǒng)計(jì)后必須調(diào)用 StoreStats 將更改上傳至 Steam 服務(wù)器。 SteamUserStats.StoreStats(); } // 監(jiān)聽成就解鎖事件可選 private void OnEnable() { SteamUserStats.OnAchievementProgress OnAchievementProgress; } private void OnDisable() { SteamUserStats.OnAchievementProgress - OnAchievementProgress; } private void OnAchievementProgress(string apiName, int currentProgress, int maxProgress) { // 對于有進(jìn)度條的成就如“擊殺 1000 個(gè)敵人”這個(gè)事件會(huì)在進(jìn)度更新時(shí)觸發(fā)。 Debug.Log($成就 ‘{apiName}’ 進(jìn)度: {currentProgress}/{maxProgress}); if (currentProgress maxProgress) { Debug.Log($成就 ‘{apiName}’ 已達(dá)成); } } }注意事項(xiàng)成就 API 名稱ACH_WIN_ONE_GAME這個(gè)字符串必須與你在 Steamworks 合作伙伴后臺(tái)為成就設(shè)置的“API 名稱英文”完全一致包括大小寫。StoreStats()調(diào)用SetAchievement或SetStat只修改本地緩存。你必須調(diào)用StoreStats()才能將更改持久化到 Steam 服務(wù)器。通??梢栽诔删徒怄i后立即調(diào)用也可以為了節(jié)省網(wǎng)絡(luò)請求在游戲存檔點(diǎn)或關(guān)卡結(jié)束時(shí)批量調(diào)用。但請注意如果玩家在調(diào)用StoreStats()前退出游戲成就可能無法記錄。進(jìn)度成就對于“達(dá)成 X 次”這類成就不要每次觸發(fā)事件就調(diào)用Trigger()而應(yīng)該使用IndicateAchievementProgress來更新進(jìn)度或者通過統(tǒng)計(jì)Stats來間接驅(qū)動(dòng)成就。4.2.2 統(tǒng)計(jì)數(shù)據(jù)的設(shè)置與獲取統(tǒng)計(jì)分為整數(shù)型Int和浮點(diǎn)型Float。它們通常用于跟蹤游戲內(nèi)數(shù)據(jù)并可以關(guān)聯(lián)到成就例如“總擊殺數(shù)”統(tǒng)計(jì)達(dá)到 1000 時(shí)自動(dòng)解鎖“千人斬”成就。// 假設(shè)我們在 Steamworks 后臺(tái)定義了一個(gè)名為 “total_kills” 的整數(shù)型統(tǒng)計(jì)。 public class StatsManager : MonoBehaviour { private void RecordKill() { if (!SteamManager.Initialized) return; // 1. 獲取當(dāng)前統(tǒng)計(jì)值 int currentKills SteamUserStats.GetStatInt(total_kills); // 2. 增加統(tǒng)計(jì)值 currentKills; SteamUserStats.SetStat(total_kills, currentKills); // 3. 檢查是否觸發(fā)成就假設(shè)“千人斬”成就關(guān)聯(lián)到 total_kills 1000 if (currentKills 1000) { new Achievement(ACH_THOUSAND_KILLS).Trigger(); } // 4. 上傳更改可以稍后批量進(jìn)行 SteamUserStats.StoreStats(); } // 獲取全球統(tǒng)計(jì)平均值異步 private async void GetGlobalAverageKillsAsync() { // RequestGlobalStatsAsync 默認(rèn)獲取過去 60 天的全球數(shù)據(jù) var result await SteamUserStats.RequestGlobalStatsAsync(); if (result.HasValue) { double globalAvg SteamUserStats.GetGlobalStatFloat(total_kills); Debug.Log($全球玩家平均擊殺數(shù)60天: {globalAvg}); } } }實(shí)操心得統(tǒng)計(jì)數(shù)據(jù)非常適合用來做游戲內(nèi)的數(shù)據(jù)追蹤和排行榜基礎(chǔ)。StoreStats()的調(diào)用頻率需要權(quán)衡。過于頻繁會(huì)增加服務(wù)器壓力并可能被限流過于稀疏則有數(shù)據(jù)丟失風(fēng)險(xiǎn)。一個(gè)折中的方案是在玩家完成一局游戲、返回主菜單、或手動(dòng)存檔時(shí)進(jìn)行存儲(chǔ)。4.3 云存檔功能Steam 云存檔允許玩家的游戲進(jìn)度在不同電腦間同步。通過SteamRemoteStorage接口實(shí)現(xiàn)。public class CloudSaveManager : MonoBehaviour { private const string SAVE_FILE_NAME player_data.sav; public void SaveGame(PlayerData data) { if (!SteamManager.Initialized || !SteamRemoteStorage.IsCloudEnabledForApp) { // 云存檔未啟用保存到本地 SaveToLocalFile(data); return; } // 將數(shù)據(jù)序列化為字節(jié)數(shù)組例如使用 JsonUtility 或 BinaryFormatter byte[] saveData SerializeData(data); // 寫入 Steam 云 bool success SteamRemoteStorage.FileWrite(SAVE_FILE_NAME, saveData); if (success) { Debug.Log(游戲數(shù)據(jù)已保存至 Steam 云。); } else { Debug.LogError(云存檔寫入失敗可能磁盤已滿或配額不足。); SaveToLocalFile(data); // 降級到本地保存 } } public PlayerData LoadGame() { PlayerData data null; // 優(yōu)先嘗試從云存儲(chǔ)加載 if (SteamManager.Initialized SteamRemoteStorage.FileExists(SAVE_FILE_NAME)) { byte[] cloudData SteamRemoteStorage.FileRead(SAVE_FILE_NAME); data DeserializeData(cloudData); Debug.Log(從 Steam 云加載存檔。); } // 如果云存檔不存在或加載失敗嘗試本地文件 if (data null LocalSaveFileExists()) { data LoadFromLocalFile(); Debug.Log(從本地文件加載存檔。); } return data ?? CreateNewGame(); // 都沒有則創(chuàng)建新游戲 } // 檢查云存儲(chǔ)配額 private void CheckCloudQuota() { ulong totalBytes SteamRemoteStorage.QuotaBytes; ulong usedBytes SteamRemoteStorage.QuotaUsedBytes; ulong remainingBytes SteamRemoteStorage.QuotaRemainingBytes; Debug.Log($云存儲(chǔ)配額: 已用 {usedBytes}/{totalBytes} 字節(jié)剩余 {remainingBytes} 字節(jié)。); } }關(guān)鍵點(diǎn)與避坑配額限制每個(gè) Steam 游戲有默認(rèn)的云存儲(chǔ)配額通常為 100MB。你的存檔文件大小需要合理控制。可以通過QuotaBytes等屬性查詢。文件沖突Steam 會(huì)自動(dòng)處理多設(shè)備間的文件同步?jīng)_突通常保留最新的文件。但你的游戲邏輯最好也能處理數(shù)據(jù)合并或讓玩家選擇存檔版本。異步性云存檔的讀寫是同步的但同步到 Steam 服務(wù)器是后臺(tái)進(jìn)行的。FileWrite成功只代表寫入了本地緩存隊(duì)列。啟用檢查務(wù)必在使用前檢查SteamRemoteStorage.IsCloudEnabledForApp和SteamRemoteStorage.IsCloudEnabledForAccount。玩家可能在 Steam 設(shè)置中禁用了云存檔。4.4 多人游戲與網(wǎng)絡(luò)Facepunch.Steamworks 為多人游戲提供了強(qiáng)大的底層支持包括 P2P 網(wǎng)絡(luò)和基于 Steam 游戲服務(wù)器的聯(lián)機(jī)。這里重點(diǎn)介紹 P2PPeer-to-Peer網(wǎng)絡(luò)它適合小規(guī)模、非專用的多人對戰(zhàn)。4.4.1 P2P 網(wǎng)絡(luò)通信基礎(chǔ)using Steamworks; using System.Text; public class P2PNetworkManager : MonoBehaviour { private void Start() { // 監(jiān)聽來自其他玩家的會(huì)話請求 SteamNetworking.OnP2PSessionRequest OnP2PSessionRequest; } private void OnP2PSessionRequest(SteamId remoteSteamId) { // 當(dāng)另一個(gè)玩家嘗試向你發(fā)送數(shù)據(jù)時(shí)會(huì)觸發(fā)此回調(diào)。 // 你可以根據(jù)游戲邏輯決定是否接受例如只接受好友或房間內(nèi)的玩家。 if (IsPlayerAllowedToConnect(remoteSteamId)) { SteamNetworking.AcceptP2PSessionWithUser(remoteSteamId); Debug.Log($已接受來自 {remoteSteamId} 的 P2P 連接請求。); } else { Debug.Log($拒絕了來自 {remoteSteamId} 的 P2P 連接請求。); } } // 向特定玩家發(fā)送數(shù)據(jù) public void SendDataToPlayer(SteamId targetPlayerId, byte[] data, P2PSend sendType P2PSend.Reliable) { if (!SteamManager.Initialized) return; // sendType 可以是 // - P2PSend.Unreliable: 最快但可能丟包適合位置更新。 // - P2PSend.UnreliableNoDelay: 類似 Unreliable但不排隊(duì)。 // - P2PSend.Reliable: 保證送達(dá)但可能有延遲適合聊天、關(guān)鍵指令。 // - P2PSend.ReliableWithBuffering: 可靠且會(huì)緩沖以優(yōu)化發(fā)送。 bool sent SteamNetworking.SendP2PPacket(targetPlayerId, data, data.Length, sendType); if (!sent) { Debug.LogWarning($向 {targetPlayerId} 發(fā)送 P2P 數(shù)據(jù)包失敗。); } } // 在 Update 中接收數(shù)據(jù) private void Update() { if (!SteamManager.Initialized) return; // 檢查是否有可用的數(shù)據(jù)包 while (SteamNetworking.IsP2PPacketAvailable()) { // 讀取數(shù)據(jù)包 if (SteamNetworking.ReadP2PPacket(out var packet)) { SteamId senderId packet.SteamId; byte[] data packet.Data; // 處理接收到的數(shù)據(jù)... ProcessIncomingData(senderId, data); } } } private void OnDestroy() { // 清理關(guān)閉與所有玩家的 P2P 會(huì)話 // 注意這需要你維護(hù)一個(gè)已連接玩家的列表。 foreach (var playerId in connectedPlayers) { SteamNetworking.CloseP2PSessionWithUser(playerId); } SteamNetworking.OnP2PSessionRequest - OnP2PSessionRequest; } }網(wǎng)絡(luò)編程核心要點(diǎn)連接管理P2P 連接是隱式的。當(dāng)你向一個(gè)SteamId發(fā)送數(shù)據(jù)時(shí)如果之前沒有會(huì)話Steam 會(huì)自動(dòng)嘗試建立連接并觸發(fā)對方的OnP2PSessionRequest回調(diào)。你需要在回調(diào)中決定是否AcceptP2PSessionWithUser。發(fā)送類型選擇P2PSend枚舉的選擇對游戲體驗(yàn)影響巨大。對于射擊游戲中的玩家位置使用Unreliable或UnreliableNoDelay以追求速度接受偶爾的丟包位置插值可以平滑。對于“發(fā)射武器”、“使用道具”這類關(guān)鍵指令必須使用Reliable。數(shù)據(jù)序列化你發(fā)送的是byte[]。你需要自己定義一套協(xié)議來序列化和反序列化你的游戲消息??梢允褂肧ystem.BitConverter、BinaryWriter或像MessagePack、Protobuf這樣的高效序列化庫。NAT 穿透Steam 提供了出色的 NAT 穿透能力大多數(shù)情況下玩家之間可以直接建立連接無需復(fù)雜的端口轉(zhuǎn)發(fā)。這是使用 Steamworks 進(jìn)行多人聯(lián)機(jī)的一大優(yōu)勢。5. 高級功能與實(shí)戰(zhàn)技巧掌握了基礎(chǔ)功能后我們可以探索一些更高級的特性這些特性能顯著提升游戲的品質(zhì)和社區(qū)活躍度。5.1 創(chuàng)意工坊Steam Workshop集成創(chuàng)意工坊允許玩家創(chuàng)建和分享自定義內(nèi)容如地圖、模組、皮膚。Facepunch.Steamworks 通過SteamUGCUser Generated Content接口提供了完整的支持。5.1.1 訂閱與下載物品public async void SubscribeToItem(PublishedFileId fileId) { // 訂閱一個(gè)創(chuàng)意工坊物品異步操作 var result await SteamUGC.Subscribe(fileId); if (result Result.OK) { Debug.Log($已訂閱物品 {fileId}。); // 訂閱后通常需要下載物品內(nèi)容 await DownloadItemAsync(fileId); } else { Debug.LogError($訂閱物品 {fileId} 失敗: {result}); } } private async Task DownloadItemAsync(PublishedFileId fileId) { var item await SteamUGC.DownloadAsync(fileId); if (item ! null item.IsInstalled) { string installPath item.Directory; // 物品的本地安裝路徑 Debug.Log($物品 {item.Title} 已下載至: {installPath}); // 現(xiàn)在你可以從 installPath 加載自定義內(nèi)容了 } }5.1.2 上傳物品供高級玩家或模組作者使用上傳流程相對復(fù)雜涉及創(chuàng)建一個(gè)Ugc.Editor對象來設(shè)置元數(shù)據(jù)標(biāo)題、描述、預(yù)覽圖、實(shí)際內(nèi)容文件等然后提交。public async void PublishNewMap(string mapFilePath, string title, string description) { // 1. 創(chuàng)建一個(gè)新的 Ugc.Editor var editor SteamUGC.CreateEditor(); // 2. 設(shè)置物品屬性 editor.WithTitle(title) .WithDescription(description) .WithContent(mapFilePath) // 設(shè)置內(nèi)容文件夾路徑 .WithPreviewFile(preview.jpg) // 設(shè)置預(yù)覽圖路徑 .WithTag(Map) // 添加標(biāo)簽 .WithChangeLog(Initial release.); // 更新日志 // 3. 提交發(fā)布異步 var publishResult await editor.SubmitAsync(); if (publishResult.Success) { Debug.Log($地圖發(fā)布成功物品ID: {publishResult.FileId}); // 可以在這里將 fileId 分享給其他玩家 } else { Debug.LogError($地圖發(fā)布失敗: {publishResult.Result}); } }注意事項(xiàng)創(chuàng)意工坊上傳功能通常由游戲內(nèi)的“模組編輯器”或?qū)iT的工具調(diào)用普通玩家不會(huì)直接使用。你需要仔細(xì)設(shè)計(jì)玩家生成內(nèi)容的流程和審核機(jī)制。5.2 游戲內(nèi)覆蓋層Overlay與網(wǎng)頁調(diào)用Steam 覆蓋層允許玩家在不離開游戲的情況下訪問好友列表、瀏覽器、截圖庫等。你可以通過代碼觸發(fā)覆蓋層的特定部分。// 打開 Steam 覆蓋層本身相當(dāng)于按 ShiftTab SteamFriends.OpenOverlay(); // 打開指定玩家的個(gè)人資料頁面 SteamFriends.OpenUserOverlay(steamId, steamid); // 或 friends, chat // 打開游戲的 Steam 商店頁面 SteamFriends.OpenStoreOverlay(appId, EOverlayToStoreFlag.AddToCart); // 可以傳遞參數(shù)如直接加入購物車 // 在覆蓋層內(nèi)打開一個(gè)網(wǎng)頁 SteamFriends.OpenWebOverlay(https://your-game-wiki.com); // 打開游戲邀請界面用于邀請好友加入當(dāng)前游戲/大廳 SteamFriends.OpenGameInviteOverlay(lobbyId); // 需要先有一個(gè)大廳Lobby使用場景在游戲內(nèi)添加一個(gè)“邀請好友”按鈕點(diǎn)擊后調(diào)用OpenGameInviteOverlay會(huì)彈出 Steam 的好友選擇界面體驗(yàn)非常原生。或者當(dāng)玩家遇到問題時(shí)可以調(diào)用OpenWebOverlay直接打開游戲的幫助頁面。5.3 大廳Lobby系統(tǒng)大廳是 Steam 為多人游戲提供的匹配和集會(huì)服務(wù)。它比單純的 P2P 更結(jié)構(gòu)化適合需要房間列表、玩家準(zhǔn)備狀態(tài)的游戲。public class LobbyManager : MonoBehaviour { private Lobby? currentLobby; // 創(chuàng)建一個(gè)大廳 public async void CreateLobby() { // 參數(shù)最大玩家數(shù)類型私有/好友/公開等 currentLobby await SteamMatchmaking.CreateLobbyAsync(4); // 創(chuàng)建一個(gè)4人公開大廳 if (currentLobby.HasValue) { var lobby currentLobby.Value; lobby.SetData(map, Forest); // 設(shè)置大廳自定義數(shù)據(jù) lobby.SetData(mode, Deathmatch); Debug.Log($大廳創(chuàng)建成功ID: {lobby.Id}, 加入碼: {lobby.Id}); // Lobby.Id 可以作為邀請碼 } } // 加入一個(gè)大廳通過ID或從列表選擇 public async void JoinLobby(ulong lobbyId) { currentLobby await SteamMatchmaking.JoinLobbyAsync(lobbyId); if (currentLobby.HasValue) { Debug.Log($已加入大廳: {currentLobby.Value.GetData(name)}); // 監(jiān)聽大廳內(nèi)事件 currentLobby.Value.OnChatMessage OnLobbyChatMessage; currentLobby.Value.OnLobbyMemberJoined OnMemberJoined; } } private void OnLobbyChatMessage(Lobby lobby, Friend friend, string message) { Debug.Log($[大廳聊天] {friend.Name}: {message}); } private void OnMemberJoined(Lobby lobby, Friend friend) { Debug.Log(${friend.Name} 加入了大廳。); // 可以向新成員同步游戲狀態(tài) } // 搜索大廳 public async void SearchPublicLobbies() { var query SteamMatchmaking.LobbyList; // 獲取查詢器 query query.WithSlotsAvailable(1) // 還有空位 .WithKeyValue(mode, Deathmatch) // 篩選模式為“死亡競賽” .FilterDistanceClose(); // 只搜索距離近的基于 Steam 網(wǎng)絡(luò)位置 var lobbies await query.RequestAsync(); // 執(zhí)行異步查詢 foreach (var lobby in lobbies) { Debug.Log($找到大廳: {lobby.GetData(name)}, 玩家: {lobby.MemberCount}/{lobby.MaxMembers}, 地圖: {lobby.GetData(map)}); } } }大廳 vs 直接 P2P對于需要匹配、有明確房間概念的游戲如 MOBA, 合作闖關(guān)使用大廳更合適。對于直接 IP 連接或通過其他方式發(fā)現(xiàn)主機(jī)的游戲如一些沙盒游戲P2P 更直接。大廳系統(tǒng)還內(nèi)置了通過 Steam 好友邀請的功能集成度更高。6. 調(diào)試、問題排查與性能優(yōu)化即使按照教程操作在實(shí)際開發(fā)中你仍可能遇到各種問題。這里總結(jié)一些常見坑點(diǎn)和解決方案。6.1 常見問題排查表問題現(xiàn)象可能原因排查步驟與解決方案初始化失敗SteamClient.IsValid為 false1. Steam 客戶端未運(yùn)行。2. 當(dāng)前登錄的 Steam 賬戶沒有該 AppId 的許可開發(fā)時(shí)未使用測試 AppId 480。3. 原生庫文件 (steam_api.dll等) 缺失或放錯(cuò)位置。4. 平臺(tái)設(shè)置Unity 中 DLL 的導(dǎo)入設(shè)置錯(cuò)誤。1. 確保 Steam 客戶端已啟動(dòng)并登錄。2. 開發(fā)階段使用 AppId 480 進(jìn)行測試。3. 檢查redistributable_bin文件是否在輸出目錄或 Unity 的Plugins文件夾中。4. 在 Unity 中仔細(xì)檢查每個(gè)平臺(tái)特定 DLL 的導(dǎo)入設(shè)置見 2.2 節(jié)。5. 查看 Unity 編輯器日志或 Windows 事件查看器尋找加載 DLL 失敗的錯(cuò)誤信息。成就解鎖了但 Steam 客戶端不顯示1. 沒有調(diào)用SteamUserStats.StoreStats()。2. 成就的 API 名稱拼寫錯(cuò)誤。3. Steamworks 后臺(tái)的成就配置未發(fā)布處于“待處理”狀態(tài)。4. 網(wǎng)絡(luò)問題導(dǎo)致上傳失敗。1. 確保在SetAchievement或SetStat后調(diào)用了StoreStats()。2. 雙重檢查代碼中的成就 API 名稱與后臺(tái)設(shè)置完全一致。3. 在 Steamworks 后臺(tái)將成就配置從“待處理”改為“已發(fā)布”。4. 調(diào)用StoreStats()后可以監(jiān)聽OnUserStatsStored回調(diào)來確認(rèn)上傳成功。云存檔不同步1. 玩家在 Steam 設(shè)置中禁用了云存檔。2. 游戲未在 Steamworks 后臺(tái)啟用云存檔功能。3. 存檔文件大小超過配額。4. 文件讀寫路徑或名稱錯(cuò)誤。1. 使用前檢查SteamRemoteStorage.IsCloudEnabledForApp和IsCloudEnabledForAccount。2. 登錄 Steamworks 后臺(tái)在“應(yīng)用管理”-你的游戲-“功能”中啟用“Steam 云”。3. 調(diào)用CheckCloudQuota()檢查并優(yōu)化存檔大小。4. 使用SteamRemoteStorage.FileExists驗(yàn)證文件是否存在。P2P 連接失敗或收不到數(shù)據(jù)1. 沒有在Update中調(diào)用SteamClient.RunCallbacks()。2. 沒有處理OnP2PSessionRequest或拒絕了請求。3. 雙方網(wǎng)絡(luò)存在嚴(yán)格的 NATSteam 中繼也失敗。4. 發(fā)送的數(shù)據(jù)包過大超過 1 MB。1. 確保RunCallbacks()被定期調(diào)用。2. 實(shí)現(xiàn)OnP2PSessionRequest回調(diào)并在此處接受連接。3. 這是網(wǎng)絡(luò)環(huán)境問題可以提示玩家檢查網(wǎng)絡(luò)或嘗試使用 Steam 的游戲服務(wù)器Dedicated Server。4. 大文件應(yīng)分片發(fā)送。Steam 建議單個(gè) P2P 包不超過 1200 字節(jié)以獲得最佳性能。在 Unity Editor 中運(yùn)行正常打包后崩潰1. 原生庫文件沒有正確包含在構(gòu)建中。2. 平臺(tái)相關(guān)的 DLL 導(dǎo)入設(shè)置錯(cuò)誤。3. 腳本后端Mono vs IL2CPP或 API 兼容級別不匹配。1. 確保Plugins文件夾及其內(nèi)容在構(gòu)建時(shí)被包含。2. 為每個(gè)目標(biāo)平臺(tái)Win, Mac, Linux單獨(dú)構(gòu)建并確認(rèn)對應(yīng)平臺(tái)的 DLL 設(shè)置正確。3. 對于 IL2CPP確保所有原生庫都有正確的 ARM64/x86_64 版本。在 Player Settings 中仔細(xì)檢查配置。6.2 調(diào)試與日志Facepunch.Steamworks 內(nèi)部提供了調(diào)試信息輸出。你可以訂閱Dispatch.OnDebugCallback來查看內(nèi)部日志這對排查復(fù)雜問題非常有幫助。private void EnableSteamDebugLogs() { Dispatch.OnDebugCallback (type, message) { // type 可以是 Debug, Message, Warning, Error 等 if (type NetDebugOutput.Error) { Debug.LogError($[Steamworks] {message}); } else { Debug.Log($[Steamworks] {message}); } }; }6.3 性能優(yōu)化建議RunCallbacks()的頻率在 Unity 的Update中調(diào)用是標(biāo)準(zhǔn)的但如果你游戲的幀率極高如 200 FPS可以考慮每幀或每幾幀調(diào)用一次因?yàn)?Steamworks 回調(diào)處理不需要那么高的頻率。但絕不能長時(shí)間不調(diào)用。網(wǎng)絡(luò)數(shù)據(jù)包大小如前所述保持 P2P 數(shù)據(jù)包小巧。對于狀態(tài)同步只發(fā)送變化的數(shù)據(jù)并使用差分壓縮。統(tǒng)計(jì)與成就更新避免每幀調(diào)用SetStat。對于頻繁變化的統(tǒng)計(jì)如當(dāng)前位置可以在本地累積定期如每秒更新一次到 Steam。對于成就只在條件達(dá)成時(shí)觸發(fā)一次。異步操作Facepunch.Steamworks 大量使用了 C# 的async/await模式。確保你的異步方法有適當(dāng)?shù)漠惓L幚肀苊馕刺幚淼漠惓?dǎo)致沉默的失敗。內(nèi)存管理像SteamUGC.Query返回的Ugc.Item集合可能很大使用后及時(shí)處理或釋放對它們的引用特別是當(dāng)處理大量創(chuàng)意工坊物品時(shí)。集成 Steamworks 是一個(gè)系統(tǒng)工程從初期的文件配置到核心功能開發(fā)再到后期的調(diào)試優(yōu)化每一步都需要耐心和細(xì)心。Facepunch.Steamworks 這個(gè)開源庫以其優(yōu)秀的 C# 原生 API 設(shè)計(jì)為我們掃清了許多障礙。希望這篇教程能幫助你順利地將 Steam 的強(qiáng)大功能融入你的游戲?yàn)橥婕規(guī)砀暾⒏缃换挠螒蝮w驗(yàn)。如果在實(shí)際開發(fā)中遇到本文未覆蓋的特定問題多查閱 Facepunch.Steamworks 的 Wiki 文檔和 Valve 的官方 Steamworks 文檔結(jié)合調(diào)試日志大部分問題都能找到解決方案。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷丁香五月天综合东京热| 91精品人| 一本大道不卡一二三区| 久久久九97| 日韩av情韩国爱禁区av一区二区| 在线免费观看高清无码视频| 国产成自自拍在线观看| 天堂中文资源在线bt| 99久久com免费视频′| 玖玖爱伊人玖玖爱| 少妇xx精品| 欧美72网页| 中英熟女操女| 久久的网站啊啊啊啊啊| 免费a v| 国语国产操逼伊人AV网| 国产熟女自拍| 日韩 欧美 另类 人妻| 久久久av爱| 边做饭边操逼逼| 中文字幕一区av| 国产日本顶级一区二区三区| www.久久超碰| 四虎884a| 97超碰碰| 噜噜噜狠狠色综合| 91 丝袜在线播放| 精品一区二区三区蜜桃臀赵总 | 亚洲成人在线乱码色午夜| 国产91av在线播放| 成人A片男人的天堂| 午夜精品久久久久久久久久久久久 | 四虎影视在线| 欧美精品23| 情色av电影| 天堂69亚洲精品中文字| 欧美熟妇操操视频| 亚欧无码在线| 色香网| 国模少妇一区二区三区| 美女十八禁| 亚洲一区中文字幕一区| 青青草在线视频播放器| 99热精品在线观看| 久久久久久性爱免费视频| 久久乐| 啊啊嗯嗯好爽| 午夜天堂精品久久| 人干人人人操人人摸| 秋霞鲁丝午夜无码一区二区三| 国产第25页在线观看| 男女香蕉一区二区| 99啪啪| 亚洲欧美人妻| 久久最新视频免费观看| 97人人操人人摸人人爱| 加勒比aⅴ| 天天综合AV| 淫荡少妇免费| 日本视频在线中文字幕| 日韩天天本| 91艹B视频| 台湾佬中文娱乐网久久久久久久久久com | 一区二区三区免费视频入口| 日韩人妻丝袜美腿中文| 精品区9| 无码人妻精品一区二区中文| 美女91网| 99色婷婷中文字幕乱色| 色色色综合网| 色婷婷视频| 综合欧美亚洲| 天天操天天7| 久久久一热在线播放| 日韩Va亚洲va欧美Ⅴa久久| 日韩电影中文字幕| 97碰碰日本乱偷人妻中文的| 67914在线精品观看| 色小视频蜜乳| 小视频玖玖| 国产传媒日韩欧美| 亚洲第一男人天堂| 国产精品乱码久久久久久| 日本天天吊| 偷窥自拍A片| 国产高清无码一区三区二区| 国产精品久久久啊| 在线免费观看高清无码视频| 亚洲在线观看| 天天操天天7| 欧美爆操91| 欧美日韩成人在线| av无码精品久久久久| 亚洲97综| 久久久性爱| 日本免费一区二区不卡| 一区二区 电影 亚洲| 婷婷五月花| 国产人妻天天干精品| 亚洲国产一区二区日韩专区| 欧美激情久操网| 日本二三四区| 欧美色交| 亚洲天天天| 国产欧美后入| 欧美亚洲成人在线一区二区三区| 鸥美插入视频| 亚洲色9| 亚洲中文制服诱惑| 亚洲天天艹| 日韩女模中文造逼| 青青操狠狠撩| 亚洲精品第一| 欧美v亚洲v日韩v最新在线二区| 亚洲成aⅴ人片不卡无码| 久久大黄片| 偷拍 亚洲 欧美| 九九九九一区| 精品无av| 久久69| 日本精品一区二区不卡| 亚洲精品久久久久毛片A片拉屎 | 粉嫩国产精品久久久| 骚货人妻偷情自拍在线视频| 亚洲高潮少妇| 亚洲国产第一页综合视频| 91超级碰碰碰| 麻豆人妻精品一区二区| 亚洲综合春色| 欧美一区二区日韩传媒搭讪精品| 亚洲色图欧美色图制服丝袜| 任我爽在线视频免费观看| 青青草色插素人| 日日日色色色色色| 亚洲AV色图一区| 丝袜美腿91| 超碰97久| 日韩人妻丝袜中文字幕| 国产精品免费久久久久久久久久| 国产乱伦亚洲| 黄片无码在线制服| 婷婷导航| 九月AV| 加勒比伊人综合| 学生妹天天看| 91狠狠综| 精品国产91av一区二区三区| 大香蕉碰碰| 久久欧美按摩999| 精品久久99| 啊啊啊不要好爽日韩无码一区| 蘋果手機免費看成人Av| 欧美图片校园春色| 成人毛片免费| aaaa少妇高潮大片| 3571色综合一区二区二区| 青青草自拍视频在线播放| 艳尻美人妻| 久草线上视频免费看| 加勒比综合88| 奇米狠999| 无码伊人久久大杳蕉中文无码| 婷婷丁香五月综合| 亚洲日韩青青草色月| 曰韩香蕉97| 狠狠躁伊人中文字幕| 免费岛国一级片| 三级特黄60分钟播放| 亚洲四虎熟女精品| 久久熟女人| 我中文字幕6区| 男人天堂2019| 巨爆乳一区二区爆乳区| 九九热免费视频| 少妇69中文| 成人草草视频| 高清一区AV无码| av中文在线| 久久爱超碰网| 天天草天天日| 久久老子无码午夜伦不卡| 日本九九久久99播| 97超碰国产亚洲精品| 日韩欧美加勒比| 岛国视频免费在线观看| 9热9热综合网| 麻豆一区二区AV天美| 欧美五十路熟| 高凊专区人人操| 日韩国产九九精品一区二区三区毛片| 亚洲一区在线观看欧洲| 六月激情网| 插入粉嫩少妇视频| av在线播放国产一区| 操操啪| 久啪| 久久伊人亚洲AV无码网站| 狠狠操狠狠| 国产第二页| 91在线免费精品视频| 日韩无码专区| 精人妻无码一区二区三区伊人直播| 精品欧美老熟女一二区| 五月天婷婷综合网| 四虎影视国产精品| 激情综合二| 久久神马影院| 欧美日韩另类在线播放| 肉丝网站91| 欧美色图综合网| 韩国一级婬片A片AAAAA| 97视频在线视频| 国产成人精品必看| 另类av综合久久| 欧洲性爱无码区| julia高潮后不停追击中出| 免看60秒涩涩视频| 日本一级二级三级网站| 亚洲图片视频小说| 国产成人自拍视频在线| 精品丰满熟妇人妻一区| 91天堂色男人的天堂| 无码人妻精品一区二区三区九九| 久久91精品国产9丨久久分亭| 精品视频专区| 中文字幕一区二区三区字幕| 欧洲亚洲人妻无码中字久久三区四区| 视频国产成人精品日本亚洲18| 亚洲色图久久精品蜜| 超碰吊日色| 欧美精品999| 蜜臀网址在线| 色五月婷婷网| 91亚洲欧洲| 日本三级久| 老熟妇91| 91麻豆天美国产| 日日干天天干夜夜爽| 情色五月天久久久| 亚欧日韩成人| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 91精品国产91久久青草| 少妇诱惑视频| 欧亚乱色熟女一区二区| 九一国产精品| 久久香蕉影院| 搡老女人老91妇女老熟女| 国产精品麻豆成人AV艾秋| 操人妻视频| 欧美亚洲综合色| 日本一区不卡| 色眯眯av| 在线只有精品| 狠狠婷婷亚洲中文综合久久| 成人在线视频一区| av日韩在线观看电影| 成人区人妻精品一| 天堂蜜桃无码视频一区二区| 天天射天天| 殴洲老熟女| 操逼片中文| 漂亮人妻被强中文字幕hd| 欧美夜夜狠| 欧美大香蕉久| 射丝袜大香蕉| 五月丁香啪啪| 国精精品无码一二三区水多多| 久久人妻一区二区三区高清| 曰韩欧美国产传媒麻豆第一区| 亚洲熟伦熟妇AV无码春色| 伦理弟一页| 大香蕉九九| 日韩肏逼视频| 亚州Av天美传媒| 欧日韩不卡视.频| 9国产超碰| 亚洲精品久久久久久| 99热这里| 黑丝自慰喷水网站| 91伊人| 亚州熟妇精品| av天天在线观看| 亚洲激情综合另类男同| 美女啊啊啊啊啊啊| 国产丸一视频| 大香蕉AV丝袜| 色香色欲天天综合网天天来吧| 综合网 欧美| 欧美日韩亚洲五月天婷婷| 狠狠爱综合| 欧美探花网| 一区二区影视| 天天操天天日青青草超碰av| 丝袜综合色图| 首页亚洲国产高跟丝袜诱惑视频| 伊人女女资源在线观看| 干我久操| 懂色av一区二区三区天美传媒| 天天超级碰碰碰| 青青草日逼视频| 人妻熟女av国产网站| 日韩熟女操逼| 精品人妻中文字幕高清| 亚洲少妇视频| 成人草草视频| Aa东京男人的天堂| 久神马| 久久综合日韩亚洲欧美| 99综合| 岛国艾薇凹凸视频天堂| av无线看| 最新av网站在线观看| 亚洲性天堂| 中文字幕免费看| 在线黄色污污网站| 偷拍亚洲高清图片| 精品久久久av| 亚洲无套久久嗯嗯| 五月综合色| 国产AV高清AV无码| 日韩AC| 夜夜影视四色| 蜜桃视频成a人v在线| 日韩性爱啪啪视频| 天天综合网91| 日日超碰亚洲| 青娱乐休闲视频在线观看| 97在线视频免费看| 国产精品久久久久久久久久久久| 欧美在线大香999| 97超碰这里只有精品| 国产乱码精品久久久久久| 99re3这里只有精品| 欧美老熟另类| 一区二区不卡| 亚洲在高跟鞋自慰久久在色线| 日韩伦理久 久久 清纯| 厕所偷拍在线| 中文字幕88av在线| 东北老女人的激情视频| 久久久久久久久久久999| 黄总AV色图| 国产视频一区二区三区久久亚洲天堂 | 91精品国久久久久久无码| 久久精品72| 人人澡综合涩| 欲色啪| 乱色老一区二区三区的观看方式| 热久久无毒不卡| 黄久久| 一区二区三区一亚洲中文字幕、综合区灬| 国产97av| 欧美日韩在线小说 | 超碰79人人乐| 久久九七| 哑洲在线| 久久春色| 摸奶性爱视频网站在线免费播放| 亚洲欧洲综合成人av一区| 欧美一级久久久久久久大片动画 | 欧美少妇性乱| 青青草原av| 熟女人妻一区二区三区免费看 | 啊啊啊啊好大好硬啊啊啊啊啊| 亚洲麻豆18发?| 素人伊尹大香蕉免费下载视频| 国产美女高潮视频| 97干在线| 中文字幕一区二区三区高清| 国产强上视频在线观看| 五月婷婷激情网| 久悠悠av| 91AV天美在线视频| 色香综合| 人人操肉肉| 一区二区娱乐网站| 人人妻人人操人人乐| 麻豆精品A片免费观看| 97国产伦理| 91 综合网| 尤物av网站免费在线播放| 自怕偷自怕亚洲精品| 牛牛aV| 97精品一二区| 超碰到97情色| 久久午夜色播影院免费高清| 播播亚洲小说亚洲| 女同亚洲欧美一二三区久久电影| 性交一区二区在线播放| 亚洲人天堂| 99精品视频在线观看免费| 久久色情| 中文字幕一区二区三四五区日日骚| 精品无人区麻豆乱码1区2区图片| 国产自制av蜜乳| 蜜乳AV一区二区三区四| 欧美精品在线观看| 五月天婷婷社区| 亚洲国产精品无码AV久久久| 色色丁香| 亚欧美综合网。| 亚洲天堂男人的天堂| 操高情无码| 很黄很污的免费网站| 久久中久文96| 国产精品点击进入在线影院| 天天透伊人| 亚洲欧美变态| 日韩熟女乱伦中出| 99999精品视频| 久久久久久99999国产精品| 手机午夜电影神马久久| 激情综合五月婷婷| 精品无码产区一区二| 精品国模无码| 丝袜美腿诱惑亚洲欧美视频在线观看 | 少妇熟女一区二区三区| 国产亚洲精品美女久久久m| 男人天堂站| 男人综合网| 精品性爱一区二区| 91影视亚洲| 成人免费视瓶| 四虎永久在线精品免费网址| 国产美女高潮视频| 蜜乳性色无码专日粉嫩骚逼AV| 欧美性,亚州色| 亚洲天天操| www.色操逼| 91欧美性| 神马久久久久久伦理片| 综合天天网| 人人操 欧美| 欧插网站| 成年无码动漫av片无尽在线| 欧美天天拍| 精品天堂| 精品超碰中文在线| 日韩精品一区二区人人人| 无码视频黄色网战| 99视频自拍区| 日韩人妻一区二区精品| julia ann久久| 亚欧成人中文字幕一区| 青青伊人这里只有精品| 久久久精品无码亚免费| 国产中文日韩欧美一区二区三区人妻丝袜美腿| 亚洲国产精品有声| av天天在线| 在线看的av| 亚洲国产麻豆一区二区三区| 亚州久久9| 免费啪啪av| 欧美熟妇操操视频| 欧美黄色大片在线观看 | 国产精品成人无码a v毛片| 久久仑合| 草草网站影院白丝内射| 国产成人啪一区二区| 欧洲一级性爱视频在线观看| 久久精品无码熟妇一区二区三区视频导航 | 中文字幕在线观看丝袜| 91亚洲欧洲| 天天影视综合网欧美精品| 亚洲男人的天堂va亚洲男人社| 男人的天堂啪啪啪啪啪蜜桃不卡| 俞拍久久国应视频| 日韩三级久久久| 国产精品人妻无码久久久互動交流| 亚洲AV无码天美传媒一区| 看全色黄大色大片免费视频| 一区二区三区日韩欧美 | 天天躁日日躁xxxxx| 欧美极品色| 免费黄色片子| 日韩无码极品| silk lablo在线观看一区二区| 亚洲精品啪视频| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 欧美色道啊| 色婷婷综合视频| 视频不卡中文字幕| 久久精品老司| 日本岛国黄色网址| 久久久精品| 亚洲情色在线| a网站免费观看| 综合伊人网12色| 国产1727欧美| 欧美九9 9 9| 国产视频一区二区三区在线免费观看| 国产精品大屁股999| 日韩精品国产精品五码一区二区| 日本一区二区三区免费观看| 精品久操| 中文字幕免费观看| 色色色99| 久久无码一区二区二三区性色| 欧美日韩亚洲电影| 极品五月天噜噜| 国产最新小视频在线播放下载 | 色色无码| 色狠狠 - 百度| 日韩一卡二卡三卡| 日韩三级一区| 美女t无毒不卡不卡| 青娱乐av在线| 国产精品熟女丝袜一区二区| 国产无码精品成人| 88在线一区二区三区| 啪啪91| 户外裸露刺激视频第一区| 97爱综合| 99精品综合久久久久五月天| 安徽熟妇视频| 精品人妻伦一二三区久久| 久久无码一区二区二三区性色| 超碰97.com| 国产偷仑| 91久久精品国产| 国产无码一二三区| 两女互慰AV高潮喷水在线观看| 伊人性在线视频| 少妇69中文| 女人的久久久| 亚洲综合另类| 白嫩国模丰满一二三区| 色欲av一区二区三区蜜芽| 猛猛干| 亚洲骚男同com| 亚洲第一色页夜| 99久久com免费视频′| 国产精品亚洲免费| 亚洲欧美日韩精品久久久一区二区 | 日韩性爱免费观看视频| 日本女人久久久| 热热色AV| 中文无线日韩一区| 60秒免费小视频| 丝袜狠狠草尤物人妻av91| 五月色综合| 人、人、摸,人、人、草| 精品国产一区二区三区香蕉欧美| 人人操人人摸avav| 神马久久久久| 久久中出| 天天综合亚洲综合| 97chaopengongkai| 性欧美91| 日本大香蕉综合网| 人人操人人肉久久精品| 男人的天堂com| 成人九九| 操一对老熟妇爽上天视频| 婷婷精品国产欧美精品亚洲人人爽| 亚洲美女色图| 精品人妻一区二区乱码一区二区| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 99操碰| 91麻豆va国产精品| 国产成人网站在线观看| 狠狠爱综合| www久| 99婷婷| 亚洲nv男人的天堂网| 天天日夜夜| 精品久久視頻在线| 日韩成人色图| 免费9 1久久| 抽插爽| 综合欧美日韩在线| 国产精品第一页国产大屁股视频免费区i| 韩国国产欧美情侣视频在线| 九草九九九| 国产久9| 91国产丝袜白虎| 久久久91| 老司机福利青青草| 8x福利精品第一福利视频导航| 中文字幕,人妻,日韩| 久久黄色性爱视频| 久操精品网| 女优视频第10页| 亚洲成人一二三区| 小骚逼被操的爽不爽| 伊人久久亚洲色欲综合网站| 久9爱精品| 久久久久国产精品久久久| 999久久久免费精品国产牛牛| 国产精品露脸在线观看| 日本五十路熟女一区二区| 综合色色婷婷| 色精品极品| 啊好爽快点-国产一区二区三区撒尿在线-成人AV | 亚洲春色一区二区三区| 欧美性爱第一区| 亚洲经典啪啪| 亚洲国产综合久久天堂| 国产成人精品午夜福利| 精品一区二区三区18| 探花视频免费观看国产专区| 国产精品久久久久久无码红治院| 欧美久热| 欧美少妇性乱| 欧美se综合| 影音先锋每日最新资源在线观看| 成人免费福利在线观看| 亚洲色图超碰在线| 久久一本大香蕉 | 天天爽夜夜操| 性色av一区二区| 成人一二三区| αⅴ天堂| 日韩精品.久久精品.AV女优.天美传媒| 亚洲永久永久永久永久一级一级一级精品| 国产自偷| 天天躁日日躁成人字幕aⅴ| 久久草在线综合视频| 久热久一区二区三区| 中精品一区二区三区| 草草草视频在线免费看| 久久草在线综合视频| 曰本精品久久久| 四虎影视国产精品| 伊人精品久久网站| 伊人影院中文字幕| 亚洲综合色在线| 精品日韩人妻精品一二三区| 色色五月婷婷| 蜜乳av一区二区三区| 欧洲性爱无码区| 97婷婷色| 欧美在线干| 国产探花日韩援交| 国产精品青青草| 欧日韩一二三f区| 欧美αv.com| 91女网站| 亚州色综合| 国产精品久久久久久久久AV大片| 蜜臀久久在线视频| 婷婷伊人五月| 久久久蜜桃一区二区三区| 天天天做天天天爱天天天爽| 久久青青草原免费视频| 快点操死我| 九九碰九九爱97超| 久久婷婷五月天| 97超碰欧美手机在线| 九月丁香婷婷色| 欧美色图私拍91| 大学生美女口爆| 九月丁香| 欧美性第1页| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 红桃视频高潮| 国产精品九九九| 91美女中出| 99少妇| 97人人超| 中国91AV| 综合色久| 96久久久久久久| 99热自拍| 91精品久久久久| 五月天啪啪| 中文字幕乱妇免费视频| 日本一级黄色电影| 91热| 五月丁香色综合| 人爽不卡视频| 920日本午夜免费| 好爽视频在线观看| 91 刺激在线| 中国少妇啪啪视频| 日韩久久三区| 欧美在线91| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 国产精品一区二区黄片| 久久成人东京热人妻| 国产亚洲国产超碰| 操熟女91| 美女黄页| 最新av中文字幕高清| 久久、1234| 强奸乱伦AV网站| 日韩黄色小说| 91狠狠综合久久久久久| 97色碰| 一个人在线看的黄色电影网站| 精品国产三级av韩国在线| 黑人中出21连凳花野真衣| 国产Av超碰| 91精品又粗又猛又爽| 精品一二三区久久AAA片| 中文字幕国产| 天美国产三级传媒| 国产丝袜美女在线一区| 欧美亚洲se91| 欧美日韩第一页| 97干97色| 金典av| 国产成人在线观看综合| 天天噜| 久久精9| 色噜噜人妻丝袜a∨先锋影| 久久精品国产亚洲粉嫩| 日日天天久久啊啊aaa| 日韩图区 偷拍| 99这里只有精品| 亚洲天堂另类美腿| 中文字幕日韩人妻视频一区二区三区 | 亚洲色人妻综合| 国产乱色国产精品免费视| 少妇熟女视频一区二区三区| 麻豆60秒| 岛国大片在线观看网站入口| 大香蕉懂9| 91色噜噜狠狠| 免费毛片在线播放| 欧美人与动性人交a| 香蕉大久久久| 蜜桃精品一区二区三区ww| 岛国黄色短视频| 91欧美综合| 精品久久大胆人体| 婷婷五月天成人| 成人av影院在线观看| 超碰97日韩| 伊蕉97蜜桃97狠狠综合干| 久/久精品99看9| 日韩欧美大力操| 国产又粗又长又大的视频| 情色五月天久久久| 天天综合网站| 国语国产操逼伊人AV网| 操国产高清| 91精品婷婷国产综合久久| 嫩草 人人网精品| 120分钟婬片免费看| 91精品久久久久五月天精品| 日日骚中文字幕| 久久久久人| 日本999精品视频| 99精品在线| www黄片免费看com| 日韩黄色片子| 日韩小电影| 日本97久久| 超碰天天操| 成人影 天天操 亚洲| 免費黃色視頻觀看一| 黄片国产精品一区二区| 欧美亚洲| 国产丝袜啪啪| 9997se| 伊人精品视频| 东北女人av| 天天操夜夜操| 性爱av网站| 午夜福利在线合集| 日韩高清黄片| 亚洲欧美一区二区网址| 欧美乱欲| 超碰97男女| 欧美第五页| 综合一区二区影视| 久久99精品国产| 91亚州欧美| 精品人妻二区三区| 加勒比无码一区二区三区| 丁香九月激情啪| 囯产操逼片| 国语国产操逼伊人AV网| 精品欧美А∨无码黑人大荫蒂| 综合伊人网12色| 免费a v| 丰满人妻一区二区三区| 校园春色亚洲色图| 日韩大香蕉AV影片| 久操频道免费在线呗看| 就去色综合| 日韩欧美中文字幕搭讪巨乳美人妻视频| 亚洲s色图| 男人的天堂日韩| 国产女人9999| 亚洲熟女偷拍在线观看| 婷婷15月天青娱乐| 成人热久久精品| 97久久免费| 美女诱惑在线一区| 91少妇香蕉久久精品| 久神马| 免费看国产大AB| 亚洲女人毛茸茸91| 亚州五月| 啊啊啊免费| 亚洲欧美综合| 欧美精品69性爱| 在线人成亚洲视频免费观看| 免费av在线播放二区| 亚川综合视频| 日韩乱伦影音先锋| HEYZO高无码国产精品227| 日本精品不卡一二三区| 99久久综合网| 偷拍 精品另类 凸凹了四区| 高凊专区人人操| www.99热在线只有精品| 中文字幕AV片| 91蜜桃传媒精品久久久一区二区| 91白虎| 三上悠亚在线毛片91| 少妇熟女1区2区3区| 婷婷丁香九月| 国产极品一区二区三区三州| 久久色情| 禁止观看美女黄| 一区| 久久婷婷苹果| 97爱爱| 欧美一区二区三区入口| 狠狠激情综合狠狠操中文字幕| 丁香五月影院| 蜜臀久久99精品久久久久免费观| 使劲用力艹少妇视频一区二区| 亚洲素人综合| 看全色黄大色大片免费视频| 高清国产成人无码| 国产欧美日韩在线不卡第一页| 色性综合| 日影院久久婷婷夜夜网| 亚洲综合嫩| 国内精品嫩模A∨私拍小视频| 中文字幕乱在线伦视频中文字幕乱码在线| 日韩成人大片一区二区| 欧美激情总合网| 久久99草| 亚州男人天堂| 日本免费中文字幕在线| www.久久| 高跟伊人julia ann| 97爱爱官网| 一本色道综合久久欧美| 亚洲av强奸乱伦| 快点操死我| 91亚洲狠狠色| 中国AAAAAA黄色片| 99久久久无码国产精品性男| 久久久久久久久久久久久9999| 国产性爱欧美性爱在线| 校园春色 欧美| 久草国产在线视频| 欧美日韩色图片| 嗯嗯啊啊日韩精品| 襙一襙| 久久五月综合| 久久99草| 国产h小视频在线观看免费| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 欧美久久九九| 亚洲中文字幕一区| 免费看片黄| h在线看免费版在线看| 国产久久一区二区| 最新日本中文字幕| 亚洲人妻av| 久热大香蕉网站| 无码137片内射在线影院| 9久热| 尤物视频偷拍免费| 黄色操人| 97色在线观看| 日韩99999| 久久AV无码网址| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 2019天天干天天操| 中文字幕55555| 日本一二区不卡| 六月色色| 亚洲伊人青青草| yellow网站免费观看日韩高清无码| 久久久久性熟视频| 春色综合网| 巨爆乳肉感一区二区三区竹菊影视| 欧美97视频| 亚洲欧洲无码bt精品合集| 国产高清1234区| 热热色中文无码| av在线资源| 九九九久| 国产懂色精品国产av| 综合久久99亚洲人妻中文在线| 日韩无码视频黄色| 日韩AV中文字幕电影| 久久91| 国产伦精品一区二区三区视频女| 9美女超碰在线免费观看| 国产亚州高清国产拍精| 亚洲网污污污污| www亚洲免费| 10000部十八禁看电影| 国产亚洲福利第一页丝袜| 97舔舔| 91亚洲欧美| 东北黄色电影| 国产在线视频午夜精华在 | 色老汉色| 成人av福利在线观看| 欧美五区| 激情 欧美 亚洲 小说| 综合亚洲情色| 超碰在线人妻中文字幕| 夜夜操夜夜爽夜夜高潮| 欧洲在线性爱视频| 亚洲综合888| AA级电影三区| 亚洲一本色码中文字幕| 看大黄色大片原件| 走光一区92下载| 国产精品一二三在线看| 青青草国产一区二区三区| 国产吞精a级片激情电影| 亚洲做性| 欧美成人都市人妻| 一区二区三区视频| 男人干美女| av天堂精品久久| 呦女网站| 91人妻PORNY九色大屁股| 欧美一级二级三级| 亚洲色图久久成人| www熟女乱伦com| 欧美天堂超碰97| av在线免费一区二区| 91美女高潮| 可以免费观看的av| 91网站18| 九九久久99| 99久久婷婷丁香| 女人的天堂大香蕉网| 午夜精品久久久久久久99蜜桃一| 少妇久久久久久| 日本不卡码黄色| 日本三级一区二区 在线| 肉丝无码中文高清| 9久热| 日本色色色网站免费看不卡| 精品小视频在线| 黄色一级视| 人妻丝袜日本| 男插女青青影院| 五月天玖玖资源站| 东京热毛片177b2viP| 国产精品91ai| 自拍大香蕉乱插| 老熟女网站| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 日日操免费视频| 久久久九精品| 深夜操逼网| 成人无码在线超碰网| 欧美综合自拍亚洲综合图| 欧美淫穴| 强奸乱伦Av网| 蜜臀视频网站| 国产一区二区久久| 亚洲第一综合| 蜜乳av一区二区| 一二三区精品视频| av麻豆啪啪| 思思热在线观看| 啪啪视频亚洲第一 | 精品亚洲天堂| www.91欧美| 天天爽天天干| 岛国网址国产| 色香AV| 夜夜嗨免费视频| 亚洲成人一二三区| 亚洲精品三| ji熟女.com| 人妻丝袜一区二区三区在线| 区二区亚洲婷| 久久久久精| 精品性爱一区二区| 天天夜躁日日躁狠狠2002| 极品出轨视频网站| 怡春苑东京热| 97人肏| 一区在线国产播放| 日韩黄色av中文字幕| 91欧美经典| 亚州欧美综合| 青久操| 大香蕉男女超碰精品在线| 老司机射| 免费1级a做爰片观看| 天美传媒精品一区二区| 一本大道久| 韩日巨乳美女免费视频在线观看| 欧美熟爽综合| 丁香五月婷婷啪啪| 强歼乱伦资源网| 五十路六十路七十路熟婆| 亚洲久久久久| 国产激情在线| 人澡逼| 97 九色| 国产人伦精品一区二区三区| 无码99| 亚洲AV成人在线| 一级特级aaaa毛片免费观看| 一级二级三级黑人无码| 欧美97| 91亚洲电影| 久久精品国产亚洲粉嫩| 精久久久| 亚洲。天堂。日本在线观看| 麻豆一区在线| 97色97好| 青青草视频久久久久| WWW4虎| 好湿好紧好爽 视频| 理论久久婷婷网 8| 99性爱| a久久| www.狠狠| 丁香五月天啪啪| AV电影在线播放| 大香蕉乱伦视频网| 亚洲一区二区三区欧美日韩| 国产女人极品高潮毛片| 欧美性爱91| 久久久久久日韩| 亚洲熟女精品| 国产极品精品美女视频| 乱伦一二三区| 国产精品99精品视频网站| 亚洲成人黄色在线观看| 乱伦熟女论坛| 波多野结衣之双飞调教在线播放| 2020久久免费视频| 青春草莓视频在线观看网址| 国产女大学生AV| 一级毛片电影免费看| 欧美不卡五十路| 亚洲巨爆乳一区二区三区四季网| 欧美精品成人一区二区在线观看| 九九九九热| 人人操人人爽人人操人人| 欧美成年人性爱视频免费观看| 思思热在线视频在线| 久操操AV电影| 亚洲av综合色| 人、人、摸,人、人、草| 亚州操逼网| 五月丁香婷婷综合| 国产精品老熟女一区二区| 啊啊啊啊啊在线观看网址| 爱欲AV| 啊好爽快点-国产一区二区三区撒尿在线-成人AV | 久久色精品视频在线| 中文字幕三四区| 欧美日韩午夜精品一区二区三区| 国产女同视频在线播放| 午夜福利精品| 日韩av乱伦| 色妺妺在线视频| 91夜夜蜜桃臀1区2区3区| 亚洲素人网| 男人天堂毛片| 国产精品久久久 | 人妻乱仑一区二区三区| 久久 国产精品 一区| 天天添天天干电影| 少妇人妻精品| 97欧美色综合| 欧美激情区| 青青免费在线视频一区 | 日韩精品人妻中文字有码在线| 国产熟女自拍| 天天做天天爱| 99视频这有这里有精品| 97任你吞精| 青青草密桃在线播放| 九一精品牛牛一区二区| 午夜视频久久久| 亚洲中文字幕在线视频一区二区| 人人潮人人摸| 婷婷中文字幕| 色欲人妻一区二区在线| 天天性射网| 天天草天天日| 欧美劲爆视频一区二区| 精品久久久无码| 久久少妇人妻| 日韩9区| 久久直播国产| 香蕉在线一区二区三区| 97资源免费视频| 丰满人妻-区二区三区免费看 | 久思思热视频在线观看| 婷婷丁香五月综合| 人妻大相焦在线| 男人的天堂VA| 欧美性爱无码一区二区三区| 五月天色图| 无码人妻精品一区二区三区九九| 国产精品久久久亚洲第一牛牛_在线观看| 亚洲精品一二牛牛| 超碰人人草| 日韩精品怡红院| 97超碰中文在线| 国产精品成人无码av无码免费| 少妇蜜汁| 麻豆一区二区三区在线看| 国产Av超碰| 男人天堂久久精品| 韩日自拍| 日韩激情毛片一级久久久| 九九热在线视频| 国产和美国毛片| 欧美巨大性舒爽顶到了| 国产67194| 96久久久精品| 日本精品一级二级三级| 五月天大香蕉| 操淫穴亚洲五月丁香| 亚洲高清视频在线免费观看| 亚洲精品国产精品乱码不99| 伊人一区二区三区| 97亚洲综合| 99色综合| 2020中文字幕在线| 乱伦一区二区三区‘| 中文字幕国产精品1区| 天天干人妻视频| 人人操,操人人| 嗯嗯啊好大| a片自拍直播视频| 天天干美少妇一区| 青青草一本道福利视频| av在线免费一区二区| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 国产精品一区二区亚洲人成毛片| 天堂蜜桃无码视频一区二区| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 无码又爽又硬又激情免费视频| 欧美亚洲国内自拍| 久久九九97| 国模精品娜娜一二三区| 9 9无尺码天堂网| 飘花国产午夜精品不卡| 夜夜操av亚洲一区二区| 天美传媒精品一区二区| 人妻少妇视频在线播放| 国产精品另类| 99久久99九九99九九九| 欧美色图片欧美色图|