最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

[VRChat] Udon 網(wǎng)絡(luò)(同步)概述

2023-08-11 03:29 作者:Misaka-L  | 我要投稿

總覽

多人游戲體驗(yàn)是 VRChat 的核心,所以創(chuàng)建一個(gè)可以和玩家互動(dòng)并在玩家間同步數(shù)據(jù)的世界是創(chuàng)建世界的金科玉律。

這個(gè)頁面介紹了驅(qū)動(dòng)我們的網(wǎng)絡(luò)系統(tǒng)的概念。當(dāng)你理解了這些基礎(chǔ)內(nèi)容,你就可以深入了解以下內(nèi)容了:

  • 網(wǎng)絡(luò)組件 (Network Components):?https://creators.vrchat.com/worlds/udon/networking/network-components

  • 網(wǎng)絡(luò)系統(tǒng)限制和竅門?(Network Specs and Tips):?https://creators.vrchat.com/worlds/udon/networking/

總覽:Udon 的網(wǎng)絡(luò)系統(tǒng)是怎么工作的

· 譯者注:源文檔此處有一個(gè)嵌入視頻,但是沒有搬運(yùn)到嗶哩嗶哩,Youtube 源鏈接:https://www.youtube.com/watch?v=Mb6ZYBEhxiI

Udon 網(wǎng)絡(luò)系統(tǒng)的三個(gè)主要概念分別為 變量(Variables)、事件(Events)所有者(Ownership)

  • 變量(Variables)是數(shù)值的容器 - 比如說一個(gè)數(shù)字,一組顏色或者一個(gè) 3D 位置。

  • 事件(Events)發(fā)生在某一時(shí)刻的某事。

  • 所有權(quán)(Ownership)是系統(tǒng)用來決定由哪個(gè)用戶負(fù)責(zé)更新一個(gè)變量,該用戶會(huì)將變量的更新發(fā)送給其他用戶。

比如說一個(gè)游戲的計(jì)分板,你可能會(huì)使用一個(gè)變量(Variable)來存儲(chǔ)和更新用戶的分?jǐn)?shù),還會(huì)有一個(gè)事件(Event)來觸發(fā)為勝利者慶祝的煙花。

所有權(quán)(Ownership)

一個(gè)世界里的物體在默認(rèn)情況下都是本地的。這說明你拿起來的一個(gè)物體只會(huì)為你移動(dòng),其他人是看不到物體在移動(dòng)的。

要讓一個(gè)物體可以被網(wǎng)絡(luò)同步(Networked),你需要給物體添加一個(gè) UdonBehaviour?和/或者 一個(gè)?VRC Object Sync 組件。

例子:最簡(jiǎn)單的網(wǎng)絡(luò)同步物體

如果你有一個(gè)有渲染器(Renderer)和碰撞體(Collider)的 3D 物體,你可以非常簡(jiǎn)單的讓這個(gè)物體可以被玩家拿起并使其與其他玩家同步。

你需要做的就是在其 GameObject添加一個(gè)?VRCPickup 組件和一個(gè)?VRCObjectSync?組件。

VRC Pickup 和 VRC Object Sync 在 Unity Editor 里的樣子

如果物體沒有剛體(RightBody)那么?VRCPickup 組件會(huì)自動(dòng)添加一個(gè)并向 VRChat 表示這個(gè)組件可以被撿起,還會(huì)將該物體的所有權(quán)(Ownership)轉(zhuǎn)移給撿起該物體的玩家。

VRCObjectSync 會(huì)自動(dòng)同步這個(gè)物體 - 發(fā)送該物體的位置(Position),旋轉(zhuǎn)(Rotation),縮放(Scale)和一些物理屬性給其他玩家,這樣子這個(gè)物體在所有人眼里看起來都是一致的。如果需要同步其他數(shù)據(jù),你就需要使用變量(Variables)了。

變量(Variables)

一個(gè)變量是一個(gè)數(shù)值的容器。而?UdonBehaviours 會(huì)運(yùn)行 Udon 程序,你可以給這些 Udon 程序添加變量。

Udon Graph 里的變量(Variables)設(shè)置

在該圖片中,我定義了三個(gè)不同的變量(Variables),你可以看到我給 "sliderValue" 這個(gè)變量選擇了 "同步(synced)"。這個(gè) GameObject 的所有者(譯作注:就是有這個(gè) GameObject 所有權(quán)的人)會(huì)負(fù)責(zé)計(jì)算這個(gè)變量的值并將該值的更改發(fā)送給所有人。

