基于 Unity3D技術(shù)的農(nóng)場(chǎng)體驗(yàn)游戲的設(shè)計(jì)與開(kāi)發(fā)_第1頁(yè)
基于 Unity3D技術(shù)的農(nóng)場(chǎng)體驗(yàn)游戲的設(shè)計(jì)與開(kāi)發(fā)_第2頁(yè)
基于 Unity3D技術(shù)的農(nóng)場(chǎng)體驗(yàn)游戲的設(shè)計(jì)與開(kāi)發(fā)_第3頁(yè)
基于 Unity3D技術(shù)的農(nóng)場(chǎng)體驗(yàn)游戲的設(shè)計(jì)與開(kāi)發(fā)_第4頁(yè)
基于 Unity3D技術(shù)的農(nóng)場(chǎng)體驗(yàn)游戲的設(shè)計(jì)與開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩61頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

摘要隨著人們?nèi)粘I顑?nèi)容的豐富,以及現(xiàn)代計(jì)算機(jī)技術(shù)的提升,計(jì)算機(jī)游戲成為了一個(gè)嶄新的娛樂(lè)載體漸漸進(jìn)入了大家的視野。在眾多類型游戲之中,模擬養(yǎng)成類游戲始終是一棵常青樹,經(jīng)久不衰。模擬類型游戲的宗旨是把人們向往的生活帶到游戲中,體驗(yàn)不同的生活方式。本研究項(xiàng)目是一款模擬農(nóng)場(chǎng)生活,體驗(yàn)田園風(fēng)光的模擬類養(yǎng)成游戲,基于Windows10系統(tǒng)Unity3D引擎并且采用編程語(yǔ)言C#制作。在制作過(guò)程中,使用Photoshop進(jìn)行素材以及UI界面的處理。本研究項(xiàng)目許多功能借鑒于小時(shí)候的農(nóng)村經(jīng)歷,將日常生活中的農(nóng)作物耕作,以及與家畜的互動(dòng)加入游戲中,因此玩家在體驗(yàn)該游戲時(shí)會(huì)有更多的真實(shí)感,會(huì)有更深層次的沉浸式體驗(yàn)。本研究項(xiàng)目的初衷是推廣農(nóng)村文化,讓玩家對(duì)農(nóng)村生活有更多的了解,并且喜歡上農(nóng)村生活?!酢蹶P(guān)鍵詞:模擬農(nóng)場(chǎng)游戲Unity3D場(chǎng)景交互農(nóng)作物動(dòng)物AbstractWiththeenrichmentofpeople'sdailylifeandtheimprovementofmoderncomputertechnology,computergameshavebecomeabrand-newentertainmentcarrierandgraduallycomeintoourvision.Amongthemanytypesofgames,thesimulatednurturinggameisalwaysanevergreentree.Thepurposeofsimulationtypegameistobringpeople'syearninglifeintothegameandexperiencedifferentlifestyles.Thisresearchprojectisasimulationgameoffarmlifeandruralscenery,Itisbasedonunity3dengineofwindows10systemandmadebyC#.Intheprocessofproduction,PhotoshopisusedtoprocessmaterialsandUIinterface.Manyfunctionsofthisresearchprojectdrawlessonsfromtheruralexperienceinchildhood,Addthefarmingofcropsindailylifeandtheinteractionwithlivestocktothegame,soplayerswillexperiencethegamewithmorerealismanddeeperimmersionexperience.Theoriginalintentionofthisresearchprojectistopromoteruralculture,sothatplayerscanhavemoreunderstandingofrurallife,andletthemlikerurallife.□□Keywords:SimulationfarmgameUnity3DSceneinteractioncropsanimals廣東東軟學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)目錄TOC\o"1-3"\u第一章 引言 引言研究背景與意義隨著科學(xué)技術(shù)的提升,電腦已經(jīng)成為人們?nèi)粘I钪胁豢苫蛉钡囊徊糠?,電子信息技術(shù)不僅應(yīng)用在人們?nèi)粘5霓k公中,從電子信息技術(shù)中誕生了許多的娛樂(lè)媒體,充實(shí)了人們?nèi)粘I钪械膴蕵?lè)。在眾多的娛樂(lè)媒體中,電子游戲作為新興的娛樂(lè)載體,成為了在日常生活中讓人們喜聞樂(lè)見(jiàn)娛樂(lè)項(xiàng)目。迄今為止,游戲產(chǎn)業(yè)在我國(guó)蓬勃發(fā)展,提供了許多的就業(yè)崗位,為我國(guó)生產(chǎn)總值貢獻(xiàn)了越來(lái)越多的力量,與游戲制作相關(guān)的職業(yè)也成為了前景較好的職業(yè)。為了研究電子游戲的開(kāi)發(fā)過(guò)程,在本項(xiàng)目中,我選擇制作一模擬養(yǎng)成農(nóng)場(chǎng)類游戲作為研究對(duì)象。模擬類游戲的發(fā)展現(xiàn)狀隨著游戲技術(shù)的發(fā)展,電子游戲也發(fā)展出了許多方向、類型的游戲種類。其中模擬類游戲作為一種較為經(jīng)典的游戲種類,從誕生開(kāi)始一直經(jīng)久不衰。在早期的電腦游戲中,《三維彈球之太空軍校生》就是一款比較經(jīng)典的模擬類游戲。該游戲就是模擬當(dāng)時(shí)社會(huì)中比較流行的彈珠彈球游戲的內(nèi)容創(chuàng)作的。當(dāng)時(shí)該電腦游戲出現(xiàn)后,銷量一直火爆,直到現(xiàn)在依然是人們所津津樂(lè)道的游戲。模擬類游戲的主要方向是:從已有日常生活中獲得靈感,在游戲中模擬出這種生活文化,讓玩家即使沒(méi)有親身經(jīng)歷這種生活也能感同身受。模擬類游戲從某種意義來(lái)說(shuō)就是日常生活的延伸,不僅可以讓玩家獲得游戲上的享受,更是或多或少的宣傳了被模擬的生活文化。農(nóng)場(chǎng)游戲目前的發(fā)展在電子游戲發(fā)展的歷史長(zhǎng)河中,不乏許多農(nóng)場(chǎng)養(yǎng)成游戲名作,比如十幾年前的《牧場(chǎng)物語(yǔ):礦石鎮(zhèn)的伙伴們》;在steam平臺(tái)中前些日子比較火的《星露谷物語(yǔ)》和國(guó)人自行研發(fā)的《波西亞時(shí)光》;還有時(shí)下刷屏各大媒體平臺(tái),話題量火爆的《集合!動(dòng)物森友會(huì)》。農(nóng)場(chǎng)游戲一直以貼近自然,休閑放松而著稱。目前人們快節(jié)奏的生活給予了人們很多壓力,人們開(kāi)始向往以前美好的田園生活。在農(nóng)場(chǎng)游戲中,玩家可以體驗(yàn)與自然的接觸,享受豐收的喜悅,感受與動(dòng)物的交往,農(nóng)場(chǎng)游戲無(wú)疑是人們緊張生活時(shí)的一款緩沖劑。在讓玩家享受游戲之外,農(nóng)場(chǎng)游戲還向玩家宣傳了自然知識(shí),農(nóng)村文化,讓玩家知道生活中食物的來(lái)源,了解到食物來(lái)之不易。章節(jié)安排為了方便閱讀,我將在這里闡述本論文的主要內(nèi)容,以及各個(gè)章節(jié)的組成部分。第一章:引言。介紹研究的背景以及意義、模擬游戲的發(fā)展、農(nóng)村游戲的現(xiàn)狀。第二章:使用工具。介紹所使用工具,在制作游戲過(guò)程中所起到的作用。第三章:游戲功能設(shè)計(jì)。介紹創(chuàng)作游戲的想法,策劃該游戲的功能,游戲的操作方法。第四章:功能實(shí)現(xiàn)。實(shí)現(xiàn)所設(shè)計(jì)的功能的過(guò)程,實(shí)現(xiàn)功能過(guò)程中的難點(diǎn)、具體步驟和主要思路。第五章:游戲測(cè)試。將游戲?qū)С龃虬?,進(jìn)行測(cè)試以及運(yùn)行結(jié)果。

