【Unity3D】二奈泪、制作滾球游戲?qū)W習(xí)Unity3D(下)

上一篇文章:http://www.reibang.com/p/78e21fb7e09e

創(chuàng)建碰撞小立方體

新建Cube

我們在游戲場地中加入一些旋轉(zhuǎn)的小方塊兒,然后由球來碰撞這些小方塊兒,碰撞之后就加一定的分?jǐn)?shù)筹陵。
很簡單地刽锤,創(chuàng)建一個(gè)Cube,并命名為PickUp朦佩,使其Reset并思,然后我們調(diào)整一下它的Rotation和Scale,使得其變成一個(gè)斜放的小立方體语稠,(為了方便看宋彼,這里暫時(shí)隱藏了Player,只要在Player的Inspector面板中將其前邊的對勾打掉它就會隱藏)仙畦。


建立小立方體并改變其角度

讓小立方體旋轉(zhuǎn)起來

為了讓小方塊兒更有趣输涕,我們來添加一個(gè)腳本讓他旋轉(zhuǎn)起來,新建腳本Rotator慨畸,并添加給PickUp莱坎,編輯此腳本。
這個(gè)邏輯中是不需要Start函數(shù)的寸士,我們只需要每一幀都讓小方塊兒轉(zhuǎn)動一下檐什,所以將邏輯寫到Update函數(shù)中,這里使用Ratate方法碉京,需要一個(gè)Vector3作為參數(shù)厢汹,為了不讓旋轉(zhuǎn)過快,我們給每一幀都乘以一個(gè)小的時(shí)間量谐宙。

private Vector3 rotation = new Vector3(15,30,45);

void Update()
{
    transform.Rotate(rotation * Time.deltaTime);
}

保存腳本烫葬,運(yùn)行游戲可以看到小方塊旋轉(zhuǎn)起來了。


讓小立方體旋轉(zhuǎn)起來

創(chuàng)建Prefab

接下來我們需要多放置一些立方體在游戲的平面上凡蜻,在此之前搭综,我們需要把這個(gè)設(shè)計(jì)好的立方體生成一個(gè)Prefab(預(yù)設(shè)體),讓它變成一個(gè)asset划栓,這樣我們可以從prefab創(chuàng)建這個(gè)立方體的實(shí)例兑巾,這樣我們才能分別控制每一個(gè)由prefab生成的實(shí)例或者控制prefab本身,在這個(gè)游戲中忠荞,被小球碰撞到的小立方體會消失蒋歌,這也就是我們需要更新每一個(gè)小立方體的狀態(tài),所以我們需要創(chuàng)建一個(gè)Prefab委煤。

a prefab is an asset that contains a template, or blueprint of a game object or game object family.
(預(yù)設(shè)體是包含游戲?qū)ο蠡蛴螒驅(qū)ο笞宓哪0寤蛟O(shè)計(jì)大綱的一種資源堂油。)

在Assets下新建Prefabs目錄來管理預(yù)設(shè)體,只需要將MainScene中的PickUp拖拽到新建的目錄下就可以生成對應(yīng)的asset了碧绞,這時(shí)也會看到MainScene中的PickUp變成了一個(gè)藍(lán)色的圖標(biāo)府框。


創(chuàng)建一個(gè)Prefab

此時(shí)在MainScene中新建一個(gè)空的GameObject來管理所有的小立方體,命名為PickUps讥邻,將剛剛的第一個(gè)PickUp拖拽到它的上邊使其成為其子物體迫靖。


調(diào)整父子GameObject的關(guān)系

放置更多的立方體

接下來放置小立方體院峡,為了調(diào)整一個(gè)好的視角,我們可以點(diǎn)擊Scene中右上角的方位標(biāo)志的Y軸的小錐體系宜,就會調(diào)整視角到俯視的角度照激,這是一個(gè)便捷的小技巧。


調(diào)整視角成俯視

由于我們的小立方體是一個(gè)斜放的立方體蜈首,在原本的坐標(biāo)軸下很難調(diào)整立方體在水平面上的位置实抡,這里還有一個(gè)小技巧,我們點(diǎn)擊右上角的Local變成Global欢策,這樣就會在Global的坐標(biāo)中對小立方體進(jìn)行調(diào)整了吆寨,可以看到,小立方體的三個(gè)坐標(biāo)軸變成了只有兩個(gè)方向的軸踩寇,非常方便就可以調(diào)整了啄清。