例子:同步的滑動(dòng)條

一個(gè)顯示著讀數(shù) 0.8 的滑動(dòng)條

在這個(gè)例子中,這個(gè)滑動(dòng)條的所有者會(huì)將其值同步給所有人。請(qǐng)注意,這只是為了說明概念 - 我們會(huì)發(fā)布一個(gè)單獨(dú)的例子來說明具體 “如何做” 的細(xì)節(jié)。

為了同步這個(gè)滑動(dòng)條,我們只需要獲取它的數(shù)字值。這是個(gè)范圍從 0-1 的小數(shù),我們稱其為浮點(diǎn)值(floating point value),或者簡(jiǎn)稱浮點(diǎn)數(shù)(float)。所以我們定義一個(gè),名叫 sliderValue 的 float?類型(Type)變量(Variable)。

我們會(huì)讓滑動(dòng)條在滑塊被移動(dòng)時(shí)更新該變量的值 - 當(dāng)滑塊被移動(dòng)時(shí),我們會(huì)獲取它的新數(shù)值并以此來更新我們的變量。這個(gè)數(shù)值會(huì)被打包并發(fā)送給所有人,這個(gè)過程叫作序列化(Serialization)。其他玩家接收并解包的過程叫作反序列化(Deserialization)。

所以當(dāng)所有者移動(dòng)滑塊并設(shè)置?sliderValue 變量的值時(shí)。VRChat 也會(huì)更新其他玩家的?sliderValue?的值并觸發(fā)一個(gè)?OnDeserialization?事件。當(dāng)這個(gè)事件被觸發(fā)時(shí),他們會(huì)使用?sliderValue?的值來更新滑塊的位置和其中顯示的讀數(shù)。

  • 所有者:移動(dòng)滑塊 >?OnValueChanged 事件 > 用?UISlider.value?的值來更新?sliderValue?變量 > 更新讀數(shù)。

  • 其他人:VRChat 更新 sliderValue?變量 > 觸發(fā)?OnDeserialization 事件 > 設(shè)置?UISlider.value 的值 > 觸發(fā)?OnValueChanged?事件 > 更新讀數(shù)

事件(Events)

事件發(fā)生了,然后就消失了。不像變量(Variable)只能被所有者更新,所有人都可以觸發(fā)一個(gè)對(duì)象上的事件。你可以選擇將事件發(fā)送給所有人或者只發(fā)送給對(duì)象的所有者。這可以通過在觸發(fā)事件時(shí)設(shè)置 "target: All"?或者?"target: Owner" 來實(shí)現(xiàn)。


Udon Graph 里的發(fā)送自定義網(wǎng)絡(luò)事件(SendCustomNetworkEvent)節(jié)點(diǎn)

例子:泡泡槍

一個(gè)玩家拿著泡泡槍吐泡泡,譯者吐槽:如果你看習(xí)慣了二次元美少女或者 furry,再了看這個(gè)模型感覺真的怪怪的

這這個(gè)例子中,我們有一個(gè)有粒子系統(tǒng)和動(dòng)畫機(jī)并且可以旋轉(zhuǎn)它的泡泡棒并產(chǎn)生氣泡粒子效果的物體。我們想要其在玩家按住扳機(jī)鍵時(shí)可以被世界內(nèi)所有人看到。

在我們的 Udon Graph 中,我們有一個(gè)可以播放 "Spin(旋轉(zhuǎn))" 動(dòng)畫并觸發(fā) 22 個(gè)粒子生成的自定義事件,我們將其命名為 "Trigger"。

要讓這個(gè)泡泡可以被所有人看到,我們需要將會(huì)在玩家拿在泡泡槍時(shí)按住扳機(jī)鍵會(huì)觸發(fā)的?OnPickupUseDown?事件綁定到一個(gè) target 被設(shè)置為所有人(All)的?SendCustomNetworkEvent?事件上來觸發(fā)所有人的 "Trigger" 事件,其中也包括這個(gè)物體的所有者。

該程序的 Udon Graph

額外概念:后續(xù)加入游戲玩家