使用工具2.1Unity3D引擎2.1.1介紹Unity3D第一個(gè)版本由UnityTechnologie公司于2005年6月發(fā)布。Unity3D引擎搭載的編程語(yǔ)言是C#,方便使用者輕松的創(chuàng)建游戲。除了創(chuàng)建游戲以外,Unity3D還廣泛的應(yīng)用于制作動(dòng)畫,建筑三維建模等方面。2.1.2在本游戲中的應(yīng)用本游戲是以Unity3D引擎為平臺(tái)來(lái)進(jìn)行開(kāi)發(fā)設(shè)計(jì)的。在Unity3D中進(jìn)行了模型的整合,場(chǎng)景的搭建,各個(gè)游戲?qū)ο蟮膶蛹?jí)判斷和位置判斷。除此之外,Unity3D還作為了一個(gè)中間橋梁,將腳本與游戲?qū)ο舐?lián)系起來(lái),并且將腳本所編寫的功能于游戲?qū)ο笊蠈?shí)現(xiàn)。Unity3D本身還提供了各種組件,節(jié)省了腳本實(shí)現(xiàn)功能的工作量,讓使用者更加有效率的創(chuàng)建游戲。在運(yùn)行腳本的時(shí)候,Unity3D還提供檢查功能,如果腳本報(bào)錯(cuò),它會(huì)提醒使用者錯(cuò)誤的來(lái)源地。2.2VisualStudio2.2.1介紹VisualStudio第一個(gè)版本由微軟公司于1997年發(fā)布。VisualStudio是一個(gè)完整的開(kāi)發(fā)工具集,適用于微軟的所有平臺(tái)。VisualStudio早期版本的語(yǔ)言開(kāi)發(fā)主要是C++。在編寫游戲腳本中使用的C#最早是于2002年版本所開(kāi)發(fā)的面向?qū)ο蟮木幊陶Z(yǔ)言。2.2.2在本游戲中的應(yīng)用編寫游戲腳本所使用的工具,所使用的編程語(yǔ)言為VisualStudio所自帶的C#。2.3PhotoShop2.3.1介紹PhotoShop是由Adobe公司開(kāi)發(fā)的專門用于對(duì)圖片進(jìn)行處理以及編輯的專業(yè)工具。PhotoShop具有強(qiáng)大的的編修以及繪圖功能,除了處理編輯圖片以外,它還在文字、視頻、出版等方面有廣泛的運(yùn)用。2.3.2在本游戲中的應(yīng)用制作游戲時(shí)對(duì)素材進(jìn)行處理的工具。獲取了初始資源后,通過(guò)PhotoShop對(duì)其進(jìn)行截取,修改大小,編輯形狀,最終成為游戲素材。游戲中的UI界面也是通過(guò)PhotoShop的圖形繪畫制作的,通過(guò)繪制基本圖形,再加以整合,貼圖。2.4Unity3d使用相關(guān)函數(shù)Start:當(dāng)腳本被加載時(shí)執(zhí)行,并且只執(zhí)行一次。Update:腳本實(shí)時(shí)調(diào)用。GetComponent:獲取對(duì)象組件信息。Destroy:摧毀對(duì)象。Return:返回函數(shù)。Instantiate:添加對(duì)象。GameObject.Find:從游戲中查詢對(duì)象。Public:聲明公共對(duì)象,可以被外部調(diào)用。Private:聲明私有對(duì)象,不可以被外部調(diào)用。If:判斷語(yǔ)句。如果符合判斷條件則繼續(xù)向下執(zhí)行。For:循環(huán)語(yǔ)句。如果符合條件則繼續(xù)使用,不符合則跳出循環(huán)。Load:從文件中加載資源。Substring:檢索字符串。

游戲功能設(shè)計(jì)3.1場(chǎng)景設(shè)計(jì)3.1.1游戲功能結(jié)構(gòu) 游戲功能結(jié)構(gòu)如下圖所示圖3-1功能結(jié)構(gòu)聯(lián)系圖

3.1.2素材選擇以及美工畫風(fēng)本游戲是一款畫風(fēng)為像素風(fēng)格的模擬養(yǎng)成類型的農(nóng)場(chǎng)游戲,基于這個(gè)游戲格調(diào),場(chǎng)景素材以及人物素材自然就不能選擇3D的模型素材,應(yīng)該選擇像素風(fēng)的游戲素材,應(yīng)該考慮像是塞班平臺(tái)的《阿爾卑斯牧場(chǎng)物物語(yǔ)》、GameBoy平臺(tái)的《礦石鎮(zhèn)的伙伴》這類型的游戲的模型和人物、動(dòng)物、植物素材就比較符合游戲的基調(diào),在處理本游戲素材的時(shí)候,美工就可以向它們借鑒。圖3-2礦石鎮(zhèn)的伙伴圖3-3阿爾卑斯牧場(chǎng)物語(yǔ)3.1.3場(chǎng)景素材以及地圖規(guī)劃本游戲的場(chǎng)景對(duì)象組成主要有4種:建筑、人物、動(dòng)物、植物、自然風(fēng)光、工具、以及UI界面。建筑主要的建筑是主角的家、商店、柵欄。家:主要的作用就是讓主角恢復(fù)體力,并且加速時(shí)間的流逝,到第二天。商店:主要作用就是提供一個(gè)交易平臺(tái),讓主角能購(gòu)買植物的種子、動(dòng)物幼崽。并且能讓主角賣出自己的農(nóng)作物以及動(dòng)物。柵欄:用來(lái)限制動(dòng)物的移動(dòng),當(dāng)從商店處購(gòu)買動(dòng)物幼崽的時(shí)候,動(dòng)物幼崽將出現(xiàn)在這里。柵欄里面還需要2個(gè)功能塊:a、飼料槽C、收獲槽。喂養(yǎng)槽用來(lái)放飼料,收獲槽用來(lái)收獲動(dòng)物產(chǎn)品。人物總共需要4個(gè),分別是左、右、上、下四個(gè)行走的模型。圖3-4人物模型動(dòng)物羊、雞、牛、羊、兔五種動(dòng)物模型。以及羊毛、雞蛋、牛奶、兔肉、羊肉、牛肉、雞肉各種模型。圖3-5動(dòng)物

植物植物有冬瓜、可可、向日葵、土豆、小麥、檸檬、橘子、玉米、番茄、稻米、窩瓜、紅玫瑰、藍(lán)玫瑰、肉桂、茄子、草莓、菠蘿、蘿卜、葡萄、黃瓜。每種農(nóng)作物還需要5個(gè)生長(zhǎng)狀態(tài),在生長(zhǎng)狀態(tài)里面還包括種子和果實(shí)。圖3-6植物自然風(fēng)光自然風(fēng)光里面包括可互動(dòng)的以及不可互動(dòng)的兩種。不可互動(dòng)的是各種地圖裝飾品,像是草地,樹木。可互動(dòng)的包括河流、地障。地障礙包括:樹樁、巖石、雜草。每種地障都有兩種狀態(tài)貼圖。圖3-7障礙物工具工具總共包括:鐮刀、斧頭、錘子、鋤頭、水壺。圖3-8工具3.2主角操作3.2.1移動(dòng)主角通過(guò)“W”“A”“S”“D”以及上下左右箭頭移動(dòng)。在移動(dòng)的時(shí)候,主角會(huì)因?yàn)槲恢玫囊苿?dòng)而改變動(dòng)作模型。比如說(shuō)按下“A”向左走,模型也會(huì)切換成向左的模型。當(dāng)主角移動(dòng)到有障礙的地方就不能移動(dòng),像是建筑物,樹木等。3.2.2與其他場(chǎng)景對(duì)象的互動(dòng)與其他物體的互動(dòng)鍵都是“E”鍵。當(dāng)主角與房屋大門互動(dòng)的時(shí)候,可以進(jìn)入屋子,與屋子內(nèi)的床互動(dòng)的時(shí)候可以跳到下一天。當(dāng)與商店大門互動(dòng)可以購(gòu)買物品。與喂養(yǎng)槽互動(dòng)可以加飼料,與收獲槽互動(dòng)可以收獲動(dòng)物產(chǎn)品。與小河互動(dòng)可以為水壺裝水。與耕地互動(dòng)可以改變地形或者播種,收獲農(nóng)產(chǎn)品。3.2.3打開(kāi)背包以及工具箱背包:按“X”鍵打開(kāi)背包系統(tǒng)。在背包系統(tǒng)下按“W”“A”“S”“D”控制物品的選擇,再按下“E”實(shí)現(xiàn)物品的使用。工具箱:按下鍵盤的1、2、3、4、5、6鍵改變工具的選擇。圖3-9背包3.3植物系統(tǒng)想要種植植物,收獲農(nóng)作物,首先要去商店購(gòu)買種子,然后清理耕地上的雜物,耕好田,再澆上水,這樣才能把種子種進(jìn)地里。每種植物都有兩個(gè)屬性:水分值以及品質(zhì)。隨著時(shí)間的流逝,每個(gè)植物都需要澆水,如果沒(méi)有澆水會(huì)影響植物的生長(zhǎng)。植物的成長(zhǎng)總共有五個(gè)階段,每個(gè)階段都有獨(dú)立的貼圖。隨著時(shí)間的改變,植物會(huì)慢慢成長(zhǎng),從種子最終長(zhǎng)成農(nóng)作物。