將坐標(biāo)改為Global

接下來只需要Duplicate幾個(gè)或者使用Ctrl+D來重復(fù)放置一些小立方體即可。這里粗略地?cái)[放了八個(gè)小立方體俺孙。
擺放8個(gè)小立方體

為小立方體涂色

讓后再通過添加一種Material的方式將他們涂成黃色辣卒。
這里可以通過兩種方式完成。
第一種睛榄,將Material拖拽給任意一個(gè)PickUp立方體荣茫,然后再該P(yáng)ickUp的Inspector的Prefab的Overrides(重載)下選擇Apply All來讓所有PickUp都被涂成黃色。


為小立方體涂色

第二種方法會更加簡單场靴,直接將Material用于Assets中的小立方體的Prefab就可以啦啡莉,找到Assets中的PickUp的Prefab,點(diǎn)擊Inspector面板中的Open Prefab旨剥,就會在Scene窗口中預(yù)覽該P(yáng)refab咧欣,這是再拖動黃色的Material到他上邊,這個(gè)Prefab就會被染成黃色了轨帜。

為小立方體涂色

為小立方體涂色

完成碰撞

為PickUp添加標(biāo)簽

如果小球碰撞了旋轉(zhuǎn)的立方體魄咕,那么小立方體就會消失。那么如何識別我們的小球Player碰撞的是小立方體呢蚌父?我們通過為PickUp添加特定的標(biāo)簽來識別哮兰。添加標(biāo)簽再Prefab上,在Assets中找到我們的Prefab并打開它苟弛,可以在它的Inspector面板中發(fā)現(xiàn)它還沒有添加標(biāo)簽(Untagged)喝滞,點(diǎn)擊Tag后的按鈕選擇Add Tag…,來添加一個(gè)名為PickUp的標(biāo)簽嗡午,然后再回到最開始的面板處選擇新添加的這個(gè)標(biāo)簽囤躁,這樣PickUp的標(biāo)簽就添加好了冀痕。


新建并添加PickUp標(biāo)簽

完成碰撞邏輯

重新編輯PlayerController的腳本荔睹,這里我們將碰撞發(fā)生的邏輯寫到函數(shù)OnTriggerEnter中狸演,這個(gè)函數(shù)在發(fā)生碰撞事件的時(shí)候調(diào)用,而且用碰到的Collider(碰撞機(jī))作為參數(shù)僻他,也就是我們的Player碰到的Collider宵距。可見吨拗,如果要檢測到的碰撞满哪,被碰撞的物體需要由碰撞引擎,也就是要有Collider的屬性劝篷,其實(shí)我們會發(fā)現(xiàn)哨鸭,作為Cube保存的一個(gè)Prefab在創(chuàng)建之初就已經(jīng)有Box Collider的這一Component了,所以不再需要我們自己添加娇妓。


Box Collider屬性

OnTriggerEnter函數(shù)用其碰撞到的Collider作為參數(shù)像鸡,現(xiàn)在就需要我們識別這個(gè)碰到的Collider是不是一個(gè)PickUp了,顯然可以使用Tag來鑒別哈恰,這里使用gameObject的CompareTag方法來完成只估,該方法以一個(gè)字符串作為參數(shù),返回一個(gè)布爾值着绷,如果gameObject的Tag和字符串一致蛔钙,就返回true。
接下來完成控制小立方體消失的邏輯荠医,很簡單吁脱,使用gameObject的方法SetActive來完成,這個(gè)方法控制的就是我們在Inspector面板中看到的每一個(gè)GameObject前的小對勾子漩,該方法接受一個(gè)布爾值作為參數(shù)來控制GameObject的消失與顯現(xiàn)豫喧。
完整的代碼如下:

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("PickUp"))
    {
        other.gameObject.SetActive(false);
    }
}

關(guān)于碰撞的簡單原理