在已經(jīng)有同步發(fā)生后加入世界的玩家會(huì)發(fā)生什么?簡(jiǎn)單來說:變量會(huì)被更新同步,事件則不會(huì)。當(dāng)有人加入你的世界時(shí),OnDeserialization 事件會(huì)使用最新的數(shù)據(jù)在所有可以被網(wǎng)絡(luò)同步的對(duì)象都觸發(fā)一次,并會(huì)基于更新的數(shù)據(jù)執(zhí)行你編寫的用于更新物體的邏輯。在玩家加入前的事件則不會(huì)再發(fā)送給玩家,但是也沒有理由在有人按下扳機(jī)的一個(gè)小時(shí)后繼續(xù)發(fā)射氣泡粒子。

摘要

同步是通過變量和事件來完成的。

  • 對(duì)于變量來說:變量的所有者會(huì)更新一個(gè)可被網(wǎng)絡(luò)同步對(duì)象上的變量并發(fā)送其數(shù)據(jù)給所有可以反序列化它的其他玩家。所有加入世界的玩家都會(huì)獲取到最新的數(shù)據(jù)來進(jìn)行反序列化。

  • 對(duì)于事件來說:所有人都可以發(fā)送一個(gè)網(wǎng)絡(luò)世界(NetworkEvent)。事件只會(huì)被發(fā)送給對(duì)象的所有者或者已經(jīng)加入世界的其他人。

示例包

UdonNetworkingConcepts.unitypackage (https://assets.vrchat.com/sdk/UdonNetworkingConcepts.unitypackage)

我們將以上三個(gè)示例都包括在了一個(gè)簡(jiǎn)單的包里,你可以將其導(dǎo)入到任何安裝了 Udon SDK 的項(xiàng)目里來查看實(shí)際運(yùn)行效果和源代碼。


第一節(jié)是 Udon 網(wǎng)絡(luò)系統(tǒng)的大致介紹。當(dāng)你認(rèn)為你可以理解這些概念并且瀏覽了上方的示例包,你可以在下方了解網(wǎng)絡(luò)系統(tǒng)的各個(gè)方面。

你可以進(jìn)行同步的不同方法

有四種不同的方式來在世界中同步變量和事件:

1. 連續(xù)同步變量(Continuous Variable)

如果你有一個(gè)變量需要持續(xù)同步,請(qǐng)使用這個(gè)方法。如果有時(shí)不更新也是正?,F(xiàn)象,這樣子可以為其他東西節(jié)省帶寬。但是依然會(huì)為后續(xù)加入的玩家同步。

例子:一棵有 size 連續(xù)(Continuous)同步變量的樹會(huì)在有人澆水時(shí)生長(zhǎng)。丟失幾個(gè)更新也是可以接受的,因?yàn)槠鋾?huì)在下一次更新時(shí)恢復(fù)到正確的位置。查看下面的使用變量(Using Variables)小節(jié)來了解更多信息。

2. 手動(dòng)同步變量(Manual?Variable)

如果你有一個(gè)變量不需要頻繁更新但需要其保持最新時(shí),請(qǐng)使用這個(gè)方法。該方法會(huì)為后續(xù)加入的玩家同步變量。這個(gè)選項(xiàng)和?Object Sync 不兼容。查看下面的使用變量(Using Variables)小節(jié)來了解更多信息。

3. 自定義網(wǎng)絡(luò)事件(Custom Network Events)

使用自定義網(wǎng)絡(luò)事件來觸發(fā)當(dāng)前實(shí)例內(nèi)所有玩家或?qū)ο笏姓叩氖录录欢〞?huì)被觸發(fā),但是會(huì)有一定的延遲和開銷。在事件發(fā)送后加入的玩家不會(huì)收到事件。使用事件(Using Variables)小節(jié)來了解更多信息。

譯者注:簡(jiǎn)單來說就是:

可靠性:自定義網(wǎng)絡(luò)事件(Custom Network Events)> 手動(dòng)同步變量(Manual Variable)> 連續(xù)同步變量(Continuous Variable)

