Unity強(qiáng)化篇(一) —— 如何使用Vuforia制作AR游戲(一)

版本記錄

版本號(hào) 時(shí)間
V1.0 2019.02.12 星期二

前言

Unity是由Unity Technologies開(kāi)發(fā)的一個(gè)讓玩家輕松創(chuàng)建諸如三維視頻游戲葵硕、建筑可視化、實(shí)時(shí)三維動(dòng)畫(huà)等類(lèi)型互動(dòng)內(nèi)容的多平臺(tái)的綜合型游戲開(kāi)發(fā)工具欺栗,是一個(gè)全面整合的專(zhuān)業(yè)游戲引擎。Unity類(lèi)似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的圖型化開(kāi)發(fā)環(huán)境為首要方式的軟件旗们。其編輯器運(yùn)行在Windows 和Mac OS X下,可發(fā)布游戲至Windows较剃、Mac纬朝、WiiiPhone掀潮、WebGL(需要HTML5)菇夸、Windows phone 8和Android平臺(tái)。也可以利用Unity web player插件發(fā)布網(wǎng)頁(yè)游戲仪吧,支持Mac和Windows的網(wǎng)頁(yè)瀏覽庄新。它的網(wǎng)頁(yè)播放器也被Mac 所支持。網(wǎng)頁(yè)游戲 坦克英雄和手機(jī)游戲王者榮耀都是基于它的開(kāi)發(fā)薯鼠。

開(kāi)始

首先看下寫(xiě)作環(huán)境

C# 6, Unity 2018.1, Unity

增強(qiáng)現(xiàn)實(shí)(AR)突然成為每個(gè)人口中的流行語(yǔ)摄咆。 感謝Vuforia,開(kāi)發(fā)人員可以通過(guò)數(shù)字內(nèi)容輕松增強(qiáng)物理世界人断。 盡管ARKitARCore的推出有助于提高增強(qiáng)現(xiàn)實(shí)的意識(shí),但許多其他平臺(tái)和SDK已經(jīng)有一段時(shí)間了朝蜘。其中之一是Vuforia恶迈;最近,Unity與Vuforia合作partnered with Vuforia
谱醇,并將AR平臺(tái)集成到Unity游戲引擎中暇仲。

在本教程中,您將使用與Unity游戲引擎集成的Vuforia SDK制作AR游戲副渴。 在此過(guò)程中奈附,您將學(xué)習(xí)以下關(guān)鍵組件:

  • 設(shè)置增強(qiáng)的相機(jī)Feed
  • 圖像跟蹤 - 它是什么以及它是如何工作的
  • 將您的數(shù)字內(nèi)容附加到物理對(duì)象
  • 創(chuàng)建由相機(jī)看到的自定義交互
  • 什么餡料最適合披薩

Developing AR Games in Unity

市場(chǎng)上有許多AR headsets,但AR應(yīng)用的主要目標(biāo)是移動(dòng)領(lǐng)域煮剧,如iOS和Android斥滤。 這是UnityVuforia的組合方便的地方 - 跨平臺(tái)開(kāi)發(fā)。 另一個(gè)好處是你可以在編輯器中測(cè)試你的應(yīng)用程序勉盅。 要做到這一點(diǎn)佑颇,您只需要一個(gè)網(wǎng)絡(luò)攝像頭!

在開(kāi)始之前草娜,請(qǐng)下載最新版本的Unity并安裝Vuforia增強(qiáng)現(xiàn)實(shí)支持組件挑胸。 如果您使用的是Unity Hub,則可以將此組件添加到已安裝的Unity版本中宰闰。

現(xiàn)在您已擁有Unity茬贵,Vuforia和網(wǎng)絡(luò)攝像頭,您需要在Unity中打開(kāi)How to Make an AR Game Using Vuforia Starter移袍。 加載項(xiàng)目后解藻,打開(kāi)Scenes文件夾中的Starter場(chǎng)景,然后查看Hierarchy窗口:

在快速查看其中的內(nèi)容后葡盗,點(diǎn)擊編輯器中的Play按鈕舆逃,準(zhǔn)備好在這個(gè)與披薩相關(guān)的游戲中完成一些訂單。

很酷,那是一些意味著披薩播放路狮,但真正的挑戰(zhàn)是把它變成AR游戲虫啥。