圖3-10植物系統(tǒng)3.4動(dòng)物系統(tǒng)想要養(yǎng)動(dòng)物,并且收獲動(dòng)物產(chǎn)品,首要去商店購(gòu)買動(dòng)物幼崽,購(gòu)買后商店會(huì)把動(dòng)物幼崽放入柵欄里面。動(dòng)物幼崽有兩個(gè)屬性:饑餓度以及成長(zhǎng)度。隨著時(shí)間的流逝,動(dòng)物需要喂養(yǎng)飼料,不然會(huì)影響成長(zhǎng)。在飼料方面,每種農(nóng)作物都能作為普通飼料,每種動(dòng)物都可以使用普通飼料和最佳飼料。但是每種動(dòng)物的最佳飼料都不一樣,喂養(yǎng)合適的飼料可以縮減動(dòng)物的成長(zhǎng)時(shí)間。到了動(dòng)物成熟期以后,每種動(dòng)物會(huì)產(chǎn)生不同的副產(chǎn)品:雞產(chǎn)生雞蛋,牛產(chǎn)生牛奶,羊產(chǎn)生羊毛。圖3-11動(dòng)物系統(tǒng)3.5工具系統(tǒng)在耕作農(nóng)作物之前需要先將荒地開(kāi)墾成耕土,然而荒地上的障礙物也是多種多樣的,并且清除障礙物的難度也是不同的。開(kāi)不同的墾障礙物也需要不同的開(kāi)墾工具。開(kāi)墾完荒地之后土地會(huì)變成耕地。如果想要在耕地上種植農(nóng)作物,還需要先吧耕地澆水潤(rùn)濕。工具系統(tǒng)總共有五種工具:空手,鐮刀,斧頭,錘子,鋤頭,水壺。如果耕地不種植物,開(kāi)墾好的田地又會(huì)重新變成荒地,需要重新開(kāi)墾?;牡氐念愋涂偣灿腥N,雜草,石頭,木樁。每種荒地都有小和大兩種不同的程度。開(kāi)墾每種不同的荒地需要不同的工具:雜草對(duì)應(yīng)鐮刀;斧頭對(duì)應(yīng)木樁;錘子對(duì)應(yīng)石頭。每種荒地都有耐久值,只有用工具不停的處理荒地,荒地才能減輕程度,最終變?yōu)榭盏?。變成空地后需要用鋤頭耕耘才能變成耕地。變成耕地后種子還不能種下,需要用水壺去小河接水后濕潤(rùn)了耕地后才能種下種子。在使用工具的時(shí)候,如果使用錯(cuò)了工具,工具將會(huì)消耗耐久值,如果耐久值變成零了,就不能使用了,需要去商店修理才能繼續(xù)使用。隨著玩家經(jīng)濟(jì)實(shí)力的提升,玩家可以去商店用金錢升級(jí)工具。升級(jí)后的工具不僅耐久值會(huì)增加,提高容錯(cuò)率,還能提高生產(chǎn)效率。圖3-12工具系統(tǒng)3.6商店系統(tǒng)商店是玩家獲得初始生產(chǎn)材料,或者出售生產(chǎn)產(chǎn)品的平臺(tái)。操作方法和背包系統(tǒng)一樣,“W”“A”“S”“D”控制選擇的物品,按“E”出售自己的農(nóng)產(chǎn)品和動(dòng)物產(chǎn)品。在商店里有許多可以購(gòu)買的東西,如植物種子,動(dòng)物幼崽,動(dòng)物普通飼料。還能升級(jí)自己的工具,以及接取不同的訂單任務(wù)。如果只是普通的購(gòu)買種子,種成農(nóng)作物,出售農(nóng)作物的話,賺錢始終是不夠快的。如果接取了訂單,并且按照訂單的要求生產(chǎn)農(nóng)作物或者是動(dòng)物產(chǎn)品的話,玩家將獲得更多的收入。

圖3-13商店系統(tǒng)

游戲功能實(shí)現(xiàn)4.1場(chǎng)景與素材加載4.1.1距離單位在游戲開(kāi)始制作之前,首先要把自己精心準(zhǔn)備的背景以及人物素材,人物動(dòng)作素材,植物素材,動(dòng)物素材,以及各種各樣的房屋建筑和自然場(chǎng)景加載入項(xiàng)目之中。這些素材將作為游戲腳本的載體來(lái)使用,不然就算編寫了腳本,也沒(méi)有實(shí)現(xiàn)功能的載體。并且在編寫腳本來(lái)實(shí)現(xiàn)各種功能之前,首先要考慮素材的基本屬性,并貼合素材的狀況來(lái)編寫腳本,這樣才保證素材能契合項(xiàng)目屬性。圖4-1網(wǎng)格紙4.2主角動(dòng)作切換以及移動(dòng)4.2.1動(dòng)作切換主角有8個(gè)動(dòng)作圖片切換,在同個(gè)方向行走的時(shí)候動(dòng)作會(huì)切換左右腳。通過(guò)wasd上下左箭頭按鍵移動(dòng)。先是實(shí)例動(dòng)作圖片入腳本。這里有兩種方法:第一種方法:通過(guò)(GameObject)Resources.Load("prefab/");用名字查詢。第二種方法:直接在腳本public對(duì)象,然后在引擎中拖入對(duì)象進(jìn)腳本組件。圖4-2載入游戲?qū)ο?.2.2監(jiān)聽(tīng)鍵盤按鍵事件通過(guò)Input.GetKeyDown(KeyCode.S)實(shí)現(xiàn)。每個(gè)方向的移動(dòng)就通過(guò)監(jiān)聽(tīng)WASD按鍵來(lái)控制移動(dòng)的方向。4.2.3人物的距離移動(dòng)使用transform.Translate改變主角的位置。在移動(dòng)之前,要先聲明一個(gè)變量MoveSpeed,用來(lái)記錄移動(dòng)的距離。由于游戲是2d游戲,所以不用改變主角Z方向軸的的位移,只需要改變X,Y方向的位置。每當(dāng)按下WS時(shí)使用transform.Translate(0,MoveSpeed,0);,按下AD時(shí)使用就可以transform.Translate(MoveSpeed,0,0);實(shí)現(xiàn)在XY方向軸上的位移了。由于攝像機(jī)是跟著主角移動(dòng)的,只要把攝像機(jī)的初始位置和主角位置一樣,然后把攝像機(jī)放進(jìn)主角里面就可以實(shí)現(xiàn)攝像機(jī)跟著主角走了。4.2.4人物動(dòng)作圖片切換先統(tǒng)一把8張圖片的Z位置調(diào)整到攝像機(jī)看不見(jiàn)的地方GameObject.transform.position.Z==101。在移動(dòng)的時(shí)候每個(gè)方向的圖片都有左右腳的變化,這樣才會(huì)有走路的感覺(jué)。為了實(shí)現(xiàn),使用了偶數(shù)的概念。需要聲明一個(gè)int變量MoveNum,初始值為0,無(wú)論wasd按下,MoveNum都會(huì)加1。用來(lái)numdown%2確定單雙數(shù),結(jié)果為0時(shí)游戲中顯示左腳圖片,為1時(shí)使用右腳圖片。改變圖片位置先要初始所有圖片Z位置,然后把對(duì)應(yīng)圖片的位置調(diào)到視野中。代碼如下:if

(Input.GetKeyDown(KeyCode.S)

||

Input.GetKeyDown(KeyCode.DownArrow)){transform.Translate(0,

-1

*

MoveSpeed,0);numdown

=

numdown

+

1;switch

(yushudown){case

0:right1.z

=

right2.z

=

left2.z

=

left1.z

=

up1.z

=

up2.z

=

down1.z

=

down2.z

=

101;npc1right2.transform.localPosition

=

npc1right1.transform.localPosition

=npc1left2.transform.localPosition

=

npc1left1.transform.localPosition

=npc1up2.transform.localPosition

=

npc1up1.transform.localPosition

=npc1down2.transform.localPosition

=

npc1down1.transform.localPosition

=down2;down1.z

=

2;npc1down1.transform.localPosition

=

down1;break;case

1:right1.z

=

right2.z

=

left2.z

=

left1.z

=

up1.z

=

up2.z

=

down1.z

=

down2.z

=

101;npc1right2.transform.localPosition

=

npc1right1.transform.localPosition

=npc1left2.transform.localPosition

=

npc1left1.transform.localPosition

=npc1up2.transform.localPosition

=

npc1up1.transform.localPosition

=npc1down2.transform.localPosition

=

npc1down1.transform.localPosition

=down1;down2.z

=

2;npc1down2.transform.localPosition

=

down2;break;}}4.3場(chǎng)景互動(dòng)與處理格4.3.1處理格主角無(wú)論怎么移動(dòng),正前方永遠(yuǎn)用來(lái)判斷處理的事物對(duì)象。新建一個(gè)處理格對(duì)象point,在腳本中記錄主角的位置,并且監(jiān)聽(tīng)鍵盤事件,當(dāng)按下WASD,先把處理格的位置初始為主角的位置,按鍵為WS,處理格的Y坐標(biāo)加一或減一。按鍵為AD,處理格的X坐標(biāo)加一或減一。代碼如下:if