及時(shí)性:連續(xù)同步變量(Continuous Variable)>?手動(dòng)同步變量(Manual Variable)>?網(wǎng)絡(luò)件(Custom Network Events

3. 自動(dòng)同步(Automatic)

一些 VRChat 特有的對(duì)象會(huì)被自動(dòng)同步,其中就包括:

  • Avatars(譯者注:俗稱模型):包括其碰撞體,音效和 IK 動(dòng)作(譯者注:就是骨骼的位置)

  • VRCObjectSync:包括物體的變換(Transform)(譯者注:就是物體的坐標(biāo),旋轉(zhuǎn),縮大之類的值)和剛體(Rigidbody)

對(duì)象所有權(quán)

在 VRChat 中,每時(shí)每刻每個(gè) GameObject 都會(huì)被一個(gè)玩家(VRCPlayerApi)"擁有"。只有對(duì)象的所有者才可以更改其可被網(wǎng)絡(luò)同步的 Udon 程序變量。這些更改會(huì)被同步到該實(shí)例內(nèi)的所有玩家。如果你想要一個(gè)玩家可以更改一個(gè)對(duì)象上的變量,請(qǐng)先檢查是否有示范區(qū)或者請(qǐng)求所有權(quán)。

一個(gè)對(duì)象的所有權(quán)可以通過觸發(fā) Networking.SetOwner(VRCPlayerApi player, GameObject obj)?被 Udon 程序修改。這會(huì)觸發(fā)實(shí)例中所有玩家的?OnOwnershipTransferred(VRCPlayerApi player) 事件,其中的 player 值是對(duì)該對(duì)象的新所有者的引用(Reference)(譯者注:引用是個(gè)編程上的概念,如果你不理解可以直接無視那個(gè)詞,一般來說影響不大),新的所有者可以立即修改同步變量。如果你的腳本使用手動(dòng)同步,不要忘記調(diào)用?RequestSerialization()。

請(qǐng)求所有權(quán)(進(jìn)階)

如果希望對(duì)象的所有者能夠接受或拒絕所有權(quán)轉(zhuǎn)讓,請(qǐng)?jiān)谀_本中添加事件 OnOwnershipRequest(VRCPlayerApi requester, VRCPlayerApi newOwner)。

在添加?OnOwnershipRequest() 事件到你的腳本后,你需要以下額外步驟來完成一次所有權(quán)轉(zhuǎn)移:

????1. 如同之前那樣,請(qǐng)求變更所有權(quán)的玩家必須調(diào)用?Networking.SetOwner(VRCPlayerApi player, GameObject obj) 來開始所有權(quán)轉(zhuǎn)移流程。

????????- 請(qǐng)求玩家可以為任何玩家,或者對(duì)象的所有者。如果是(先前的)所有者發(fā)起這個(gè)請(qǐng)求,可以直接跳過第 4 和第 5 步。

????????- 所有者可以把所有權(quán)給任何人,但是非所有者只能從所有者那里請(qǐng)求所有權(quán)(沒有 OnOwnershipRequest() 事件的腳本沒有這個(gè)限制)

????2.?OnOwnershipRequest(VRCPlayerApi requester, VRCPlayerApi newOwner)?會(huì)在請(qǐng)求變更所有權(quán)的玩家上被調(diào)用

????????- 請(qǐng)求變更所有權(quán)的玩家必須對(duì)請(qǐng)求返回 true。否則這個(gè)請(qǐng)求會(huì)被提前取消。(譯者注:在 Udon Graph 里,SetReturnValue? 被用于返回 true)

????3.?OnOwnershipTransferred(VRCPlayerApi player) 會(huì)在請(qǐng)求變更所有權(quán)的玩家上被調(diào)用。

????????- 這會(huì)在所有權(quán)變更請(qǐng)求被所有者確認(rèn)前被調(diào)用。所有權(quán)會(huì)被變更回去如果所有權(quán)變更請(qǐng)求被拒絕。

????4.?OnOwnershipRequest(VRCPlayerApi requester, VRCPlayerApi newOwner) 會(huì)在被請(qǐng)求的玩家上被調(diào)用.

????????- 如果所有者返回 true,所有權(quán)變更請(qǐng)求就會(huì)被接受(在 Udon Graph 里,SetReturnValue? 被用于返回 true)。

????????- 如果所有者返回 false 或者沒有返回任何值,這個(gè)所有權(quán)變更請(qǐng)求會(huì)被拒絕。OnOwnershipTransferred() 會(huì)在請(qǐng)求變更所有權(quán)的玩家上被調(diào)用,來通知其所有權(quán)依然在原始的對(duì)象所有者上。

????????- 如果發(fā)起請(qǐng)求的玩家是所有者,這個(gè)步驟會(huì)被直接跳過。新的所有者不能拒絕接受所有權(quán)。(譯者注:因?yàn)樵妓姓哂锌赡苁堑艟€或者下線了)