注意:本教程的UI資源是從shareicon.net下載的。


Introducing the Sous Chef, Vuforia

為此奄妨,您將使虛擬披薩出現(xiàn)在您可以在現(xiàn)實(shí)世界中保存的跟蹤器圖像上涂籽。 一旦你為訂單添加了toppings,你就可以通過(guò)將比薩餅移出相機(jī)的視線(xiàn)來(lái)實(shí)際“服務(wù)”比薩餅砸抛。

首先评雌,您需要將主攝像頭(Main Camera )換成AR攝像頭(AR Camera)。 從場(chǎng)景中刪除主攝像頭直焙,然后在層次結(jié)構(gòu)中右鍵單擊景东。

接下來(lái),添加Vuforia - > AR Camera奔誓。 當(dāng)你這樣做時(shí)斤吐,你會(huì)得到這個(gè)彈出窗口:

單擊Import并等待Vuforia Package導(dǎo)入到項(xiàng)目中,這會(huì)添加相當(dāng)多的文件厨喂。

您可以忽略EditorStreaming Assets文件夾中的新文件和措。那些文件只是模板文件;您需要的那些包含在項(xiàng)目中蜕煌。

Vuforia文件夾包含Vuforia平臺(tái)使用的所有預(yù)制件和腳本派阱,您將要使用這些預(yù)制件和腳本。

值得一提的最后一個(gè)文件是VuforiaConfiguration斜纪,它位于Resources文件夾中贫母。包含此文件是因?yàn)槟枰S可證才能開(kāi)發(fā)Vuforia應(yīng)用程序。但是盒刚,如果您愿意颁独,可以使用 Vuforia Developer Portal獲得免費(fèi)的開(kāi)發(fā)人員許可。

注意:如果項(xiàng)目中缺少App License Key伪冰,您可以在README文件中找到該密鑰誓酒。將字符串復(fù)制到VuforiaConfiguration文件的inspector字段中。

現(xiàn)在您已經(jīng)在場(chǎng)景中使用了AR Camera贮聂,您還需要做一件事靠柑。打開(kāi)增強(qiáng)現(xiàn)實(shí)!

轉(zhuǎn)到Edit -> Project Settings -> Player吓懈。向下滾動(dòng)到XR Settings所在的底部歼冰,并確認(rèn)已選中Vuforia Augmented Reality Supported

在編輯器中按Play耻警,并向自己打招呼隔嫡!

注意:如果您點(diǎn)擊播放并且遇到Vuforia Initialization Failed屏幕甸怕,請(qǐng)嘗試重新啟動(dòng)Unity。 這是一個(gè)只出現(xiàn)在某些系統(tǒng)上的隨機(jī)錯(cuò)誤腮恩。


Introduction to Image Recognition

我相信你看起來(lái)很可愛(ài)梢杭,但披薩游戲怎么辦?

Vuforia的默認(rèn)方式是使用圖像識(shí)別(Image Recognition)秸滴。 圖像識(shí)別武契,也稱(chēng)為跟蹤器識(shí)別或圖像跟蹤,是相機(jī)檢測(cè)預(yù)定圖像并知道如何處理它的過(guò)程荡含,例如在其上呈現(xiàn)一些內(nèi)容咒唆。 當(dāng)跟蹤圖像以某種方式匹配內(nèi)容時(shí),這最有效释液,例如全释,渲染建筑物的樓層平面圖可能在建筑物的圖片上方很好地工作。

工作原理:選擇一個(gè)好的跟蹤圖像至關(guān)重要误债。 使用Vuforia時(shí)浸船,您可以將所選圖像上傳到開(kāi)發(fā)人員門(mén)戶(hù)網(wǎng)站,以查看它的跟蹤情況找前,這是您在開(kāi)始開(kāi)發(fā)之前應(yīng)該做的事情。 開(kāi)發(fā)人員門(mén)戶(hù)網(wǎng)站為您的圖像提供評(píng)級(jí)判族,但更重要的是躺盛,它會(huì)向您顯示“特征點(diǎn)”。 對(duì)于一個(gè)好的跟蹤器形帮,這些特征點(diǎn)應(yīng)該密集地分布在圖像周?chē)鴽](méi)有重復(fù)的圖案槽惫。 在運(yùn)行時(shí),攝像機(jī)會(huì)查找這些特征點(diǎn)辩撑,以幫助計(jì)算相對(duì)于圖像的位置界斜。