((Input.GetKeyDown(KeyCode.S)

||

Input.GetKeyDown(KeyCode.DownArrow))&&

panduanbag){point.transform.position

=

savepa;point.transform.Translate(0,

-1,

0);}if

((Input.GetKeyDown(KeyCode.W)

||

Input.GetKeyDown(KeyCode.UpArrow))&&

panduanbag){point.transform.position

=

savepa;point.transform.Translate(0,

+1,

0);}if

((Input.GetKeyDown(KeyCode.A)

||

Input.GetKeyDown(KeyCode.LeftArrow))&&

panduanbag){point.transform.position

=

savepa;point.transform.Translate(-1,

0,

0);}if

((Input.GetKeyDown(KeyCode.D)

||

Input.GetKeyDown(KeyCode.RightArrow))&&

panduanbag){point.transform.position

=

savepa;point.transform.Translate(+1,

0,

0);}4.3.2場(chǎng)景互動(dòng)主角的場(chǎng)景事物互動(dòng)基本都通過(guò)處理格來(lái)完成。與場(chǎng)景的互動(dòng)有兩種方式:一、記錄處理格與場(chǎng)景事物的位置,當(dāng)兩者相同時(shí)處理格腳本中的對(duì)象即為該物體。二、碰撞實(shí)現(xiàn)判斷物體。給處理格加上碰撞體組件和剛體組件,給場(chǎng)景中需要判斷的事物加上碰撞體組件。處理格剛體組件的xyz都固定不能改變,以免在與物體相碰撞時(shí)導(dǎo)致處理格位置改變。在腳本中,先聲明碰撞游戲?qū)ο骴uixiang,當(dāng)處理格與物體在持續(xù)碰撞時(shí)OnCollisionEnter,處理格聲明的碰撞判斷對(duì)象即為該游戲?qū)ο螅?dāng)結(jié)束碰撞OnCollisionExit,處理格中的碰撞判斷對(duì)象需要被賦值空值NULL,以免在其他功能調(diào)用該判斷碰撞對(duì)象時(shí)出現(xiàn)延遲或者是對(duì)象錯(cuò)誤。代碼如下:

void

OnCollisionStay(Collision

duixiang){peng

=

duixiang.gameObject;bepeng

=

peng;}void

OnCollisionExit(Collision

collision){peng

=

null;}4.4工具系統(tǒng)與障礙物清除4.4.1工具包UI工具包UI主要由3部分組成:一、工具框;二、選擇框;三、工具圖標(biāo)。工具包一直停留于主角頭頂,并且隨著鍵盤按鍵觸發(fā)而出現(xiàn),并選擇不同的工具,選擇完后自動(dòng)關(guān)閉工具包。先要實(shí)例化工具框和選擇框,初始時(shí)工具框被隱藏SetActive(false)。記錄下每個(gè)工具格的位置。當(dāng)按下1234,選擇框的位置會(huì)移動(dòng)到對(duì)應(yīng)各自工具的位置,并且將工具框重新顯現(xiàn)SetActive(true)。if

(anxia6Down){heikuang.SetActive(true);baikuang.transform.localPosition

=

new

Vector3(0.90f,

0,

-0.1f);usinggongju.tag

=

shuih.tag;}if

(anxia1Up||

anxia2Up

||

anxia3Up

||

anxia4Up

||

anxia5Up

||

anxia6Up){heikuang.SetActive(false);}4.4.2障礙物的生成每天荒地上的障礙物類型都會(huì)隨機(jī)刷新,除非你先給荒地種上農(nóng)作物。障礙物類型主要有3種:木樁、雜草、石頭。對(duì)應(yīng)的工具類型為:斧頭、鐮刀、石頭。每種障礙物都有兩個(gè)程度的圖形,當(dāng)障礙物清除到一定程度后,障礙物會(huì)轉(zhuǎn)化為輕程度的障礙物。每天隨機(jī)生成障礙物使用函數(shù)Random.Range()。先建立一個(gè)長(zhǎng)度為8的對(duì)象數(shù)組nongtianzhuangtai,并且把八個(gè)不同類型不同程度的障礙物實(shí)例進(jìn)數(shù)組。隨機(jī)生成的函數(shù)由(1,8)之中選擇,隨機(jī)到哪個(gè)數(shù)字,就生成哪個(gè)對(duì)應(yīng)數(shù)字的障礙物。for

(int

i

=

0;

i

<

6;

++i){int

a

=

0;nongtianzhuangtai[i]

=

Random.Range(1,

7);a

=

nongtianzhuangtai[i];GameObject

xingtai=Instantiate(dixing[a],

tianoj[i].transform.position,

tianoj[i].transform.rotation);xingtai.transform.parent

=

tianoj[i].transform;}4.4.3障礙物的清理先需要建立6個(gè)標(biāo)簽,對(duì)應(yīng)六個(gè)不同的工具。在工具包中選擇哪種類型的工具,就把游戲?qū)ο筇幚砀馽hulige的標(biāo)簽改為對(duì)應(yīng)的標(biāo)簽。當(dāng)處理格的位置接觸到需要開(kāi)墾的荒地,只有處理格的標(biāo)簽所代表的工具對(duì)應(yīng)上相應(yīng)的障礙物,荒地之后的判斷才會(huì)繼續(xù)進(jìn)行。模擬開(kāi)墾的過(guò)程,需要定義兩個(gè)int類型用來(lái)存障礙物的耐久度,以及工具每一次開(kāi)墾的程度。每一次開(kāi)墾障礙物都會(huì)消耗障礙物的耐久度,當(dāng)障礙物的耐久度下降到一定程度,障礙物會(huì)退化為更低一個(gè)程度的障礙物,當(dāng)障礙物的耐久度為零,障礙物會(huì)消失。工具可以升級(jí),總共有3個(gè)等級(jí)的工具。并且每次開(kāi)墾會(huì)使障礙物消耗更多的耐久值。每一次的開(kāi)墾都會(huì)使障礙物閃爍。在障礙物閃爍的過(guò)程中,需要增加限定條件,停止障礙物腳本的使用,防止系統(tǒng)報(bào)錯(cuò)。代碼如下:if(Input.GetKeyDown(KeyCode.E)&&chulige.tag==

tianoj[i].transform.GetChild(1).tag){shake2

=

shake;saveb

=

i;savdishu[i]

=

savdishu[i]

-

wuqidengji;Invoke("move1",

0.2f);savec

=

i;}4.5背包功能實(shí)現(xiàn)4.5.1背包的開(kāi)啟以及位置處理背包由三部分組成:一、背包本體、二、選擇框、三、背包圖標(biāo)。當(dāng)背包開(kāi)啟時(shí),攝像頭畫面將被背包覆蓋,取消背包后才會(huì)恢復(fù)農(nóng)場(chǎng)畫面。這里使用了Input.GetKeyDown(KeyCode.X)作為背包的開(kāi)啟條件。每觸發(fā)該按鍵事件之前背包處于z==10000的位置,當(dāng)按下后背包處于z==2的位置,再觸發(fā)一次按鍵事件,背包會(huì)重新回到z=10000的位置。實(shí)現(xiàn)只需要添加判斷條件:當(dāng)背包位置z為10000并且按下X就可以實(shí)現(xiàn)背包的開(kāi)啟,當(dāng)背包位置z為2并且按下X就可以實(shí)現(xiàn)背包的關(guān)閉。代碼如下:if

(Input.GetKeyDown(KeyCode.X)

&&

bag.transform.localPosition.z

==

10000)//按下X背包背包顯示{Vector3

abc

=

bag.transform.localPosition;abc.z

=

1.6f;bag.transform.localPosition

=

abc;GameObject.Find("npcs1").GetComponent<johnmove>().enabled

=

false;//關(guān)閉人物行走功能return;}if

(Input.GetKeyDown(KeyCode.X)

&&

bag.transform.localPosition.z

==

1.6f){Vector3

abc

=

bag.transform.localPosition;abc.z

=

10000;bag.transform.localPosition

=

abc;GameObject.Find("npcs1").GetComponent<johnmove>().enabled

=

true;return;}4.5.2圖標(biāo)位置的建立背包設(shè)定為4*10的格子位置,通過(guò)建立一個(gè)長(zhǎng)度為40的Vector3數(shù)組:格子位置組,用來(lái)記錄每個(gè)格子的位置,然后通過(guò)循環(huán)給之后每個(gè)格子x軸方向增加相同的間距,格子每增加10,格子的y軸間距也相同增加。代碼如下:float

a

=

0.4f;firpos[10]

=

new

Vector3(2.2f,

-0.1f,

-0.2f);for