????5. 如果請(qǐng)求被接受了,OnOwnershipTransferred(VRCPlayerApi player) 會(huì)在原始所有者和其他玩家上被調(diào)用。

流程圖

使用變量(Variables)

使用變量來同步數(shù)據(jù)可以分為三步

1. 第一步打開冰箱門(譯者注:因?yàn)閬y玩梗譯者已經(jīng)被拉去調(diào)教了,大家就當(dāng)看無聊的文檔的時(shí)候樂呵樂呵)

1. 創(chuàng)建一個(gè)變量

2. 在所有者那里更新這個(gè)成量

3. 對(duì)從所有者那里接收到的值進(jìn)行處理

1. 創(chuàng)建變量

????1. 按下變量(Variables)窗口的?+ 按鈕

????2. 選擇你的變量的類型

????3. 重命名你的變量(雖然說是可選項(xiàng),但是強(qiáng)烈建議這么做)

????4. 點(diǎn)擊變量名旁邊的箭頭打開更多選項(xiàng),打開 "synced(同步)"。(默認(rèn)值為?"none" 是正?,F(xiàn)象,只不過代表這個(gè)變量不會(huì)自動(dòng)同步)(譯者注:原文是 this just means the value is not automatically smoothed out,我也不確定具體怎么翻譯)

2. 在所有者側(cè)更新變量

????1. 將你剛剛創(chuàng)建的變量拖進(jìn)去你的藍(lán)圖里(譯者注:原文 Graph,此處借用 UE 的名詞,因?yàn)槲也恢涝趺捶g比較好。這玩意就是你用 Udon Graph 里放和連接各種節(jié)點(diǎn)的地方)

????2. 將任意事件流程(Flow)連接到此節(jié)點(diǎn)上的流程端口(Flow Port),并將一個(gè)新值(Value)連接到數(shù)值端口(Value Port)。

????3. 如果此 UdonBehaviour 使用的是持續(xù)同步(Continuous Sync)(在檢查器中的 UdonBehaviour 上選擇),那么更新值的工作就完成了。如果使用的是手動(dòng)同步,則需要添加一個(gè) "UdonBehaviour.RequestSerialization"?節(jié)點(diǎn),并將設(shè)置變量流程端口(Variable Flow Port)的輸出連接到該節(jié)點(diǎn)的流程輸入端口(Flow Input port)。該節(jié)點(diǎn)上的 "實(shí)例(instance)" 值端口(Value Port)可以留空,它將默認(rèn)為當(dāng)前的 UdonBehaviour,這正是我們想要的。

3.?對(duì)從所有者那里接收到的值進(jìn)行處理

????1.?在同一個(gè)藍(lán)圖添加一個(gè) "OnDeserialization" 節(jié)點(diǎn)。

????2.?在不按住 Ctrl 鍵的情況下將變量(Variable)拖放到藍(lán)圖上,創(chuàng)建一個(gè) "Get Variable" 節(jié)點(diǎn)。

????3.?使用來自 OnDeserialization 節(jié)點(diǎn)的流程(Flow)和來自 Get Variable 節(jié)點(diǎn)的值(Value),用這個(gè)新值更新另一個(gè)節(jié)點(diǎn)。

請(qǐng)求序列化

該節(jié)點(diǎn)在手動(dòng)同步模式下用于標(biāo)記目標(biāo) UdonBehaviour 上的變量,以便在下一個(gè)網(wǎng)絡(luò)刻(并非每幀都會(huì)發(fā)生)期間進(jìn)行序列化。該節(jié)點(diǎn)將與 OnPreSerialization 事件節(jié)點(diǎn)協(xié)同工作。在觸發(fā) "RequestSerialization" 事件后,OnPreSerialization 事件將在下一個(gè)網(wǎng)絡(luò)刻期間觸發(fā)。此時(shí),您可以將任何變量更新為您希望同步的值。

變量同步

您可以同步以下類型的變量和變量數(shù)組:bool、char、byte、sbyte、short、ushort、int、uint、long、ulong、float、double、Vector2、Vector3、Vector4、Quaternion、string、VRCUrl、Color 和 Color32。

?? 數(shù)組同步

您可以同步以下類型的變量和變量數(shù)組:bool、char、byte、sbyte、short、ushort、int、uint、long、ulong、float、double、Vector2、Vector3、Vector4、Quaternion、string、VRCUrl、Color?和 Color32。