此時(shí)運(yùn)行游戲,在小球碰到小立方體的時(shí)候小立方體并沒有像我們像的那樣消失幢泼,這里的原因需要我們了解一定的Unity對與碰撞到原理紧显。Unity將Collider(碰撞機(jī))分為靜態(tài)碰撞機(jī)(Static Collider)和動態(tài)碰撞機(jī)(Dynamic Collider)兩種。靜態(tài)的碰撞機(jī)比如墻面缕棵、地板等一些列靜態(tài)的物體孵班,與他們碰撞時(shí),不允許兩個(gè)Collider相互重合招驴,也就是說會發(fā)生反彈篙程,而為了讓我們的碰撞能夠?qū)崿F(xiàn),我們需要將立方體設(shè)置為動態(tài)的(Trigger)觸發(fā)器别厘,成為Trigger的Collider是可以被穿過的虱饿,這樣才會引發(fā)我們的“碰撞事件”的邏輯。這里我們找到PickUp的Prefab,在它的Box Collider的Component中氮发,勾選Is Trigger選項(xiàng)渴肉,這樣它就成為了一個(gè)觸發(fā)器。


選擇Trigger屬性

此時(shí)運(yùn)行游戲可以發(fā)現(xiàn)爽冕,小立方體在受到碰撞后完美消失仇祭。


小立方體被碰撞后消失

優(yōu)化

這里有一個(gè)有關(guān)物理引擎的優(yōu)化,首先我們區(qū)分了靜態(tài)碰撞機(jī)和動態(tài)碰撞機(jī)颈畸,Untiy對于靜態(tài)碰撞機(jī)乌奇,會將它們的體積記錄在一個(gè)緩存中,這是很合理的眯娱,因?yàn)殪o態(tài)即不動礁苗,所以并不需要在每一幀都計(jì)算器和重新繪制它的體積,而動態(tài)的則不同徙缴,因?yàn)樗沁\(yùn)動的寂屏,所以必須在每一幀處都計(jì)算和繪制,這個(gè)過程是需要耗費(fèi)資源的娜搂。

Any game object with a collider and a rigid body is considered dynamic.
Any game object with a collider attached but no physics rigid body is expected to be static.
(任何同時(shí)帶有Collider和Rigidbody屬性的GameObject稱為動態(tài)的迁霎,任何只有Collider而沒有Rigidbody屬性的GameObject稱為靜態(tài)的)

為了讓PickUp成為動態(tài)的,這樣不需要每一次都計(jì)算它的體積百宇,我們?yōu)镻ickUp的Prefab添加Rigidbody屬性考廉,運(yùn)行游戲,發(fā)現(xiàn)神奇的事情發(fā)生了携御,所有的PickUp居然掉了下去昌粤,這當(dāng)然是由于所有的剛體都受到了重力的影響,所以PickUp會下落啄刹。


小立方體受到重力下落

為了解決這一問題涮坐,移步到PickUp的Prefab下剛剛添加的Rigidbody屬性處,會發(fā)現(xiàn)有兩個(gè)選項(xiàng)誓军,分別是Use Gravity和Is Kinematic袱讹。


更改其成為Kinematic Rigid body

顯然,我們可以直接將Use Gravity的對勾打掉昵时,這樣它不再受重力捷雕,自然不會下落,這是一個(gè)解決辦法壹甥,但是并不完美救巷,因?yàn)檫@里我們只取消了重力,但對于一個(gè)剛體來說句柠,還會受到其他的力從而使其改變Transform浦译,所以更好的做法是選中下方的Is Kinematic選項(xiàng)棒假,接下來解釋Kinematic:
Kinematic Rigid body(運(yùn)動剛體)的含義是它的Transform也就是位置、角度精盅、大小不會隨著力的作用而改變而是單純地根據(jù)Transform設(shè)置的值來改變淆衷,也就是說我們不能通過對其作用力來改變它的Transfrom,改變的唯一方法是直接調(diào)節(jié)其Transform下的各個(gè)值渤弛。

運(yùn)行游戲,完美甚带!

添加計(jì)分機(jī)制

添加計(jì)數(shù)器

接下來添加一個(gè)計(jì)數(shù)器她肯,每撞到一個(gè)小球就使計(jì)數(shù)器數(shù)值增加一,自然需要編輯PlayerController腳本鹰贵,聲明一個(gè)int類型的變量晴氨,在Start函數(shù)中初始化為0,在每一次碰撞到小立方體后都增加一碉输,這似乎是一個(gè)很簡單事情籽前,這里還特地將count每次更新后的值都打印到控制臺來驗(yàn)證其正確性。

private int count;
void Start()
{
    rigidbodyPlayer = GetComponent<Rigidbody>();
    count = 0;
}
void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("PickUp"))
    {
        other.gameObject.SetActive(false);
        count++;
        Debug.Log(count);
    }
}
控制臺顯示計(jì)分結(jié)果