對(duì)于本教程,已經(jīng)設(shè)置了圖像和跟蹤數(shù)據(jù)庫(kù)合冀。 披薩圖像文件位于您之前下載的Materials文件夾中各薇。 理想情況下,你應(yīng)該打印出來(lái)君躺。 或者峭判,您可以將它放在某個(gè)數(shù)字設(shè)備上,然后您可以“顯示”到相機(jī)棕叫。 以下是Vuforia Tracker數(shù)據(jù)庫(kù)中的圖像:

如您所見(jiàn)林螃,特征點(diǎn)的分布很好。 還有俺泣,這是披薩疗认! 這很方便完残。


Adding Image Targets to the Scene

是時(shí)候做一些魔術(shù)了! 您將使虛擬比薩餅出現(xiàn)在這個(gè)披薩的圖像上横漏。 再次使用層次結(jié)構(gòu)中的Create菜單谨设,選擇Vuforia -> Image

現(xiàn)在你將在場(chǎng)景中擁有一個(gè)Image Target GameObject绊茧。 在檢查器中查看此目標(biāo)铝宵,您將看到許多組件。 關(guān)鍵的是圖像目標(biāo)行為(Image Target Behavior)和默認(rèn)可跟蹤事件處理程序(Default Trackable Event Handler)华畏。 稍后您將深入研究第二個(gè)鹏秋,但是現(xiàn)在,請(qǐng)確保圖像目標(biāo)行為的下拉選項(xiàng)設(shè)置如下:

  • 數(shù)據(jù)庫(kù)設(shè)置為RW_ItsaPizza
  • 圖像目標(biāo)設(shè)置為PizzaClipArt

還記得我之前添加到項(xiàng)目中的文件我說(shuō)你可以忽略嗎亡笑? 你找到了他們侣夷! Vuforia為您添加了大量樣本圖像目標(biāo)數(shù)據(jù)庫(kù),以便您開(kāi)始開(kāi)發(fā)和使用他們的樣本 - 例如您將使用的樣本仑乌,已包含在材料中百拓。

注意:Pizza跟蹤器是數(shù)據(jù)庫(kù)中唯一的圖像目標(biāo);但是晰甚,您可以在一個(gè)數(shù)據(jù)庫(kù)中擁有數(shù)百個(gè)圖像衙传。 此外,您可以在一個(gè)應(yīng)用程序中擁有多個(gè)數(shù)據(jù)庫(kù)厕九。

現(xiàn)在您已經(jīng)在場(chǎng)景中設(shè)置了AR CameraImage Tracker蓖捶,您可以獲得使增強(qiáng)現(xiàn)實(shí)工作所需的一切! 按編輯器中的Play按鈕扁远,將打印的圖像保持到相機(jī)俊鱼。

在某個(gè)地方,有一個(gè)披薩畅买!

1. Attaching Game Objects as Children to the Trackers

披薩有點(diǎn)小并闲,但它跟蹤跟蹤器圖像。 您可能還會(huì)注意到谷羞,如果您將跟蹤圖像帶走帝火,比薩餅就會(huì)漂浮在那里。

這里發(fā)生的是當(dāng)您的網(wǎng)絡(luò)攝像頭可以看到跟蹤器圖像時(shí)湃缎,Vuforia可以更新場(chǎng)景中AR相機(jī)的位置购公。 如果你想看到這個(gè),你可以設(shè)置你的Unity編輯器雁歌,你可以看到GameScene視圖宏浩,并在你點(diǎn)擊play時(shí)選擇了AR Camera

那么靠瞎,如何在相機(jī)工作時(shí)讓比薩餅表現(xiàn)出來(lái)比庄?在層次結(jié)構(gòu)中選擇ImageTarget求妹。您可以看到每個(gè)軸的比例設(shè)置為10。圖像目標(biāo)行為(Image Target Behaviour)組件控制它佳窑。在高級(jí)部分中制恍,您可以看到Width參數(shù)設(shè)置為10,這是在將圖像上載到Vuforia Developer站點(diǎn)時(shí)定義的神凑。