(int

i

=

9;

i

>

-1;

i--){firpos[i]

=

firpos[i

+

1];firpos[i].x

=

firpos[i].x

-

a;}firpos[20]

=

new

Vector3(2.2f,

-0.5f,

-0.2f);for

(int

i

=

19;

i

>

9;

i--){firpos[i]

=

firpos[i

+

1];firpos[i].x

=

firpos[i].x

-

a;}firpos[30]

=

new

Vector3(2.2f,

-0.9f,

-0.2f);for

(int

i

=

29;

i

>

19;

i--){firpos[i]

=

firpos[i

+

1];firpos[i].x

=

firpos[i].x

-

a;}firpos[40]

=

new

Vector3(2.2f,

-1.3f,

-0.2f);for

(int

i

=

39;

i

>

29;

i--){firpos[i]

=

firpos[i

+

1];firpos[i].x

=

firpos[i].x

-

a;}4.5.3處理框的移動(dòng)背包里通過(guò)按下wasd來(lái)控制處理框的移動(dòng),由于會(huì)與游戲場(chǎng)景中主角移動(dòng)的按鍵相矛盾,會(huì)導(dǎo)致在處理框移動(dòng)的時(shí)候,主角也會(huì)跟著移動(dòng),所以當(dāng)背包開(kāi)啟時(shí)要關(guān)閉主角移動(dòng)的腳本,當(dāng)關(guān)閉背包時(shí)重新開(kāi)啟主角移動(dòng)的腳本,通過(guò)查詢對(duì)象,然后獲取對(duì)象腳本組件來(lái)實(shí)現(xiàn)GameObject.Find("").GetComponent<>().enabled。定義一個(gè)int類型處理格位置編號(hào)savei用來(lái)存放處理格當(dāng)前所在的格子位置,只要通過(guò)改變?cè)搶?duì)象數(shù)字,然后將處理框移動(dòng)到該數(shù)字對(duì)象對(duì)應(yīng)的格子位置,就能實(shí)現(xiàn)格子的移動(dòng)。處理格的初始位置為格子的第一格,通過(guò)按鍵wasd可以移動(dòng)到周圍的格子。由于處理框移動(dòng)會(huì)超出背包格子的范圍,因此添加限定條件:當(dāng)處理格位置編號(hào)小于10或大于29時(shí)處理格不能向上或向下移動(dòng),當(dāng)處理格位置編號(hào)為0或39時(shí)不能向或左向右移動(dòng)。代碼如下:if

(Input.GetKeyDown(KeyCode.W)

&&

savei

>

9)//黑框移動(dòng)限制,當(dāng)在背包最上面的時(shí)候,不能往上;后面一樣{savei

=

savei

-

10;Vector3

abc

=

firpos[savei];abc.y

=

abc.y

-

aaa;blackkuang.transform.localPosition

=

abc;return;}4.5.4背包圖標(biāo)的增加在腳本中聲明一個(gè)公共字符串變量panduanduixiang,用來(lái)存所判斷物品的名字。增加背包里的物體首先要在游戲場(chǎng)景中的物體做判斷。當(dāng)處理格碰撞到物體時(shí),背包會(huì)獲取處理格所碰撞物體的名字,然后根據(jù)名字從資源庫(kù)中查詢名字來(lái)添加物體,并且刪除該碰撞體。建立一個(gè)游戲?qū)ο髷?shù)組:圖標(biāo)組,用來(lái)存放所添加的對(duì)象cuncopy[],然后圖標(biāo)組里成員的位置與格子位置組一一對(duì)應(yīng),這樣就實(shí)現(xiàn)了圖標(biāo)的增加。代碼如下:GameObject

agc

=

(GameObject)Resources.Load("prefab/tubiao/"

+

panduanduixiang.GetComponent<cunnon>().names);cunchaxun

=

GameObject.Find("bag/"

+

panduanduixiang.GetComponent<cunnon>().names);//獲取判斷物體的名字,并且在背包找到對(duì)應(yīng)名字的圖標(biāo)cuncopy[chuncopynum]

=

Instantiate(agc);//把相應(yīng)圖標(biāo)放進(jìn)背包c(diǎn)uncopy[chuncopynum].name

=

panduanduixiang.GetComponent<cunnon>().names;//圖標(biāo)的名字==物體的名字cuncopy[chuncopynum].transform.parent

=

bag.transform;//圖標(biāo)的父節(jié)點(diǎn)為背包c(diǎn)uncopy[chuncopynum].transform.localPosition

=

firpos[chuncopynum];//圖標(biāo)位置為對(duì)應(yīng)序號(hào)格子的位置farmertext[chuncopynum]

=

Instantiate(firtext);//把文字放入圖標(biāo)中farmertext[chuncopynum].transform.parent

=

cuncopy[chuncopynum].transform;farmertext[chuncopynum].transform.position

=

cuncopy[chuncopynum].transform.position;ojnum[chuncopynum]

=

1;4.5.5背包圖標(biāo)堆疊以及數(shù)字顯示添加圖標(biāo)的時(shí)候由于會(huì)有圖標(biāo)重復(fù)浪費(fèi)背包空間的現(xiàn)象,為了避免該現(xiàn)象發(fā)生,需要將相同圖標(biāo)的物體做堆疊,以及顯示堆疊的數(shù)目。在游戲場(chǎng)景中新增一個(gè)游戲?qū)ο骹irtext,該對(duì)象上增加一個(gè)文字組件。在腳本中新添一個(gè)長(zhǎng)度為40的游戲?qū)ο髷?shù)組:文字組farmertext[],用來(lái)存放圖標(biāo)的文字對(duì)象。以及新添一個(gè)長(zhǎng)度為40的int數(shù)組:數(shù)字組ojnum[],用來(lái)存放圖標(biāo)的堆疊數(shù)字,初始值為0。在添加圖標(biāo)時(shí),先查詢背包的子節(jié)點(diǎn)里面有沒(méi)有該圖標(biāo)對(duì)象,如果返回值為空,則在背包中添加該物體的新圖標(biāo),并且給該圖標(biāo)子節(jié)點(diǎn)文字對(duì)象,在數(shù)字組中與該圖標(biāo)編號(hào)相同的數(shù)字對(duì)象值+1,然后文字組中相應(yīng)的文字的顯示為數(shù)字組中對(duì)應(yīng)的數(shù)字。如果背包的字節(jié)點(diǎn)中存在與該物體相同的圖標(biāo),則在數(shù)字組中獲取對(duì)應(yīng)該圖標(biāo)對(duì)象的數(shù)字,使其+1。代碼如下:if

(cunchaxun

==

null)//檢測(cè)背包里沒(méi)有這個(gè)物體時(shí){GameObject

agc

=

(GameObject)Resources.Load("prefab/tubiao/"

+

panduanduixiang.GetComponent<cunnon>().names);cuncopy[chuncopynum]

=

Instantiate(agc);//把相應(yīng)圖標(biāo)放進(jìn)背包c(diǎn)uncopy[chuncopynum].name

=

panduanduixiang.GetComponent<cunnon>().names;//圖標(biāo)的名字==物體的名字cuncopy[chuncopynum].transform.parent

=

bag.transform;//圖標(biāo)的父節(jié)點(diǎn)為背包c(diǎn)uncopy[chuncopynum].transform.localPosition

=

firpos[chuncopynum];//圖標(biāo)位置為對(duì)應(yīng)序號(hào)格子的位置farmertext[chuncopynum]

=

Instantiate(firtext);//把文字放入圖標(biāo)中farmertext[chuncopynum].transform.parent

=

cuncopy[chuncopynum].transform;farmertext[chuncopynum].transform.position

=

cuncopy[chuncopynum].transform.position;ojnum[chuncopynum]

=

1;farmertext[chuncopynum].GetComponent<TextMesh>().text

=

ojnum[chuncopynum].ToString();chuncopynum++;Destroy(panduanduixiang);shopbagoj.transform.GetComponent<shopping>().shopgetbuything

=

false;if(shopbagoj.transform.GetComponent<shopping>().shopgetbuything){shopbagoj.transform.GetComponent<shopping>().shopgetbuything

=

false;}return;}else//背包里已經(jīng)有物體了{(lán)int

abc

=

int.Parse(cunchaxun.transform.GetChild(0).GetComponent<TextMesh>().text);//abc++;cunchaxun.transform.GetChild(0).GetComponent<TextMesh>().text

=

abc.ToString();Destroy(panduanduixiang);if

(shopbagoj.transform.GetComponent<shopping>().shopgetbuything){shopbagoj.transform.GetComponent<shopping>().shopgetbuything

=

false;}return;}4.5.6背包物品的使用新聲明游戲?qū)ο螅菏褂玫奈锲?/p>