添加UI在游戲界面中顯示分?jǐn)?shù)

顯然敷钾,將分?jǐn)?shù)顯示在游戲界面中才是更好的選擇枝哄,這里需要用到UI組件。
在Hierarchy面板中右鍵阻荒,選擇UI->Text挠锥,就會創(chuàng)建一個(gè)UI組件,但是我們會發(fā)現(xiàn)其實(shí)Text外還有一層Canvas(畫布)侨赡,下方還出現(xiàn)了一個(gè)EventSystem蓖租,這些都是Unity為我們自動創(chuàng)建的,這是因?yàn)椋?/p>

The single most important thing to know about these additional items is that all UI elements must be the child of a canvas to behave correctly.
(所有的UI元素都必須是一個(gè)Canvas(畫布)的子元素才能正常工作)

這里將Text命名為CountText羊壹,這時(shí)候的CountText處于一個(gè)非常奇怪的位置蓖宦,接下來我們來調(diào)整Text的位置。


新建Text和Canvas

在Inspector面板中油猫,我們可以調(diào)整Text顯示的內(nèi)容稠茂,字體的樣式,字體顏色以及這個(gè)UI組件的位置情妖,先把文字顯示改為Count Text主慰,接下來改變其字體顏色為白色。


改變字體顏色

接下來調(diào)整Text的位置鲫售,找到Inspecctor的Rect Transform共螺,可以看到UI的Transform和一般GameObject的定位方式不同,這個(gè)位置的確定是相對于游戲屏幕的情竹,點(diǎn)擊左邊的這個(gè)方框藐不,展開位置選擇的面板,根據(jù)提示:按住Shift鍵選擇中心軸(pivot),按住Alt鍵選擇位置(position)雏蛮。我們選擇同時(shí)按住Shift和Alt鍵涎嚼,將Text放到Canvas的左上角:
更改Text的位置

這樣就可以看到Count Text放置到了Game窗口的左上角。接下來可以改變Rect Transform的Pos X的值和Pos Y的值讓Count Text稍微離左邊緣和頂部邊緣一段距離:


加入偏移量

編輯腳本來顯示分?jǐn)?shù)

接下來當(dāng)然是將分?jǐn)?shù)顯示到Text中挑秉,繼續(xù)編輯PlayerController腳本法梯,首先需要添加新的Namespace:

using UnityEngine.UI;

然后自然需要創(chuàng)建一個(gè)Text變量來表示CountText的一個(gè)引用,我們將此Text變量聲明為public的類型犀概,為了可以在Inspector中對其進(jìn)行直接的賦值立哑。接下來要初始化CountText中所顯示的文字,使用Text的text變量即可姻灶,在Start函數(shù)中進(jìn)行初始化铛绰,然后再每一次碰撞到小立方體的時(shí)候再重新更新Text的內(nèi)容:

public Text countText;
void Start()
{
    rigidbodyPlayer = GetComponent<Rigidbody>();
    count = 0;
    countText.text = "Count: " + count.ToString();
}
void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("PickUp"))
    {
        other.gameObject.SetActive(false);
        count++;
        countText.text = "Count: " + count.ToString();
    }
}

保存腳本回到Unity,將CountText拖動到Inspector中新產(chǎn)生的這個(gè)Text變量處來實(shí)例化它即可产喉。


實(shí)例化Text

運(yùn)行游戲捂掰,完美!


游戲正常運(yùn)行

添加完成提示

最后曾沈,當(dāng)所有的小立方體都被收集后这嚣,再屏幕中心顯示“You Win!”的字樣塞俱,這看起來就很簡單了疤苹,同樣是:添加一個(gè)新的Text組件、命名敛腌、改變字體顏色大小和位置卧土、在腳本中新建一個(gè)Text變量、在Start函數(shù)中將其初始值設(shè)為空像樊、滿足count值大于等于8的時(shí)候即顯示“You Win尤莺!”、將新的Text拖動到Inspector面板中的變量處生棍。
主要的代碼:

public Text winText;
winText.text = "";
if (count >= 8)
{
    winText.text = "You Win!";
}

運(yùn)行游戲颤霎,完美!


添加You Win涂滴!的信息

Build游戲