提示:您是否想知道為什么本教程的圖像目標(biāo)的寬度為10净神?如果尺寸不是您應(yīng)用的重要因素,則將尺寸設(shè)置為10可讓相機(jī)更好地跟蹤溉委,同時(shí)在A(yíng)R相機(jī)的默認(rèn)近距離和遠(yuǎn)距離平面之間保持良好的內(nèi)容位置鹃唯。但是,有時(shí)您可能需要在某個(gè)/現(xiàn)實(shí)世界范圍內(nèi)進(jìn)行擴(kuò)充瓣喊。在這種情況下坡慌,您可以將圖像跟蹤器的大小設(shè)置為與將其上載到開(kāi)發(fā)人員門(mén)戶(hù)時(shí)的物理尺寸相匹配。

現(xiàn)在藻三,在層次結(jié)構(gòu)中選擇Pizza GameObject洪橘。將其拖到ImageTarget上以使其成為子項(xiàng)。它的規(guī)模將變?yōu)?code>(X:0.1棵帽,Y:0.1熄求,Z:0.1)。將其增加回(X:1逗概,Y:1弟晚,Z:1)并在Y軸上將其位置微調(diào)至0.01。這使得Pizza非常適合ImageTarget仗谆。

再次點(diǎn)擊Play指巡,你會(huì)發(fā)現(xiàn)披薩很適合圖像淑履,但如果隱藏圖像隶垮,它也會(huì)消失。


Exploring the DefaultTrackableEventHandler

此行為來(lái)自ImageTarget上的DefaultTrackableEventHandler秘噪。 打開(kāi)腳本并查看它狸吞。

該腳本已經(jīng)得到很好的評(píng)論,但請(qǐng)注意以下幾點(diǎn):

  • Start函數(shù)將此腳本注冊(cè)為TrackableBehaviour的事件處理程序(在本例中為ImageTargetBehaviour)指煎。
  • OnDestroy刪除該引用蹋偏。
  • OnTrackableStateChanged是關(guān)鍵函數(shù)。 這里的代碼規(guī)定了跟蹤狀態(tài)變化時(shí)應(yīng)該做什么至壤。
  • OnTrackableStateChanged調(diào)用OnTrackingFoundOnTrackingLost威始。 在DefaultTrackableEventHandler中,它們切換任何子對(duì)象上的Renderer像街,ColliderCanvas組件黎棠。

當(dāng)相機(jī)檢測(cè)到跟蹤圖像時(shí)晋渺,不僅僅是移動(dòng)AR相機(jī)了; 它還告訴Pizza GameObject打開(kāi)所有Renderer組件,當(dāng)圖像離開(kāi)相機(jī)時(shí)脓斩,它會(huì)告訴它再次關(guān)閉它們木西。

Digest that information for a moment

Making Your own Tracking Actions

是時(shí)候?qū)@些信息做點(diǎn)什么了!

ImageTarget中刪除DefaultTrackableEventHandler組件随静。 然后八千,添加您在Scripts文件夾中找到的PizzaTrackableEventHandler。 接下來(lái)燎猛,打開(kāi)PizzaTrackableEventHandler恋捆。 這是DefaultTrackableEventHandler的克隆,但OnTrackingFoundOnTrackingLost中的代碼已被刪除 - 由您來(lái)解決這個(gè)問(wèn)題扛门!

Renderer組件的打開(kāi)和關(guān)閉幾乎在每個(gè)AR應(yīng)用程序中都有意義鸠信,因此請(qǐng)重新添加該代碼。如果卡住论寨,可以從DefaultTrackableEventHandler復(fù)制它或在下面的擾流器塊中找到它星立。

protected virtual void OnTrackingFound()
{
    var rendererComponents = GetComponentsInChildren<Renderer>(true);
        
    // Enable rendering:
    foreach (var component in rendererComponents)
    {
        component.enabled = true;
    }
}

protected virtual void OnTrackingLost()
{
    var rendererComponents = GetComponentsInChildren<Renderer>(true);
        
    // Enable rendering:
    foreach (var component in rendererComponents)
    {
        component.enabled = false;
    }
}

你準(zhǔn)備把這個(gè)游戲變成一個(gè)增強(qiáng)現(xiàn)實(shí)游戲!

查看用戶(hù)界面并找到玩家需要點(diǎn)擊以完成比薩餅的按鈕葬凳。