handname。在移動(dòng)選擇框之后,如果選擇框內(nèi)的圖標(biāo)非空,監(jiān)聽(tīng)鍵盤按鍵事件在按下E后,將使用的物品即為處理格位置編號(hào)所對(duì)應(yīng)的圖標(biāo)。如果該圖標(biāo)的堆疊數(shù)字值大于1,該數(shù)字值減一;如果該圖標(biāo)的堆疊數(shù)字為1,刪除該圖標(biāo)。代碼如下:if

(Input.GetKeyDown(KeyCode.E)

&&

foodbag.transform.position.z

==

-0.5f)//在背包狀態(tài)按下E,刪除物品{int

abc

=

int.Parse(bag.transform.GetChild(savei

+

2).transform.GetChild(0).GetComponent<TextMesh>().text);abc--;string

sn

=

bag.transform.GetChild(savei

+

2).name;handname

=

sn;bsn

=

true;bag.transform.GetChild(savei

+

2).transform.GetChild(0).GetComponent<TextMesh>().text

=

abc.ToString();return;}由于刪除該圖標(biāo)后,背包中被刪除的圖標(biāo)所在的格子位置會(huì)空出來(lái),所以要將刪除圖標(biāo)后面的圖標(biāo)前進(jìn)一位。新建一個(gè)循環(huán),將圖標(biāo)組中編號(hào)大于刪除圖標(biāo)編號(hào)的圖標(biāo)對(duì)象,位置新改為格子位置組中自身編號(hào)減一的格子位置。代碼如下:if

(bag.transform.GetChild(savei

+

2).transform.GetChild(0).GetComponent<TextMesh>().text

==

"0")//當(dāng)圖標(biāo)數(shù)目為0時(shí)刪除圖標(biāo),+2是因?yàn)楸嘲居袃蓚€(gè)物體,圖標(biāo)是第3個(gè)開(kāi)始{int

savds

=

savei

+

2;int

savech

=

childnum;GameObject

savdesto

=

bag.transform.GetChild(savei

+

2).gameObject;Destroy(savdesto);for

(int

v

=

savds

+

1;

v

<

savech;

v++){bag.transform.GetChild(v).transform.localPosition

=

firpos[v

-

3];//把刪除后的圖標(biāo)位置前移一格}chuncopynum--;return;}4.6商店系統(tǒng)實(shí)現(xiàn)4.6.1商店系統(tǒng)的觸發(fā)以及商店UI的位置改變將商店UI放入游戲場(chǎng)景中,初始z位置為10000。在游戲中的商店模型前新增一個(gè)帶有碰撞體的空游戲?qū)ο髎hopoj,當(dāng)主角走到商店前面,處理格接觸到碰撞體之后,商店UI的Z位置移動(dòng)到2.5,進(jìn)入攝像機(jī)視野中。但是商店UI的位置要求比使用后的背包UI更后面,這樣才能選擇賣背包中的物品給商店。代碼如下:if

(npc.transform.position.x

!=

shopoj.transform.position.x

||

npc.transform.position.y

!=

shopoj.transform.position.y)//沒(méi)碰到商店

{

ExitK1

=

true;//商店沒(méi)開(kāi)啟

}

if

(npc.transform.position.x

==

shopoj.transform.position.x

&&

npc.transform.position.y

==

shopoj.transform.position.y&&ExitK1)//人物碰到了商店

{

shopbag.transform.position

=

new

Vector3(shopbag.transform.position.x,

shopbag.transform.position.y,

2);

GameObject.Find("npcs1").GetComponent<johnmove>().enabled

=

false;

}

4.6.2商店系統(tǒng)的組成以及功能商店UI主要由6部分組成:一、商店UI貼圖。包括商人頭像貼圖,歡迎語(yǔ)句,以及金幣貼圖。二、菜單??偣灿蟹N子、動(dòng)物、工具、委托單、退出5個(gè)菜單。三、選擇框。包括菜單選擇框以及商品選擇框。四、顯示金幣數(shù)。在商店中會(huì)實(shí)時(shí)顯示你現(xiàn)存的金幣以及你想買的商品的價(jià)格。4.6.3菜單選擇的實(shí)現(xiàn)以及商品頁(yè)面的切換由于菜單只有一行五個(gè),所以移動(dòng)菜單選擇框只需要AD兩個(gè)按鍵監(jiān)聽(tīng)事件,定義一個(gè)int類型變量:當(dāng)前菜單編號(hào)K1用來(lái)記錄移動(dòng)到哪個(gè)菜單,當(dāng)按觸發(fā)鍵盤AD按鍵事件,菜單編號(hào)就會(huì)增減,菜單選擇框也會(huì)向左向右移動(dòng),所有的商品頁(yè)面都會(huì)隱藏gameObject.SetActive(false);然后對(duì)應(yīng)當(dāng)前菜單編號(hào)的商品頁(yè)面設(shè)置為顯示gameObject.SetActive(true);。當(dāng)菜單選擇框移動(dòng)到退出菜單時(shí),商店UI退出攝像機(jī)視野,位置回到z==10000。由于選擇框的移動(dòng)會(huì)與游戲中主角的移動(dòng)相矛盾,所以在開(kāi)啟商店時(shí),主角的移動(dòng)腳本將被關(guān)閉。代碼如下:if

(Input.GetKeyDown(KeyCode.A)&&K1!=0&&

shopbag.transform.localPosition.z==4&&

DontUningShopLconthing)//按A鍵上一個(gè)菜單{K1--;Blackkuan1.transform.localPosition

=

ShopLconmenu[K1];}if

(Input.GetKeyDown(KeyCode.D)

&&

K1

!=

5

&&

shopbag.transform.localPosition.z

==

4&&

DontUningShopLconthing)//按D鍵下一個(gè)菜單{K1++;Blackkuan1.transform.localPosition

=

ShopLconmenu[K1];}if

(Input.GetKeyUp(KeyCode.S)&&

DontUningShopLconthing)//按S鍵轉(zhuǎn)到商品欄{Blackkuan2.gameObject.SetActive(true);DontUningShopLconthing

=

false;K2

=

0;}if

(K1==5)//當(dāng)選到第六個(gè)菜單退出商店UI{K1

=

0;Blackkuan1.transform.localPosition

=

ShopLconmenu[K1];ExitK1

=

false;shopbag.transform.position

=

new

Vector3(shopbag.transform.position.x,

shopbag.transform.position.y,

9998);GameObject.Find("npcs1").GetComponent<johnmove>().enabled

=

true;return;}4.6.4商品的選擇在商品頁(yè)面中,所有的格子位置和背包格子位置的設(shè)置方法一樣,并在之后將所有商品的位置移動(dòng)到對(duì)應(yīng)編號(hào)的格子位置。商品選擇框的初始狀態(tài)設(shè)置為隱藏,當(dāng)鍵盤監(jiān)聽(tīng)事件S觸發(fā)時(shí),商品選擇框?qū)@示,并且將菜單選擇框的移動(dòng)功能關(guān)閉。商品選擇框的移動(dòng)功能也和背包系統(tǒng)中選擇框的移動(dòng)功能實(shí)現(xiàn)方法一樣。代碼如下:Blackkuan2.transform.localPosition

=

ShopLconthing[K2];

if

(Input.GetKeyDown(KeyCode.A)

&&

K2

!=

0

&&

shopbag.transform.localPosition.z

==

4&&bag.transform.position.z>10)

{

K2--;

Blackkuan2.transform.localPosition

=

ShopLconthing[K2];

}

if

(Input.GetKeyDown(KeyCode.D)

&&

K2

!=

19

&&

shopbag.transform.localPosition.z

==

4

&&

bag.transform.position.z

>

10)

{

K2++;

Blackkuan2.transform.localPosition

=

ShopLconthing[K2];

}

if

(Input.GetKeyUp(KeyCode.W)

&&

K2

>9

&&

shopbag.transform.localPosition.z

==

4

&&

bag.transform.position.z

>

10)

{

K2=K2-10;

Debug.Log(K2);

Blackkuan2.transform.localPosition

=

ShopLconthing[K2];

}

if

(Input.GetKeyDown(KeyCode.S)

&&

K2

<

10

&&

shopbag.transform.localPosition.z

==

4

&&

bag.transform.position.z

>

10)

{

K2

=

K2

+

10;

Blackkuan2.transform.localPosition

=

ShopLconthing[K2];

}

當(dāng)商品選擇框的位置移動(dòng)到最上面一層的商品,此時(shí)再按W按鍵,菜單選擇框的移動(dòng)功能將重新開(kāi)發(fā),并且商品選擇框的顯示狀態(tài)將關(guān)閉。代碼如下:if

