UE4虛幻引擎VR交互多人游戲體驗(yàn)
來源:
52vr |
責(zé)任編輯:傳說的落葉 |
發(fā)布時(shí)間: 2019-06-04 08:20 | 瀏覽量:
最近Helios開展了一個(gè)為期僅僅兩周的內(nèi)部項(xiàng)目,旨在讓研究人員熟悉在UE4中創(chuàng)建多玩家虛擬現(xiàn)實(shí)程序的過程。由于HTC Vive有足夠的游戲空間并具備運(yùn)動(dòng)控制器,所以它被選為實(shí)驗(yàn)的VR硬件。研究組將分別把玩家放置在不同的游戲場(chǎng)地,但是他們體驗(yàn)的虛擬場(chǎng)景是一樣的,他們同時(shí)進(jìn)行游戲并且積累游戲經(jīng)驗(yàn)。此實(shí)驗(yàn)的目的是促進(jìn)玩家在相同的虛擬世界中的互動(dòng)與競(jìng)爭(zhēng)。另外,研究人員還會(huì)在HTC Vive控制器觸摸板里添加一些簡(jiǎn)單的命令,因?yàn)樵谟螒驎r(shí)兩個(gè)玩家可能會(huì)爭(zhēng)奪同一個(gè)fireflies,此時(shí)并不能保證他們都能聽見相關(guān)指令,所以研究人員想到運(yùn)用表情符號(hào),或創(chuàng)造一些顏色和燈光信號(hào),好讓玩家能進(jìn)行簡(jiǎn)單的交流。
為了完成以上實(shí)驗(yàn),我們必須深入研究Unreal現(xiàn)有的網(wǎng)絡(luò)功能。不負(fù)眾望,Unreal具有非常出色的單擊聯(lián)網(wǎng)功能,并且所有actors都具有基礎(chǔ)功能,比如“復(fù)制”指令能讓服務(wù)器端的指令能快速復(fù)制到所有相關(guān)的客戶端。不難發(fā)現(xiàn),Unreal有非常完善的網(wǎng)絡(luò)系統(tǒng),這個(gè)系統(tǒng)具有良好的記錄和實(shí)施指令的能力,但是他們比VR更關(guān)注傳統(tǒng)游戲。
一個(gè)典型的傳統(tǒng)游戲中,玩家只能在任意時(shí)間觀察某一特定空間的情況,但是如果加入VR的話,您就能同時(shí)觀察好幾個(gè)空間并且切換到不同的玩家的視角?,F(xiàn)在玩家的頭和雙手獲得了解放,但是如果身體保持靜止的話是無法實(shí)施指令的,所以還要想出辦法控制所有的復(fù)制指令。
必須銘記這一點(diǎn),因?yàn)閺?fù)制指令只能從服務(wù)器發(fā)到客戶端??蛻舳吮仨氄{(diào)用服務(wù)器RPC來更新變量或組播,然后才能復(fù)制到客戶端。這點(diǎn)將在以后的項(xiàng)目總結(jié)中深入討論。
第一步
第一步連接兩個(gè)機(jī)器:
除了一些允許添加其他控制器的室內(nèi)VR組塊外,藍(lán)圖能用于整個(gè)項(xiàng)目。藍(lán)圖能讓您縱觀整個(gè)項(xiàng)目,讓您親眼看到復(fù)制指令和網(wǎng)絡(luò)系統(tǒng)是如何運(yùn)行的。
當(dāng)用Unreal創(chuàng)建多人游戲時(shí),需要設(shè)置在線子系統(tǒng)。這些子系統(tǒng)可以是Steam,Playstation Network或XBox Live。但是,如果設(shè)置為“null”,系統(tǒng)會(huì)默認(rèn)為L(zhǎng)AN。要設(shè)置在線子系統(tǒng),您必須進(jìn)入您的Project.Build.cs,并對(duì)注釋過的在線子系統(tǒng)取消備注。接下來,您必須將“OnlineSubsystemNull”添加到PublicDependencyModuleNames。
充分利用Epic的Learning 內(nèi)容,并從現(xiàn)有的“多人射擊”范例中復(fù)制粘貼所有的在線Blueprints代碼。這一引用對(duì)Unreal該如何開始游戲,加入游戲,處理錯(cuò)誤和其他網(wǎng)絡(luò)問題等有很大幫助,也完美的展示了游戲模式—OnPostLogin是如何工作以及如何被應(yīng)用的。
連接機(jī)器
兩臺(tái)機(jī)器連接好以后,就要開始在從兩臺(tái)機(jī)器間獲取數(shù)據(jù)。這些信息的獲取通常被描述為“黑客方式”,因?yàn)樗撕芏鄰?qiáng)制實(shí)施指令,并給LAN帶來很大負(fù)擔(dān)。雖然它完全不能優(yōu)化任何東西,也沒有充分利用Unreal的網(wǎng)絡(luò)功能,比如復(fù)制的變量,但是這些信息既穩(wěn)定又行之有效。要想完整了解所有的復(fù)制方法,請(qǐng)參閱Unreal的復(fù)制文檔。
以下步驟適用于所有需要復(fù)制的內(nèi)容。在這個(gè)例子中,我們將使用HMD的位置和方向指令,因?yàn)樗鼈兪菑?fù)制到其他客戶端的關(guān)鍵:
相信客戶端。有關(guān)欺騙因素不是這個(gè)項(xiàng)目的關(guān)注點(diǎn),我們選擇信任客戶端傳送到服務(wù)器的一切。所以不需要進(jìn)行預(yù)測(cè)。
通過event圖表劃分服務(wù)器和客戶端。在你的所有需要被復(fù)制actors中創(chuàng)建一個(gè)名為“服務(wù)器”的新的event圖表,并將服務(wù)器端的功能加入該圖表中。這個(gè)圖表能幫您追蹤哪些功能正在哪里運(yùn)行。
將所有相關(guān)數(shù)據(jù)發(fā)送到服務(wù)器。復(fù)制需要使用由“Run on Server”復(fù)制的custom event。您可以通過您的客戶端把所有您想復(fù)制的數(shù)據(jù)傳到這個(gè)新的event,,比如HMD的事件,位置和循環(huán)。
從服務(wù)器組播一切。服務(wù)器的工作就是,從所有連接的客戶端上調(diào)出最合適的 “組播”event,在此基礎(chǔ)上轉(zhuǎn)播前一步驟的數(shù)據(jù)。只有服務(wù)器可以調(diào)用組播功能,而這也是客戶端首先將數(shù)據(jù)發(fā)送到服務(wù)器的原因。
最后,多播服務(wù)器會(huì)將數(shù)據(jù)發(fā)送給每個(gè)客戶端,所以所有客戶端都會(huì)接收數(shù)據(jù),并能進(jìn)行位置和循環(huán)更新?,F(xiàn)在,所有相關(guān)的actors都根據(jù)實(shí)踐中用戶的輸入,或頭部的移動(dòng)完成了相應(yīng)的更新。
注意事項(xiàng)
IsLocallyControled:最后,您要確保自己始終都是使用IsLocallyControlled來確保您只從玩家的pawn,而不是從本地存儲(chǔ)的其他遠(yuǎn)程pawn來發(fā)送數(shù)據(jù)。Pawn類的一個(gè)實(shí)例是它被復(fù)制到客戶端來表示另一個(gè)玩家,所以代碼被運(yùn)行到您的本地Pawn而不是'ghost' pawn(另一個(gè)玩家)。運(yùn)行IsLocallyControlled,可以確保我們只發(fā)送客戶端數(shù)據(jù),而不是“ghost”pawn數(shù)據(jù)。如果不這樣做的話會(huì)系統(tǒng)會(huì)一片混亂。
我們的fireflies是僅給客戶端提供位置和循環(huán)復(fù)制的服務(wù)端。這給LAN增加了大量的額外數(shù)據(jù)。理想情況下,fireflies是確定的,本地的。
充分利用PlayerState。所有連接的客戶端的PlayerStates都可用于游戲模式(僅限服務(wù)器),這使得它成為存儲(chǔ)分?jǐn)?shù)或生命值的最佳地點(diǎn)。它能確保在游戲模式下檢測(cè)到玩家是否達(dá)到獲勝分?jǐn)?shù)或是否死亡等訊息時(shí),系統(tǒng)能做出及時(shí)的反應(yīng)。
測(cè)試
現(xiàn)在在服務(wù)器和客戶端上我們有一些actors,并且它們都是復(fù)制的,我們需要對(duì)它們進(jìn)行測(cè)試,不得不說,這很困難。您不能在同一臺(tái)機(jī)器上測(cè)試兩個(gè)客戶端。 HMD不支持一次被兩個(gè)應(yīng)用程序使用,性能很快就會(huì)變得非常差(每秒只有半幀)。 我們使用Listen服務(wù)器來開始程序。這允許主機(jī)在扮演服務(wù)器的同時(shí)正常工作,并在調(diào)試時(shí)給予我們更多的控制權(quán)限。
您還會(huì)遇到很多“服務(wù)器已更新但客戶端沒有”等類型的問題。這是因?yàn)橥婕也焕斫釻E4的服務(wù)器—客戶端在網(wǎng)絡(luò)模式下工作方式,而不是UE4代碼的問題。您只需要花點(diǎn)時(shí)間去多關(guān)注一下有關(guān)復(fù)制及其應(yīng)用方式的相關(guān)知識(shí),就能解決這個(gè)問題了。
VR多人游戲每次都需要兩位開發(fā)人員進(jìn)行測(cè)試。您曾經(jīng)嘗試過戴著兩個(gè)HMD并且揮舞著四個(gè)運(yùn)動(dòng)控制器么?沒有?我也是。
不能通過編輯器來測(cè)試多人游戲。如果兩個(gè)開發(fā)人員分別都在編輯地圖(即使是相同的版本),但是如果嘗試使用PIE,兩人就會(huì)獲得不同的地圖版本,因?yàn)閮蓚€(gè)編輯器的客戶端都會(huì)生成相應(yīng)的PIE版本地圖。
解決辦法就是不要使用“單機(jī)”,因?yàn)閱螜C(jī)不適合用VR!但若您必須用VR Preview,就又得回去解決PIE不匹配的問題。
解決方法還有不要使用“Launch”。盡管這個(gè)指令能做好并啟動(dòng)磁盤中的內(nèi)容,它卻會(huì)允許HMD的連接。但幸好它只會(huì)打開壓縮包,或啟動(dòng)編輯器打開的當(dāng)前內(nèi)容。
所以VR的解決辦法是:您需要熟悉項(xiàng)目生成的“虛幻前端”。此工具允許用戶自定義游戲的制作和部署過程。
最重要的一點(diǎn)是,“項(xiàng)目啟動(dòng)器”在編輯器中“啟動(dòng)”的下拉菜單里。
項(xiàng)目啟動(dòng)器允許您創(chuàng)建“自定義啟動(dòng)配置文件”,您可以選擇“By the Book”這一項(xiàng),然后在其中選擇需要的配置文件和地圖。
構(gòu)建Shipping
在線子系統(tǒng)默認(rèn)平臺(tái)服務(wù)—Null
最后完成項(xiàng)目的所有傳送,并將其部署在幾臺(tái)機(jī)器上進(jìn)行播放測(cè)試。必須確保在構(gòu)建之前將[OnlineSubsystem] DefaultPlatformService = Null放入DefaultEngine.ini文件中。 沒有這個(gè)您的游戲?qū)⒔⒃跊]有一個(gè)定義好的OnlineSubsystem上,并將無法進(jìn)行網(wǎng)絡(luò)連接。
項(xiàng)目總結(jié)
某種程度上來說這個(gè)項(xiàng)目是成功的,因?yàn)槲覀兡軌蚋惺艿皆谔摶靡?中創(chuàng)建多玩家虛擬現(xiàn)實(shí)體驗(yàn)的復(fù)雜性。我們了解了玩家之間溝通的重要性,即使是通過表情符號(hào)進(jìn)行簡(jiǎn)單溝通也會(huì)帶來不一樣的游戲體驗(yàn)。另一個(gè)重要點(diǎn)是玩家的身體反饋,我們授予玩家用螢火蟲網(wǎng)攻擊他人的能力,同時(shí)被打擊的玩家身上會(huì)出現(xiàn)一個(gè)愚蠢的表情符號(hào)。即使一個(gè)簡(jiǎn)單的復(fù)活節(jié)彩蛋也能增強(qiáng)游戲的體驗(yàn)性。這使得玩家感覺他們確實(shí)處于同一個(gè)游戲世界。沒有它的話,玩家雖然可以看到對(duì)方,但會(huì)感到有些不足,會(huì)破壞了體驗(yàn)的沉浸性。
實(shí)驗(yàn)最大的花銷是就是過多的測(cè)試費(fèi)用。對(duì)開發(fā)人員和質(zhì)量保證團(tuán)隊(duì)來說這個(gè)測(cè)試實(shí)在太耗時(shí)了,這一點(diǎn)就足以打亂整個(gè)項(xiàng)目的時(shí)間表。但是如果沒有足夠的測(cè)試,一個(gè)項(xiàng)目很快就會(huì)陷入混亂。所以我們?cè)谶@兩周的時(shí)間里竭盡全力的設(shè)法完成了大量的測(cè)試工作,我們希望與未來的客戶分享這個(gè)concept piece,希望為粉絲,用戶和客戶提供充分的相關(guān)知識(shí)。
為了完成以上實(shí)驗(yàn),我們必須深入研究Unreal現(xiàn)有的網(wǎng)絡(luò)功能。不負(fù)眾望,Unreal具有非常出色的單擊聯(lián)網(wǎng)功能,并且所有actors都具有基礎(chǔ)功能,比如“復(fù)制”指令能讓服務(wù)器端的指令能快速復(fù)制到所有相關(guān)的客戶端。不難發(fā)現(xiàn),Unreal有非常完善的網(wǎng)絡(luò)系統(tǒng),這個(gè)系統(tǒng)具有良好的記錄和實(shí)施指令的能力,但是他們比VR更關(guān)注傳統(tǒng)游戲。
一個(gè)典型的傳統(tǒng)游戲中,玩家只能在任意時(shí)間觀察某一特定空間的情況,但是如果加入VR的話,您就能同時(shí)觀察好幾個(gè)空間并且切換到不同的玩家的視角?,F(xiàn)在玩家的頭和雙手獲得了解放,但是如果身體保持靜止的話是無法實(shí)施指令的,所以還要想出辦法控制所有的復(fù)制指令。
必須銘記這一點(diǎn),因?yàn)閺?fù)制指令只能從服務(wù)器發(fā)到客戶端??蛻舳吮仨氄{(diào)用服務(wù)器RPC來更新變量或組播,然后才能復(fù)制到客戶端。這點(diǎn)將在以后的項(xiàng)目總結(jié)中深入討論。
第一步
第一步連接兩個(gè)機(jī)器:
除了一些允許添加其他控制器的室內(nèi)VR組塊外,藍(lán)圖能用于整個(gè)項(xiàng)目。藍(lán)圖能讓您縱觀整個(gè)項(xiàng)目,讓您親眼看到復(fù)制指令和網(wǎng)絡(luò)系統(tǒng)是如何運(yùn)行的。
當(dāng)用Unreal創(chuàng)建多人游戲時(shí),需要設(shè)置在線子系統(tǒng)。這些子系統(tǒng)可以是Steam,Playstation Network或XBox Live。但是,如果設(shè)置為“null”,系統(tǒng)會(huì)默認(rèn)為L(zhǎng)AN。要設(shè)置在線子系統(tǒng),您必須進(jìn)入您的Project.Build.cs,并對(duì)注釋過的在線子系統(tǒng)取消備注。接下來,您必須將“OnlineSubsystemNull”添加到PublicDependencyModuleNames。
充分利用Epic的Learning 內(nèi)容,并從現(xiàn)有的“多人射擊”范例中復(fù)制粘貼所有的在線Blueprints代碼。這一引用對(duì)Unreal該如何開始游戲,加入游戲,處理錯(cuò)誤和其他網(wǎng)絡(luò)問題等有很大幫助,也完美的展示了游戲模式—OnPostLogin是如何工作以及如何被應(yīng)用的。
連接機(jī)器
兩臺(tái)機(jī)器連接好以后,就要開始在從兩臺(tái)機(jī)器間獲取數(shù)據(jù)。這些信息的獲取通常被描述為“黑客方式”,因?yàn)樗撕芏鄰?qiáng)制實(shí)施指令,并給LAN帶來很大負(fù)擔(dān)。雖然它完全不能優(yōu)化任何東西,也沒有充分利用Unreal的網(wǎng)絡(luò)功能,比如復(fù)制的變量,但是這些信息既穩(wěn)定又行之有效。要想完整了解所有的復(fù)制方法,請(qǐng)參閱Unreal的復(fù)制文檔。
以下步驟適用于所有需要復(fù)制的內(nèi)容。在這個(gè)例子中,我們將使用HMD的位置和方向指令,因?yàn)樗鼈兪菑?fù)制到其他客戶端的關(guān)鍵:
相信客戶端。有關(guān)欺騙因素不是這個(gè)項(xiàng)目的關(guān)注點(diǎn),我們選擇信任客戶端傳送到服務(wù)器的一切。所以不需要進(jìn)行預(yù)測(cè)。
通過event圖表劃分服務(wù)器和客戶端。在你的所有需要被復(fù)制actors中創(chuàng)建一個(gè)名為“服務(wù)器”的新的event圖表,并將服務(wù)器端的功能加入該圖表中。這個(gè)圖表能幫您追蹤哪些功能正在哪里運(yùn)行。
將所有相關(guān)數(shù)據(jù)發(fā)送到服務(wù)器。復(fù)制需要使用由“Run on Server”復(fù)制的custom event。您可以通過您的客戶端把所有您想復(fù)制的數(shù)據(jù)傳到這個(gè)新的event,,比如HMD的事件,位置和循環(huán)。
從服務(wù)器組播一切。服務(wù)器的工作就是,從所有連接的客戶端上調(diào)出最合適的 “組播”event,在此基礎(chǔ)上轉(zhuǎn)播前一步驟的數(shù)據(jù)。只有服務(wù)器可以調(diào)用組播功能,而這也是客戶端首先將數(shù)據(jù)發(fā)送到服務(wù)器的原因。
最后,多播服務(wù)器會(huì)將數(shù)據(jù)發(fā)送給每個(gè)客戶端,所以所有客戶端都會(huì)接收數(shù)據(jù),并能進(jìn)行位置和循環(huán)更新?,F(xiàn)在,所有相關(guān)的actors都根據(jù)實(shí)踐中用戶的輸入,或頭部的移動(dòng)完成了相應(yīng)的更新。
注意事項(xiàng)
IsLocallyControled:最后,您要確保自己始終都是使用IsLocallyControlled來確保您只從玩家的pawn,而不是從本地存儲(chǔ)的其他遠(yuǎn)程pawn來發(fā)送數(shù)據(jù)。Pawn類的一個(gè)實(shí)例是它被復(fù)制到客戶端來表示另一個(gè)玩家,所以代碼被運(yùn)行到您的本地Pawn而不是'ghost' pawn(另一個(gè)玩家)。運(yùn)行IsLocallyControlled,可以確保我們只發(fā)送客戶端數(shù)據(jù),而不是“ghost”pawn數(shù)據(jù)。如果不這樣做的話會(huì)系統(tǒng)會(huì)一片混亂。
我們的fireflies是僅給客戶端提供位置和循環(huán)復(fù)制的服務(wù)端。這給LAN增加了大量的額外數(shù)據(jù)。理想情況下,fireflies是確定的,本地的。
充分利用PlayerState。所有連接的客戶端的PlayerStates都可用于游戲模式(僅限服務(wù)器),這使得它成為存儲(chǔ)分?jǐn)?shù)或生命值的最佳地點(diǎn)。它能確保在游戲模式下檢測(cè)到玩家是否達(dá)到獲勝分?jǐn)?shù)或是否死亡等訊息時(shí),系統(tǒng)能做出及時(shí)的反應(yīng)。
測(cè)試
現(xiàn)在在服務(wù)器和客戶端上我們有一些actors,并且它們都是復(fù)制的,我們需要對(duì)它們進(jìn)行測(cè)試,不得不說,這很困難。您不能在同一臺(tái)機(jī)器上測(cè)試兩個(gè)客戶端。 HMD不支持一次被兩個(gè)應(yīng)用程序使用,性能很快就會(huì)變得非常差(每秒只有半幀)。 我們使用Listen服務(wù)器來開始程序。這允許主機(jī)在扮演服務(wù)器的同時(shí)正常工作,并在調(diào)試時(shí)給予我們更多的控制權(quán)限。
您還會(huì)遇到很多“服務(wù)器已更新但客戶端沒有”等類型的問題。這是因?yàn)橥婕也焕斫釻E4的服務(wù)器—客戶端在網(wǎng)絡(luò)模式下工作方式,而不是UE4代碼的問題。您只需要花點(diǎn)時(shí)間去多關(guān)注一下有關(guān)復(fù)制及其應(yīng)用方式的相關(guān)知識(shí),就能解決這個(gè)問題了。
VR多人游戲每次都需要兩位開發(fā)人員進(jìn)行測(cè)試。您曾經(jīng)嘗試過戴著兩個(gè)HMD并且揮舞著四個(gè)運(yùn)動(dòng)控制器么?沒有?我也是。
不能通過編輯器來測(cè)試多人游戲。如果兩個(gè)開發(fā)人員分別都在編輯地圖(即使是相同的版本),但是如果嘗試使用PIE,兩人就會(huì)獲得不同的地圖版本,因?yàn)閮蓚€(gè)編輯器的客戶端都會(huì)生成相應(yīng)的PIE版本地圖。
解決辦法就是不要使用“單機(jī)”,因?yàn)閱螜C(jī)不適合用VR!但若您必須用VR Preview,就又得回去解決PIE不匹配的問題。
解決方法還有不要使用“Launch”。盡管這個(gè)指令能做好并啟動(dòng)磁盤中的內(nèi)容,它卻會(huì)允許HMD的連接。但幸好它只會(huì)打開壓縮包,或啟動(dòng)編輯器打開的當(dāng)前內(nèi)容。
所以VR的解決辦法是:您需要熟悉項(xiàng)目生成的“虛幻前端”。此工具允許用戶自定義游戲的制作和部署過程。
最重要的一點(diǎn)是,“項(xiàng)目啟動(dòng)器”在編輯器中“啟動(dòng)”的下拉菜單里。
項(xiàng)目啟動(dòng)器允許您創(chuàng)建“自定義啟動(dòng)配置文件”,您可以選擇“By the Book”這一項(xiàng),然后在其中選擇需要的配置文件和地圖。
構(gòu)建Shipping
在線子系統(tǒng)默認(rèn)平臺(tái)服務(wù)—Null
最后完成項(xiàng)目的所有傳送,并將其部署在幾臺(tái)機(jī)器上進(jìn)行播放測(cè)試。必須確保在構(gòu)建之前將[OnlineSubsystem] DefaultPlatformService = Null放入DefaultEngine.ini文件中。 沒有這個(gè)您的游戲?qū)⒔⒃跊]有一個(gè)定義好的OnlineSubsystem上,并將無法進(jìn)行網(wǎng)絡(luò)連接。
項(xiàng)目總結(jié)
某種程度上來說這個(gè)項(xiàng)目是成功的,因?yàn)槲覀兡軌蚋惺艿皆谔摶靡?中創(chuàng)建多玩家虛擬現(xiàn)實(shí)體驗(yàn)的復(fù)雜性。我們了解了玩家之間溝通的重要性,即使是通過表情符號(hào)進(jìn)行簡(jiǎn)單溝通也會(huì)帶來不一樣的游戲體驗(yàn)。另一個(gè)重要點(diǎn)是玩家的身體反饋,我們授予玩家用螢火蟲網(wǎng)攻擊他人的能力,同時(shí)被打擊的玩家身上會(huì)出現(xiàn)一個(gè)愚蠢的表情符號(hào)。即使一個(gè)簡(jiǎn)單的復(fù)活節(jié)彩蛋也能增強(qiáng)游戲的體驗(yàn)性。這使得玩家感覺他們確實(shí)處于同一個(gè)游戲世界。沒有它的話,玩家雖然可以看到對(duì)方,但會(huì)感到有些不足,會(huì)破壞了體驗(yàn)的沉浸性。
實(shí)驗(yàn)最大的花銷是就是過多的測(cè)試費(fèi)用。對(duì)開發(fā)人員和質(zhì)量保證團(tuán)隊(duì)來說這個(gè)測(cè)試實(shí)在太耗時(shí)了,這一點(diǎn)就足以打亂整個(gè)項(xiàng)目的時(shí)間表。但是如果沒有足夠的測(cè)試,一個(gè)項(xiàng)目很快就會(huì)陷入混亂。所以我們?cè)谶@兩周的時(shí)間里竭盡全力的設(shè)法完成了大量的測(cè)試工作,我們希望與未來的客戶分享這個(gè)concept piece,希望為粉絲,用戶和客戶提供充分的相關(guān)知識(shí)。
-
分享到:
相關(guān)文章
網(wǎng)友評(píng)論
您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)
關(guān)閉
- 用戶名:
- 密 碼:
- 驗(yàn)證碼: 看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評(píng)論:0條
推薦
熱門