你可以看到當(dāng)玩家點(diǎn)擊按鈕GameManager.CompleteOrder()時(shí)會(huì)調(diào)用一個(gè)事件绰垂。 您不必讓玩家點(diǎn)按一個(gè)按鈕,而是讓他們必須“披上”比薩餅(將跟蹤器移出視野)才能完成訂單火焰。

PizzaTrackableEventHandler的開(kāi)頭劲装,添加一個(gè)UnityEvent,在Image失去跟蹤時(shí)調(diào)用昌简。

using Vuforia;
using UnityEngine;
using UnityEngine.Events;

public class PizzaTrackableEventHandler : MonoBehaviour, ITrackableEventHandler
{
    public UnityEvent OnTrackingLostEvent;
...

現(xiàn)在占业,在OnTrackingLost方法中調(diào)用此事件:

protected virtual void OnTrackingLost()
{
    var rendererComponents = GetComponentsInChildren<Renderer>(true);
    
    // Enable rendering:
    foreach (var component in rendererComponents)
    {
        component.enabled = false;
    }
    //Trigger our event
    OnTrackingLostEvent.Invoke();
}

這使得PizzaTrackableEventHandler變得靈活,因?yàn)楝F(xiàn)在您可以設(shè)置在圖像失去跟蹤時(shí)您想要執(zhí)行的任何操作纯赎。 保存PizzaTrackableEventHandler谦疾,返回Unity Editor并等待它編譯。 一旦有犬金,將設(shè)置GameManager.CompleteOrder()在披薩跟蹤器圖像失去跟蹤時(shí)調(diào)用念恍。 最后,關(guān)閉或刪除UI中的CompleteOrderButton晚顷。

保存場(chǎng)景峰伙,點(diǎn)擊Play,并提供一些披薩该默!

有關(guān)使用Unity中的Vuforia進(jìn)行開(kāi)發(fā)的更多信息瞳氓,您可以查看 Vuforia Developer LibraryUnity manual

不要忘記在Vuforia portal中為自己設(shè)置開(kāi)發(fā)人員帳戶(hù)栓袖。 為什么不嘗試上傳幾個(gè)不同的圖像跟蹤器來(lái)查看每個(gè)跟蹤器的效果如何匣摘?

有關(guān)高級(jí)主題锅锨,請(qǐng)查看virtual buttonsVuforia網(wǎng)站上有一些示例材料可以幫助您入門(mén)恋沃。 看看你是否可以制作虛擬按鈕來(lái)取代披薩游戲中的UI必搞。

后記

本篇主要講述了如何使用Vuforia制作AR游戲,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末囊咏,一起剝皮案震驚了整個(gè)濱河市恕洲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梅割,老刑警劉巖霜第,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異户辞,居然都是意外死亡泌类,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)底燎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刃榨,“玉大人,你說(shuō)我怎么就攤上這事双仍∈嘞#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵朱沃,是天一觀(guān)的道長(zhǎng)苞轿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)逗物,這世上最難降的妖魔是什么搬卒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮翎卓,結(jié)果婚禮上契邀,老公的妹妹穿的比我還像新娘。我一直安慰自己莲祸,他們只是感情好蹂安,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布椭迎。 她就那樣靜靜地躺著锐帜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畜号。 梳的紋絲不亂的頭發(fā)上缴阎,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音简软,去河邊找鬼蛮拔。 笑死述暂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的建炫。 我是一名探鬼主播畦韭,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肛跌!你這毒婦竟也來(lái)了艺配?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衍慎,失蹤者是張志新(化名)和其女友劉穎转唉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稳捆,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赠法,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乔夯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砖织。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖末荐,靈堂內(nèi)的尸體忽然破棺而出镶苞,到底是詐尸還是另有隱情,我是刑警寧澤鞠评,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布茂蚓,位于F島的核電站,受9級(jí)特大地震影響剃幌,放射性物質(zhì)發(fā)生泄漏聋涨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一负乡、第九天 我趴在偏房一處隱蔽的房頂上張望牍白。 院中可真熱鬧,春花似錦抖棘、人聲如沸茂腥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)最岗。三九已至,卻和暖如春朝捆,著一層夾襖步出監(jiān)牢的瞬間般渡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驯用,地道東北人脸秽。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蝴乔,于是被迫代替她去往敵國(guó)和親记餐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容