(Input.GetKeyDown(KeyCode.W)

&&

K2

<

10

&&

shopbag.transform.localPosition.z

==

4

&&

bag.transform.position.z

>

10){K2

=

0;Debug.Log(123123123);Blackkuan2.transform.localPosition

=

ShopLconthing[K2];Blackkuan2.gameObject.SetActive(false);DontUningShopLconthing

=

true;}4.6.5金幣系統(tǒng)在背包與商店的交互中需要貨幣系統(tǒng)來(lái)實(shí)現(xiàn)物品交互。所有物品都要有價(jià)格,因此為所有物品添加腳本,在腳本中聲明一個(gè)公共int變量buythingmoney存該物品的價(jià)格。在背包中新添一個(gè)公共int變量money用來(lái)存現(xiàn)存的金幣數(shù)量。商店UI的顯示金幣模塊腳本中引用背包中的現(xiàn)存金幣數(shù),并且獲取子節(jié)點(diǎn)中的文字對(duì)象,將文字對(duì)象中的數(shù)字組件的值顯示為現(xiàn)存金幣數(shù)。當(dāng)商品選擇框移動(dòng)到商品上面時(shí),獲取商品腳本中的金幣變量,并同理顯示到商品價(jià)格模塊中。代碼如下:圖4-3物品價(jià)格屬性int

buythingmoney=0;//獲取商品價(jià)格buything

=

Blackkuan2.transform.GetComponent<shoppnegzhuang>().shoppeng;//商品選擇框碰撞判斷選擇的商品if(Blackkuan2.transform.GetComponent<shoppnegzhuang>().shoppeng){buythingmoney

=

buything.transform.GetComponent<cunnon>().gold;//獲取商品本身腳本的價(jià)格}4.6.6購(gòu)買商品如果現(xiàn)存金幣數(shù)大于商品價(jià)格,并且在商品選擇框移動(dòng)到商品上并且按下鍵盤按鍵E后,獲取背包系統(tǒng)中的碰撞判斷物體,并將該變量改為所選商品的名字。在背包腳本中復(fù)制添加腳本的函數(shù),并且給該函數(shù)增加判斷條件:當(dāng)商店開(kāi)啟,并且按下按鍵E,這樣之后就能把商品加入背包。并且將現(xiàn)存金幣數(shù)減去商品的價(jià)格,文字組件重新顯示。代碼如下:GameObject

abc

=

Instantiate(buything);

=

;GameObject.Find("npcs1/Main

Camera").GetComponent<BAG>().panduanduixiang

=

abc;//把買了的商品改成背包欄中判斷添加的對(duì)象shopgetbuything

=

true;Debug.Log("panduanduixiang:

"

+

GameObject.Find("npcs1/Main

Camera").GetComponent<BAG>().);Debug.Log("shopgetbuything"

+

shopgetbuything);weather.GetComponent<weather>().money

=

weather.GetComponent<weather>().money

-

buythingmoney;//減了商品價(jià)格后的錢4.6.7出售商品在商店開(kāi)啟的基礎(chǔ)上,如果再開(kāi)啟背包就可以出售背包中的商品。由于要顯示物品的價(jià)格,因此新建一個(gè)出售UI,用來(lái)顯示背包圖標(biāo)的價(jià)格,出售UI的位置要求在背包位置的上面。在出售UI的腳本中,出售UI的初始位置為z==10000,如果商店系統(tǒng)和背包系統(tǒng)同時(shí)打開(kāi),出售UI的位置改為z==1.5。在背包中的圖標(biāo)選擇框移動(dòng)時(shí),商店中的商品選擇框和菜單選擇框兩者的移動(dòng)函數(shù)關(guān)閉。在背包中,復(fù)制腳本的使用物品函數(shù),限定條件改為商店開(kāi)啟,背包開(kāi)啟。銷售結(jié)束后,將現(xiàn)存金幣數(shù)加上商品的價(jià)格,文字組件重新顯示。代碼如下:if

(Input.GetKeyDown(KeyCode.E)

&&

shopbag.transform.position.z<10&&bag.transform.position.z<10)//在背包狀態(tài)按下E,刪除物品{int

abc

=

int.Parse(bag.transform.GetChild(savei

+

2).transform.GetChild(0).GetComponent<TextMesh>().text);abc--;string

sn

=

bag.transform.GetChild(savei

+

2).name;bsn

=

true;weatherth.transform.GetComponent<weather>().money

=

weatherth.transform.GetComponent<weather>().money

+

bag.transform.GetChild(savei

+

2).transform.GetComponent<cunnon>().gold;bag.transform.GetChild(savei

+

2).transform.GetChild(0).GetComponent<TextMesh>().text

=

abc.ToString();return;}4.7植物系統(tǒng)實(shí)現(xiàn)4.7.1時(shí)間系統(tǒng)在種下種子之后,該植物會(huì)隨著天數(shù)的增加而慢慢成長(zhǎng)。因此需要添加時(shí)間系統(tǒng)。在游戲場(chǎng)景的燈光對(duì)象中新添一個(gè)腳本,聲明公共int對(duì)象:已過(guò)天數(shù)。已過(guò)天數(shù)初始值為一,并且隨著限定事件發(fā)生,值+1。圖4-4聲明公共變量已過(guò)天數(shù)4.7.2種下種子復(fù)制背包的使用物品函數(shù),給函數(shù)添加限定條件:使用的圖標(biāo)的標(biāo)簽為種子,主角處理格的判斷對(duì)象為澆了水的耕地。此時(shí)按下按鍵E,公共字符串變量:判斷對(duì)象即為使用的種子名字。在開(kāi)墾澆過(guò)水的耕地新添腳本,聲明字符串對(duì)象:使用的種子seed,如果背包的判斷對(duì)象為濕潤(rùn)耕地自身,則引用背包的使用物體,賦值與使用種子名字,聲明游戲?qū)ο螅褐仓阯owseed,然后從資源文件夾中查詢使用種子名字所對(duì)應(yīng)的種子,將其賦值于植株,并將植株于作為子節(jié)點(diǎn),復(fù)制到濕潤(rùn)耕地中。因?yàn)槌霈F(xiàn)了同一片濕潤(rùn)耕地可以同時(shí)種下多顆種子的情況,所以要在添加種子的函數(shù)中添加判斷條件:濕潤(rùn)耕地自身的子節(jié)點(diǎn)數(shù)目為0。gameobject.transform.childCount<1。4.7.3種子的成長(zhǎng)當(dāng)種下了種子以后,種子會(huì)隨著已過(guò)天數(shù)的增加而長(zhǎng)大。因此在腳本中聲明int類型變量:已有日期,初始值為0.聲明int類型變量:出生日期,初始值為0。引用已過(guò)日期,當(dāng)種子種下的時(shí)候出生日期被賦值于已過(guò)日期。已過(guò)日期減去出生日期的值賦值于已有日期。代碼如下:string

hsname

=

"

";

hsname

=

GameObject.Find("npcs1/Main

Camera").GetComponent<BAG>().handseed;

seed

=

(GameObject)Resources.Load("prefab/planting/"

+

hsname);

dealweather

=

GameObject.Find("Directional

Light");

ae

=

dealweather.GetComponent<weather>().nowdaytime;

GameObject

panduanplant

=

seed;

nowseed

=

Instantiate(panduanplant);

nowseed.transform.parent

=

tuself.transform;

nowseed.transform.position

=

tuself.transform.position;

nowseed.transform.localPosition

=

new

Vector3(0,

0,

-0.1f);

danxiang

=

false;

4.7.4植物圖片的改變植物的圖片會(huì)隨著已過(guò)日期的增加而改變,直至其成熟。在處理植物素材的時(shí)候,將對(duì)應(yīng)植物素材的名字按照成長(zhǎng)程度順序排序,并將其名字改為:植物種子+數(shù)字順序。在植物已有天數(shù)函數(shù)中,隨著已有天數(shù)增加,聲明一個(gè)字符串類型:植物名字,將植株的名字刪除后兩位字符串,然后加上已過(guò)天數(shù),將其賦值于植物名字,之后從資源文件中查詢植物名字對(duì)應(yīng)的物體,將其賦值于植株,植株作為子節(jié)點(diǎn)復(fù)制進(jìn)濕潤(rùn)土壤中。代碼如下:if

(abc

<

5

&&

abc

!=

0)

{

Destroy(nowseed);

panduanplant

=

(GameObject)Resources.Load("prefab/planting/"

+

+

abc.ToString());

nowseed

=

Instantiate(panduanplant);

nowseed.transform.parent

=

tuself.transform;

nowseed.transform.position

=

tuself.transform.position;

nowseed.transform.localPosition

=

new

Vector3(0,

0,

-0.1f);

return;

}

4.7.5植物的成熟與收獲當(dāng)植物隨著已過(guò)天數(shù)慢慢成長(zhǎng),終于成長(zhǎng)成熟,成為農(nóng)作物。在腳本中聲明int類型:成熟所需天數(shù)。當(dāng)已有天數(shù)等于成熟所需天數(shù),則將植株字符串刪去后4位,即為農(nóng)作物的名字,刪除植株,在資源文件中查詢?cè)撁炙鶎?duì)應(yīng)的物體,將其賦值于植株,然后將其作為子節(jié)點(diǎn)復(fù)制進(jìn)濕潤(rùn)土壤中。為了將其收獲入背包之中,需要主角的處理格能與該農(nóng)作物作交互。因此需要給農(nóng)作物加上碰撞體組件。由于濕潤(rùn)的耕地也有碰撞體,因此處理格所判斷的對(duì)象會(huì)受濕潤(rùn)耕地的干擾。在絲潤(rùn)土地增加種子的腳本中,如果濕潤(rùn)耕地?fù)碛凶庸?jié)點(diǎn),則將濕潤(rùn)耕地的碰撞體組件關(guān)閉。如果濕潤(rùn)耕地沒(méi)有子節(jié)點(diǎn),則將濕潤(rùn)耕地的碰撞體組件重新打開(kāi)。代碼如下:Destroy(nowseed);