最后就是創(chuàng)建我們的游戲了友酱!Unity創(chuàng)建游戲的平臺非常廣泛,我們可以無需任何其他插件的前提下創(chuàng)建Windows柔纵、Mac和Linux平臺下的游戲缔杉,但是如果創(chuàng)建諸如Android、IOS端的游戲需要額外的工作搁料,比較復(fù)雜或详,以后會單獨(dú)提到系羞,這里先創(chuàng)建一個(gè)Windows平臺的.exe文件。
先保存Scene,然后選擇File下的Build Settings…。


進(jìn)入Build Settings

默認(rèn)即PC疯搅,Mac & Linux Standalone,這里還需要我們通過Add Open Scene來選擇我們需要創(chuàng)建的Scene晚唇,不過本游戲只有一個(gè)Scene,不進(jìn)行選擇也是可以的。點(diǎn)擊Build,選擇要保存到目標(biāo)目錄夹供,然后稍等片刻,就會得到了最終的.exe文件学歧。


Build游戲

打開文件即可直接運(yùn)行,整個(gè)游戲的所有工程也就全部完成了各吨!
打開游戲程序

游戲完美運(yùn)行枝笨!

參考資料:https://unity3d.com/learn/tutorials/s/roll-ball-tutorial
本節(jié)內(nèi)容的完整官方教程視頻分享(英文無字幕):https://pan.baidu.com/s/1TNMMFjs7pZqLPhGQZ1tPqQ 提取碼:1u70


轉(zhuǎn)載請注明出處,本文永久更新鏈接:https://blogs.littlegenius.xin/2019/02/10/從滾球游戲初步體驗(yàn)Unity3D/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揭蜒,一起剝皮案震驚了整個(gè)濱河市横浑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屉更,老刑警劉巖徙融,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瑰谜,居然都是意外死亡欺冀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門萨脑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隐轩,“玉大人,你說我怎么就攤上這事渤早≈俺担” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵鹊杖,是天一觀的道長悴灵。 經(jīng)常有香客問我,道長骂蓖,這世上最難降的妖魔是什么积瞒? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮登下,結(jié)果婚禮上赡鲜,老公的妹妹穿的比我還像新娘空厌。我一直安慰自己,他們只是感情好银酬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布嘲更。 她就那樣靜靜地躺著,像睡著了一般揩瞪。 火紅的嫁衣襯著肌膚如雪赋朦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天李破,我揣著相機(jī)與錄音宠哄,去河邊找鬼。 笑死嗤攻,一個(gè)胖子當(dāng)著我的面吹牛毛嫉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妇菱,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼承粤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闯团?” 一聲冷哼從身側(cè)響起辛臊,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎房交,沒想到半個(gè)月后彻舰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡候味,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年刃唤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片白群。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡透揣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出川抡,到底是詐尸還是另有隱情辐真,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布崖堤,位于F島的核電站侍咱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏密幔。R本人自食惡果不足惜楔脯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胯甩。 院中可真熱鬧昧廷,春花似錦堪嫂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眉枕,卻和暖如春恶复,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背速挑。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工谤牡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姥宝。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓翅萤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腊满。 傳聞我的和親對象是個(gè)殘疾皇子套么,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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

  • 前言 在Unity官方教程 2D UFO(上)中,我們學(xué)會了: 新建一個(gè)項(xiàng)目Project 從資源商店下載素材包 ...
    小巷里有只貓閱讀 4,755評論 8 15
  • 一糜烹、Unity簡介 1. Unity界面 Shift + Space : 放大界面 Scene界面按鈕渲染模式2D...
    MYves閱讀 8,207評論 0 22
  • Unity3D塔防開發(fā)流程 配置環(huán)境及場景搭建 編程語言:C#违诗,略懂些許設(shè)計(jì)模式漱凝,如果不了解設(shè)計(jì)模式疮蹦,BUG Mo...
    Grape_葡萄閱讀 2,937評論 1 3
  • 很久很久都沒有寫點(diǎn)什么東西了,真是有愧于我中文系的專業(yè)茸炒,以后多多練習(xí)愕乎,作家的夢想怕是不能實(shí)現(xiàn)了,那就我手寫我心吧壁公,...
    榛木清閱讀 425評論 0 0
  • 相信就可以做到 很多時(shí)候我們都想要相信感论,卻又不得不懷疑,于是總是在不斷糾結(jié)紊册,其實(shí)都是我們的大腦去影響的比肄。 改變大腦...
    Janewei閱讀 186評論 0 0