使用自定義事件

使用一個(gè)事件來觸發(fā)更改可以分為兩步

1. 添加一個(gè)自定義事件節(jié)點(diǎn)

2. 使用一個(gè)?SendCustomNetworkEvent 節(jié)點(diǎn)來在目標(biāo)上(Target)觸發(fā)這個(gè)事件

????1. 創(chuàng)建一個(gè) "Event Custom "節(jié)點(diǎn)。

? ? 2. 使用輸入框?yàn)樵摴?jié)點(diǎn)命名

? ? 3. 添加 "Send Custom Network Event" 節(jié)點(diǎn)

????4. 在 "eventName?"輸入框中輸入相同的事件名稱。

????5. 保留默認(rèn)的 "All(全部)"作為目標(biāo),以便在房間中的每個(gè)玩家身上觸發(fā)該事件,或者將其更改為 "Owner(所有者)",以便只在所有者身上觸發(fā)該事件。

????6. 您可以將 "instance" 輸入留空,以當(dāng)前的 UdonBehaviour 為目標(biāo),或者將引用連接到另一個(gè) UdonBehaviour,以在該?UdonBehaviour 上觸發(fā)自定義事件。

編輯器注意事項(xiàng)

SendCustomNetworkEvent 將作為編輯器中的 "SendCustomEvent" 節(jié)點(diǎn)運(yùn)行,以便進(jìn)行一些基本測(cè)試。

本地事件

如果您的事件名稱以下劃線開頭,您將無法通過網(wǎng)絡(luò)調(diào)用它們。我們這樣做是為了保護(hù) _start、_update、_interact 等內(nèi)部方法免受惡意網(wǎng)絡(luò)調(diào)用。我們計(jì)劃為事件添加一個(gè)屬性,將其標(biāo)記為 "僅限本地",而無需下劃線。如果您想在此期間阻止遠(yuǎn)程執(zhí)行事件,可以使用獨(dú)特的下劃線前綴(如 "_u_eventName"),以確保它不與任何現(xiàn)有或未來的 VRC 方法相匹配。

調(diào)試

通過使用 --enable-debug-gui 啟動(dòng)客戶端并在一個(gè)可被網(wǎng)絡(luò)同步的物體上按 [右鍵] +?[`] + [8],就可以在客戶端中查看網(wǎng)絡(luò)對(duì)象的一些信息。這些附加層會(huì)顯示網(wǎng)絡(luò) ID(NetworkId)、游戲?qū)ο竺Q、Ping 時(shí)間、數(shù)據(jù)質(zhì)量(100% 即不丟包)和游戲?qū)ο蟮乃姓摺?/p>

就是個(gè)可網(wǎng)絡(luò)同步的椅子

您可以在客戶端使用?[右鍵]?+ [`] +?[6] 以列表形式查看每個(gè)對(duì)象的一些信息:

世界內(nèi)所有可被網(wǎng)絡(luò)同步物體的列表

??已知問題

最新版本和 SDK 存在這些問題:

-?玩家加入實(shí)例時(shí)(譯者注:就是觸發(fā) OnPlayerJoined 事件的時(shí)候)?isInstanceOwner 返回 true(感謝 FSP 的反饋):https://feedback.vrchat.com/udon-networking-update/p/unu-v5-isinstanceowner-returns-true-when-spawning

- 在網(wǎng)絡(luò)更新(OnDeserialization)期間傳送玩家不會(huì)傳送玩家的模型(Avatar)。目前要解決這個(gè)問題,可使用 SendCustomEventDelayedFrames 將傳送延遲 1 幀。

[VRChat] Udon 網(wǎng)絡(luò)(同步)概述的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
梁山县| 托克逊县| 清河县| 荥阳市| 苏尼特右旗| 杂多县| 四会市| 云梦县| 武冈市| 清原| 峨边| 东丽区| 方山县| 呼和浩特市| 滦南县| 屏东县| 金坛市| 凤山县| 随州市| 亚东县| 郓城县| 成武县| 南岸区| 诸暨市| 诸城市| 华容县| 肇庆市| 元谋县| 岗巴县| 仙居县| 安图县| 西安市| 阳山县| 大新县| 钟祥市| 黄骅市| 陆川县| 布尔津县| 富裕县| 玛沁县| 寿阳县|