string

a

=

.Substring(0,

.Length

-

2);

panduanplant

=

(GameObject)Resources.Load("prefab/nongzuowu/"

+

a);

=

("冬瓜");

nowseed

=

Instantiate(panduanplant);

nowseed.transform.parent

=tuself.transform;

nowseed.transform.position

=

tuself.transform.position;

nowseed.transform.localPosition

=

new

Vector3(0,

0,

-0.1f);

ifend

=

false;

return;

4.8動(dòng)物系統(tǒng)實(shí)現(xiàn)4.8.1動(dòng)物的添加牧場(chǎng)總共有三個(gè),用來(lái)培養(yǎng)不同的動(dòng)物。在商店購(gòu)買了動(dòng)物之后,獲取動(dòng)物商品的名字,不需要通過(guò)背包,直接通過(guò)名字查詢特定的牧場(chǎng),然后把動(dòng)物幼崽添加到牧場(chǎng)。先在牧場(chǎng)腳本聲明公共int類型變量:當(dāng)前的動(dòng)物數(shù)量animalnum,初始值為0,當(dāng)買了動(dòng)物之后,獲取該變量,使其+1。代碼如下:if(K1==2)//當(dāng)選了動(dòng)物欄,并且買了動(dòng)物。不用把商品加入背包,動(dòng)物自動(dòng)出現(xiàn){string

abc

=

+

"zoo";GameObject.Find(abc).GetComponent<addanimal>().animalnum++;}4.8.2動(dòng)物的加載牧場(chǎng)腳本聲明一個(gè)int變量:牧場(chǎng)動(dòng)物舊數(shù)量oldanumalnum,初始值為0。因?yàn)槟翀?chǎng)的動(dòng)物數(shù)量會(huì)動(dòng)態(tài)增加,所以當(dāng)前動(dòng)物數(shù)量減去舊的動(dòng)物數(shù)量就等于需要增加的動(dòng)物數(shù)量。之后舊數(shù)量被賦予新數(shù)量的值。從資源文件里查詢與動(dòng)物名字相同的動(dòng)物,作為子節(jié)點(diǎn)Instantiate增加入牧場(chǎng)對(duì)象。代碼如下:if

(oldanumalnum

<

animalnum){for

(int

a

=

0;

a

<

animalnum

-

oldanumalnum;

oldanumalnum++){GameObject[]

savanimal

=

new

GameObject[animalnum];savanimal[oldanumalnum]

=

Instantiate(loadanimal);savanimal[oldanumalnum].transform.parent

=

zooself.transform;savanimal[oldanumalnum].transform.position

=

zooself.transform.position;Vector2

zs

=

new

Vector2(GameObject.Find("Directional

Light").GetComponent<weather>().nowdaytime,

0);}}4.8.3動(dòng)物的隨機(jī)移動(dòng)在牧場(chǎng)里的動(dòng)物會(huì)隨機(jī)移動(dòng),但是動(dòng)物又不會(huì)移動(dòng)出柵欄在腳本中聲明四個(gè)Int類型變量,用來(lái)記錄柵欄中格子位置中X和Y最大值和最小值。由于動(dòng)物隨機(jī)會(huì)往上下左右四個(gè)方向移動(dòng),使用隨機(jī)函數(shù)Random.Range(1,5);1到4代表四個(gè)方向。再隨時(shí)記錄牧場(chǎng)XY最大值最小值減去動(dòng)物自身的坐標(biāo),就可以得到動(dòng)物能移動(dòng)的最大距離。再使用Random.Range(1,最大距離);就可以實(shí)現(xiàn)動(dòng)物的隨機(jī)移動(dòng)。由于動(dòng)物這樣移動(dòng)是改變位置,瞬間移動(dòng)的,使用平滑阻尼Mathf.SmoothDamp()將動(dòng)物追蹤生成的坐標(biāo)就可以實(shí)現(xiàn)平滑移動(dòng)。代碼如下:int

MaxX

=

11;int

MinX

=

4;int

MaxY

=

9;int

MinY

=

6;switch

(suijizb){case

1:float

a;Vector3

abc1=

chunzan.transform.position;a

=

chunzan.transform.position.x;a

=

Random.Range((int)animalOJ.transform.position.x,

MaxX

+

1);abc1.x

=

a;chunzan.transform.position

=

abc1;break;case

2:float

b;Vector3

abc2

=

chunzan.transform.position;b

=

chunzan.transform.position.x;b

=

Random.Range(MinX,

(int)animalOJ.transform.position.x

+

1);abc2.x

=

b;chunzan.transform.position

=

abc2;break;case

3:float

c;Vector3

abc3

=

chunzan.transform.position;c

=

chunzan.transform.position.y;c

=

Random.Range(MinY,

(int)animalOJ.transform.position.y

+

1);abc3.y

=

c;chunzan.transform.position

=

abc3;break;case

4:float

d;Vector3

abc4

=

chunzan.transform.position;d

=

chunzan.transform.position.y;d

=

Random.Range((int)animalOJ.transform.position.y,

MaxY

+

1);abc4.y

=

d;chunzan.transform.position

=

abc4;break;}4.8.4動(dòng)物的成長(zhǎng)在腳本中聲明int類型變量:動(dòng)物出生日期,在增加動(dòng)物的時(shí)候,引用已過(guò)天數(shù),賦值給出生日期。已過(guò)日期減去出生日期就等于動(dòng)物成長(zhǎng)天數(shù)。在動(dòng)物腳本中定義動(dòng)物成熟所需要的時(shí)間,當(dāng)動(dòng)物成長(zhǎng)天數(shù)haveday等于動(dòng)物成熟所需要的時(shí)間needday,刪除該動(dòng)物貼圖,然后從資源文件中加載成熟期的動(dòng)物圖片。代碼如下:if

(haveday

>=

needday

&&

firstonr){Destroy(animalOJ);chuntu

=

(GameObject)Resources.Load("prefab/animals/cow");animalOJ

=

Instantiate(chuntu);animalOJ.transform.parent

=

transform;animalOJ.transform.position

=

transform.position;firstonr

=

false;}4.9飼料系統(tǒng)實(shí)現(xiàn)隨著天數(shù)增加,如果動(dòng)物沒(méi)用飼料食用,動(dòng)物也不會(huì)成長(zhǎng)的,如果有優(yōu)質(zhì)的飼料可以使動(dòng)物生長(zhǎng)時(shí)間縮短。為此需要新建一個(gè)飼料UI,顯示所添加的飼料,和合成的普通飼料,以及優(yōu)質(zhì)飼料。4.9.1飼料槽UI以及位置飼料槽UI由3部分組成:一、UI框架;二、所添加的三種飼料格子;三、所合成的普通飼料和優(yōu)質(zhì)飼料的數(shù)目。在牧場(chǎng)門前設(shè)置碰撞體,當(dāng)主角處理格碰撞到該碰撞體,飼料槽UI將顯示在攝像機(jī)視野中,否則飼料槽UI的z位置為1000。4.9.2飼料槽飼料的添加在背包腳本中復(fù)制使用物體的函數(shù),并添加限定條件:先當(dāng)飼料槽UI顯示,背包UI顯示時(shí),在背包使用的物體將為飼料槽中的飼料配方。在飼料槽腳本中,聲明一個(gè)長(zhǎng)度為3的字符串組:飼料槽組inst,用來(lái)存放所添加的飼料配方。聲明一個(gè)int類型對(duì)象:當(dāng)前飼料槽編號(hào)foodpsnownum,用來(lái)存放當(dāng)前使用的飼料槽,初始值為0。獲取背包中的飼料配方,根據(jù)名字從資源文件中加載相對(duì)應(yīng)的物體,將其復(fù)制到飼料槽組中,當(dāng)前飼料槽編號(hào)加1。當(dāng)飼料槽編號(hào)為3,將飼料槽組清空,飼料槽編號(hào)為零。聲明一個(gè)int類型變量:普通飼料數(shù)量ptsiliao,初始值為0。普通飼料數(shù)量加1。每種

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論