




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
摘要隨著人們日常生活內容的豐富,以及現代計算機技術的提升,計算機游戲成為了一個嶄新的娛樂載體漸漸進入了大家的視野。在眾多類型游戲之中,模擬養成類游戲始終是一棵常青樹,經久不衰。模擬類型游戲的宗旨是把人們向往的生活帶到游戲中,體驗不同的生活方式。本研究項目是一款模擬農場生活,體驗田園風光的模擬類養成游戲,基于Windows10系統Unity3D引擎并且采用編程語言C#制作。在制作過程中,使用Photoshop進行素材以及UI界面的處理。本研究項目許多功能借鑒于小時候的農村經歷,將日常生活中的農作物耕作,以及與家畜的互動加入游戲中,因此玩家在體驗該游戲時會有更多的真實感,會有更深層次的沉浸式體驗。本研究項目的初衷是推廣農村文化,讓玩家對農村生活有更多的了解,并且喜歡上農村生活。□□關鍵詞:模擬農場游戲Unity3D場景交互農作物動物AbstractWiththeenrichmentofpeople'sdailylifeandtheimprovementofmoderncomputertechnology,computergameshavebecomeabrand-newentertainmentcarrierandgraduallycomeintoourvision.Amongthemanytypesofgames,thesimulatednurturinggameisalwaysanevergreentree.Thepurposeofsimulationtypegameistobringpeople'syearninglifeintothegameandexperiencedifferentlifestyles.Thisresearchprojectisasimulationgameoffarmlifeandruralscenery,Itisbasedonunity3dengineofwindows10systemandmadebyC#.Intheprocessofproduction,PhotoshopisusedtoprocessmaterialsandUIinterface.Manyfunctionsofthisresearchprojectdrawlessonsfromtheruralexperienceinchildhood,Addthefarmingofcropsindailylifeandtheinteractionwithlivestocktothegame,soplayerswillexperiencethegamewithmorerealismanddeeperimmersionexperience.Theoriginalintentionofthisresearchprojectistopromoteruralculture,sothatplayerscanhavemoreunderstandingofrurallife,andletthemlikerurallife.□□Keywords:SimulationfarmgameUnity3DSceneinteractioncropsanimals廣東東軟學院本科生畢業設計(論文)目錄TOC\o"1-3"\u第一章 引言 引言研究背景與意義隨著科學技術的提升,電腦已經成為人們日常生活中不可或缺的一部分,電子信息技術不僅應用在人們日常的辦公中,從電子信息技術中誕生了許多的娛樂媒體,充實了人們日常生活中的娛樂。在眾多的娛樂媒體中,電子游戲作為新興的娛樂載體,成為了在日常生活中讓人們喜聞樂見娛樂項目。迄今為止,游戲產業在我國蓬勃發展,提供了許多的就業崗位,為我國生產總值貢獻了越來越多的力量,與游戲制作相關的職業也成為了前景較好的職業。為了研究電子游戲的開發過程,在本項目中,我選擇制作一模擬養成農場類游戲作為研究對象。模擬類游戲的發展現狀隨著游戲技術的發展,電子游戲也發展出了許多方向、類型的游戲種類。其中模擬類游戲作為一種較為經典的游戲種類,從誕生開始一直經久不衰。在早期的電腦游戲中,《三維彈球之太空軍校生》就是一款比較經典的模擬類游戲。該游戲就是模擬當時社會中比較流行的彈珠彈球游戲的內容創作的。當時該電腦游戲出現后,銷量一直火爆,直到現在依然是人們所津津樂道的游戲。模擬類游戲的主要方向是:從已有日常生活中獲得靈感,在游戲中模擬出這種生活文化,讓玩家即使沒有親身經歷這種生活也能感同身受。模擬類游戲從某種意義來說就是日常生活的延伸,不僅可以讓玩家獲得游戲上的享受,更是或多或少的宣傳了被模擬的生活文化。農場游戲目前的發展在電子游戲發展的歷史長河中,不乏許多農場養成游戲名作,比如十幾年前的《牧場物語:礦石鎮的伙伴們》;在steam平臺中前些日子比較火的《星露谷物語》和國人自行研發的《波西亞時光》;還有時下刷屏各大媒體平臺,話題量火爆的《集合!動物森友會》。農場游戲一直以貼近自然,休閑放松而著稱。目前人們快節奏的生活給予了人們很多壓力,人們開始向往以前美好的田園生活。在農場游戲中,玩家可以體驗與自然的接觸,享受豐收的喜悅,感受與動物的交往,農場游戲無疑是人們緊張生活時的一款緩沖劑。在讓玩家享受游戲之外,農場游戲還向玩家宣傳了自然知識,農村文化,讓玩家知道生活中食物的來源,了解到食物來之不易。章節安排為了方便閱讀,我將在這里闡述本論文的主要內容,以及各個章節的組成部分。第一章:引言。介紹研究的背景以及意義、模擬游戲的發展、農村游戲的現狀。第二章:使用工具。介紹所使用工具,在制作游戲過程中所起到的作用。第三章:游戲功能設計。介紹創作游戲的想法,策劃該游戲的功能,游戲的操作方法。第四章:功能實現。實現所設計的功能的過程,實現功能過程中的難點、具體步驟和主要思路。第五章:游戲測試。將游戲導出打包,進行測試以及運行結果。
使用工具2.1Unity3D引擎2.1.1介紹Unity3D第一個版本由UnityTechnologie公司于2005年6月發布。Unity3D引擎搭載的編程語言是C#,方便使用者輕松的創建游戲。除了創建游戲以外,Unity3D還廣泛的應用于制作動畫,建筑三維建模等方面。2.1.2在本游戲中的應用本游戲是以Unity3D引擎為平臺來進行開發設計的。在Unity3D中進行了模型的整合,場景的搭建,各個游戲對象的層級判斷和位置判斷。除此之外,Unity3D還作為了一個中間橋梁,將腳本與游戲對象聯系起來,并且將腳本所編寫的功能于游戲對象上實現。Unity3D本身還提供了各種組件,節省了腳本實現功能的工作量,讓使用者更加有效率的創建游戲。在運行腳本的時候,Unity3D還提供檢查功能,如果腳本報錯,它會提醒使用者錯誤的來源地。2.2VisualStudio2.2.1介紹VisualStudio第一個版本由微軟公司于1997年發布。VisualStudio是一個完整的開發工具集,適用于微軟的所有平臺。VisualStudio早期版本的語言開發主要是C++。在編寫游戲腳本中使用的C#最早是于2002年版本所開發的面向對象的編程語言。2.2.2在本游戲中的應用編寫游戲腳本所使用的工具,所使用的編程語言為VisualStudio所自帶的C#。2.3PhotoShop2.3.1介紹PhotoShop是由Adobe公司開發的專門用于對圖片進行處理以及編輯的專業工具。PhotoShop具有強大的的編修以及繪圖功能,除了處理編輯圖片以外,它還在文字、視頻、出版等方面有廣泛的運用。2.3.2在本游戲中的應用制作游戲時對素材進行處理的工具。獲取了初始資源后,通過PhotoShop對其進行截取,修改大小,編輯形狀,最終成為游戲素材。游戲中的UI界面也是通過PhotoShop的圖形繪畫制作的,通過繪制基本圖形,再加以整合,貼圖。2.4Unity3d使用相關函數Start:當腳本被加載時執行,并且只執行一次。Update:腳本實時調用。GetComponent:獲取對象組件信息。Destroy:摧毀對象。Return:返回函數。Instantiate:添加對象。GameObject.Find:從游戲中查詢對象。Public:聲明公共對象,可以被外部調用。Private:聲明私有對象,不可以被外部調用。If:判斷語句。如果符合判斷條件則繼續向下執行。For:循環語句。如果符合條件則繼續使用,不符合則跳出循環。Load:從文件中加載資源。Substring:檢索字符串。
游戲功能設計3.1場景設計3.1.1游戲功能結構 游戲功能結構如下圖所示圖3-1功能結構聯系圖
3.1.2素材選擇以及美工畫風本游戲是一款畫風為像素風格的模擬養成類型的農場游戲,基于這個游戲格調,場景素材以及人物素材自然就不能選擇3D的模型素材,應該選擇像素風的游戲素材,應該考慮像是塞班平臺的《阿爾卑斯牧場物物語》、GameBoy平臺的《礦石鎮的伙伴》這類型的游戲的模型和人物、動物、植物素材就比較符合游戲的基調,在處理本游戲素材的時候,美工就可以向它們借鑒。圖3-2礦石鎮的伙伴圖3-3阿爾卑斯牧場物語3.1.3場景素材以及地圖規劃本游戲的場景對象組成主要有4種:建筑、人物、動物、植物、自然風光、工具、以及UI界面。建筑主要的建筑是主角的家、商店、柵欄。家:主要的作用就是讓主角恢復體力,并且加速時間的流逝,到第二天。商店:主要作用就是提供一個交易平臺,讓主角能購買植物的種子、動物幼崽。并且能讓主角賣出自己的農作物以及動物。柵欄:用來限制動物的移動,當從商店處購買動物幼崽的時候,動物幼崽將出現在這里。柵欄里面還需要2個功能塊:a、飼料槽C、收獲槽。喂養槽用來放飼料,收獲槽用來收獲動物產品。人物總共需要4個,分別是左、右、上、下四個行走的模型。圖3-4人物模型動物羊、雞、牛、羊、兔五種動物模型。以及羊毛、雞蛋、牛奶、兔肉、羊肉、牛肉、雞肉各種模型。圖3-5動物
植物植物有冬瓜、可可、向日葵、土豆、小麥、檸檬、橘子、玉米、番茄、稻米、窩瓜、紅玫瑰、藍玫瑰、肉桂、茄子、草莓、菠蘿、蘿卜、葡萄、黃瓜。每種農作物還需要5個生長狀態,在生長狀態里面還包括種子和果實。圖3-6植物自然風光自然風光里面包括可互動的以及不可互動的兩種。不可互動的是各種地圖裝飾品,像是草地,樹木。可互動的包括河流、地障。地障礙包括:樹樁、巖石、雜草。每種地障都有兩種狀態貼圖。圖3-7障礙物工具工具總共包括:鐮刀、斧頭、錘子、鋤頭、水壺。圖3-8工具3.2主角操作3.2.1移動主角通過“W”“A”“S”“D”以及上下左右箭頭移動。在移動的時候,主角會因為位置的移動而改變動作模型。比如說按下“A”向左走,模型也會切換成向左的模型。當主角移動到有障礙的地方就不能移動,像是建筑物,樹木等。3.2.2與其他場景對象的互動與其他物體的互動鍵都是“E”鍵。當主角與房屋大門互動的時候,可以進入屋子,與屋子內的床互動的時候可以跳到下一天。當與商店大門互動可以購買物品。與喂養槽互動可以加飼料,與收獲槽互動可以收獲動物產品。與小河互動可以為水壺裝水。與耕地互動可以改變地形或者播種,收獲農產品。3.2.3打開背包以及工具箱背包:按“X”鍵打開背包系統。在背包系統下按“W”“A”“S”“D”控制物品的選擇,再按下“E”實現物品的使用。工具箱:按下鍵盤的1、2、3、4、5、6鍵改變工具的選擇。圖3-9背包3.3植物系統想要種植植物,收獲農作物,首先要去商店購買種子,然后清理耕地上的雜物,耕好田,再澆上水,這樣才能把種子種進地里。每種植物都有兩個屬性:水分值以及品質。隨著時間的流逝,每個植物都需要澆水,如果沒有澆水會影響植物的生長。植物的成長總共有五個階段,每個階段都有獨立的貼圖。隨著時間的改變,植物會慢慢成長,從種子最終長成農作物。
圖3-10植物系統3.4動物系統想要養動物,并且收獲動物產品,首要去商店購買動物幼崽,購買后商店會把動物幼崽放入柵欄里面。動物幼崽有兩個屬性:饑餓度以及成長度。隨著時間的流逝,動物需要喂養飼料,不然會影響成長。在飼料方面,每種農作物都能作為普通飼料,每種動物都可以使用普通飼料和最佳飼料。但是每種動物的最佳飼料都不一樣,喂養合適的飼料可以縮減動物的成長時間。到了動物成熟期以后,每種動物會產生不同的副產品:雞產生雞蛋,牛產生牛奶,羊產生羊毛。圖3-11動物系統3.5工具系統在耕作農作物之前需要先將荒地開墾成耕土,然而荒地上的障礙物也是多種多樣的,并且清除障礙物的難度也是不同的。開不同的墾障礙物也需要不同的開墾工具。開墾完荒地之后土地會變成耕地。如果想要在耕地上種植農作物,還需要先吧耕地澆水潤濕。工具系統總共有五種工具:空手,鐮刀,斧頭,錘子,鋤頭,水壺。如果耕地不種植物,開墾好的田地又會重新變成荒地,需要重新開墾。荒地的類型總共有三種,雜草,石頭,木樁。每種荒地都有小和大兩種不同的程度。開墾每種不同的荒地需要不同的工具:雜草對應鐮刀;斧頭對應木樁;錘子對應石頭。每種荒地都有耐久值,只有用工具不停的處理荒地,荒地才能減輕程度,最終變為空地。變成空地后需要用鋤頭耕耘才能變成耕地。變成耕地后種子還不能種下,需要用水壺去小河接水后濕潤了耕地后才能種下種子。在使用工具的時候,如果使用錯了工具,工具將會消耗耐久值,如果耐久值變成零了,就不能使用了,需要去商店修理才能繼續使用。隨著玩家經濟實力的提升,玩家可以去商店用金錢升級工具。升級后的工具不僅耐久值會增加,提高容錯率,還能提高生產效率。圖3-12工具系統3.6商店系統商店是玩家獲得初始生產材料,或者出售生產產品的平臺。操作方法和背包系統一樣,“W”“A”“S”“D”控制選擇的物品,按“E”出售自己的農產品和動物產品。在商店里有許多可以購買的東西,如植物種子,動物幼崽,動物普通飼料。還能升級自己的工具,以及接取不同的訂單任務。如果只是普通的購買種子,種成農作物,出售農作物的話,賺錢始終是不夠快的。如果接取了訂單,并且按照訂單的要求生產農作物或者是動物產品的話,玩家將獲得更多的收入。
圖3-13商店系統
游戲功能實現4.1場景與素材加載4.1.1距離單位在游戲開始制作之前,首先要把自己精心準備的背景以及人物素材,人物動作素材,植物素材,動物素材,以及各種各樣的房屋建筑和自然場景加載入項目之中。這些素材將作為游戲腳本的載體來使用,不然就算編寫了腳本,也沒有實現功能的載體。并且在編寫腳本來實現各種功能之前,首先要考慮素材的基本屬性,并貼合素材的狀況來編寫腳本,這樣才保證素材能契合項目屬性。圖4-1網格紙4.2主角動作切換以及移動4.2.1動作切換主角有8個動作圖片切換,在同個方向行走的時候動作會切換左右腳。通過wasd上下左箭頭按鍵移動。先是實例動作圖片入腳本。這里有兩種方法:第一種方法:通過(GameObject)Resources.Load("prefab/");用名字查詢。第二種方法:直接在腳本public對象,然后在引擎中拖入對象進腳本組件。圖4-2載入游戲對象4.2.2監聽鍵盤按鍵事件通過Input.GetKeyDown(KeyCode.S)實現。每個方向的移動就通過監聽WASD按鍵來控制移動的方向。4.2.3人物的距離移動使用transform.Translate改變主角的位置。在移動之前,要先聲明一個變量MoveSpeed,用來記錄移動的距離。由于游戲是2d游戲,所以不用改變主角Z方向軸的的位移,只需要改變X,Y方向的位置。每當按下WS時使用transform.Translate(0,MoveSpeed,0);,按下AD時使用就可以transform.Translate(MoveSpeed,0,0);實現在XY方向軸上的位移了。由于攝像機是跟著主角移動的,只要把攝像機的初始位置和主角位置一樣,然后把攝像機放進主角里面就可以實現攝像機跟著主角走了。4.2.4人物動作圖片切換先統一把8張圖片的Z位置調整到攝像機看不見的地方GameObject.transform.position.Z==101。在移動的時候每個方向的圖片都有左右腳的變化,這樣才會有走路的感覺。為了實現,使用了偶數的概念。需要聲明一個int變量MoveNum,初始值為0,無論wasd按下,MoveNum都會加1。用來numdown%2確定單雙數,結果為0時游戲中顯示左腳圖片,為1時使用右腳圖片。改變圖片位置先要初始所有圖片Z位置,然后把對應圖片的位置調到視野中。代碼如下: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場景互動與處理格4.3.1處理格主角無論怎么移動,正前方永遠用來判斷處理的事物對象。新建一個處理格對象point,在腳本中記錄主角的位置,并且監聽鍵盤事件,當按下WASD,先把處理格的位置初始為主角的位置,按鍵為WS,處理格的Y坐標加一或減一。按鍵為AD,處理格的X坐標加一或減一。代碼如下: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場景互動主角的場景事物互動基本都通過處理格來完成。與場景的互動有兩種方式:一、記錄處理格與場景事物的位置,當兩者相同時處理格腳本中的對象即為該物體。二、碰撞實現判斷物體。給處理格加上碰撞體組件和剛體組件,給場景中需要判斷的事物加上碰撞體組件。處理格剛體組件的xyz都固定不能改變,以免在與物體相碰撞時導致處理格位置改變。在腳本中,先聲明碰撞游戲對象duixiang,當處理格與物體在持續碰撞時OnCollisionEnter,處理格聲明的碰撞判斷對象即為該游戲對象,當結束碰撞OnCollisionExit,處理格中的碰撞判斷對象需要被賦值空值NULL,以免在其他功能調用該判斷碰撞對象時出現延遲或者是對象錯誤。代碼如下:
void
OnCollisionStay(Collision
duixiang){peng
=
duixiang.gameObject;bepeng
=
peng;}void
OnCollisionExit(Collision
collision){peng
=
null;}4.4工具系統與障礙物清除4.4.1工具包UI工具包UI主要由3部分組成:一、工具框;二、選擇框;三、工具圖標。工具包一直停留于主角頭頂,并且隨著鍵盤按鍵觸發而出現,并選擇不同的工具,選擇完后自動關閉工具包。先要實例化工具框和選擇框,初始時工具框被隱藏SetActive(false)。記錄下每個工具格的位置。當按下1234,選擇框的位置會移動到對應各自工具的位置,并且將工具框重新顯現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障礙物的生成每天荒地上的障礙物類型都會隨機刷新,除非你先給荒地種上農作物。障礙物類型主要有3種:木樁、雜草、石頭。對應的工具類型為:斧頭、鐮刀、石頭。每種障礙物都有兩個程度的圖形,當障礙物清除到一定程度后,障礙物會轉化為輕程度的障礙物。每天隨機生成障礙物使用函數Random.Range()。先建立一個長度為8的對象數組nongtianzhuangtai,并且把八個不同類型不同程度的障礙物實例進數組。隨機生成的函數由(1,8)之中選擇,隨機到哪個數字,就生成哪個對應數字的障礙物。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個標簽,對應六個不同的工具。在工具包中選擇哪種類型的工具,就把游戲對象處理格chulige的標簽改為對應的標簽。當處理格的位置接觸到需要開墾的荒地,只有處理格的標簽所代表的工具對應上相應的障礙物,荒地之后的判斷才會繼續進行。模擬開墾的過程,需要定義兩個int類型用來存障礙物的耐久度,以及工具每一次開墾的程度。每一次開墾障礙物都會消耗障礙物的耐久度,當障礙物的耐久度下降到一定程度,障礙物會退化為更低一個程度的障礙物,當障礙物的耐久度為零,障礙物會消失。工具可以升級,總共有3個等級的工具。并且每次開墾會使障礙物消耗更多的耐久值。每一次的開墾都會使障礙物閃爍。在障礙物閃爍的過程中,需要增加限定條件,停止障礙物腳本的使用,防止系統報錯。代碼如下: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背包功能實現4.5.1背包的開啟以及位置處理背包由三部分組成:一、背包本體、二、選擇框、三、背包圖標。當背包開啟時,攝像頭畫面將被背包覆蓋,取消背包后才會恢復農場畫面。這里使用了Input.GetKeyDown(KeyCode.X)作為背包的開啟條件。每觸發該按鍵事件之前背包處于z==10000的位置,當按下后背包處于z==2的位置,再觸發一次按鍵事件,背包會重新回到z=10000的位置。實現只需要添加判斷條件:當背包位置z為10000并且按下X就可以實現背包的開啟,當背包位置z為2并且按下X就可以實現背包的關閉。代碼如下: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;//關閉人物行走功能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圖標位置的建立背包設定為4*10的格子位置,通過建立一個長度為40的Vector3數組:格子位置組,用來記錄每個格子的位置,然后通過循環給之后每個格子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處理框的移動背包里通過按下wasd來控制處理框的移動,由于會與游戲場景中主角移動的按鍵相矛盾,會導致在處理框移動的時候,主角也會跟著移動,所以當背包開啟時要關閉主角移動的腳本,當關閉背包時重新開啟主角移動的腳本,通過查詢對象,然后獲取對象腳本組件來實現GameObject.Find("").GetComponent<>().enabled。定義一個int類型處理格位置編號savei用來存放處理格當前所在的格子位置,只要通過改變該對象數字,然后將處理框移動到該數字對象對應的格子位置,就能實現格子的移動。處理格的初始位置為格子的第一格,通過按鍵wasd可以移動到周圍的格子。由于處理框移動會超出背包格子的范圍,因此添加限定條件:當處理格位置編號小于10或大于29時處理格不能向上或向下移動,當處理格位置編號為0或39時不能向或左向右移動。代碼如下:if
(Input.GetKeyDown(KeyCode.W)
&&
savei
>
9)//黑框移動限制,當在背包最上面的時候,不能往上;后面一樣{savei
=
savei
-
10;Vector3
abc
=
firpos[savei];abc.y
=
abc.y
-
aaa;blackkuang.transform.localPosition
=
abc;return;}4.5.4背包圖標的增加在腳本中聲明一個公共字符串變量panduanduixiang,用來存所判斷物品的名字。增加背包里的物體首先要在游戲場景中的物體做判斷。當處理格碰撞到物體時,背包會獲取處理格所碰撞物體的名字,然后根據名字從資源庫中查詢名字來添加物體,并且刪除該碰撞體。建立一個游戲對象數組:圖標組,用來存放所添加的對象cuncopy[],然后圖標組里成員的位置與格子位置組一一對應,這樣就實現了圖標的增加。代碼如下:GameObject
agc
=
(GameObject)Resources.Load("prefab/tubiao/"
+
panduanduixiang.GetComponent<cunnon>().names);cunchaxun
=
GameObject.Find("bag/"
+
panduanduixiang.GetComponent<cunnon>().names);//獲取判斷物體的名字,并且在背包找到對應名字的圖標cuncopy[chuncopynum]
=
Instantiate(agc);//把相應圖標放進背包cuncopy[chuncopynum].name
=
panduanduixiang.GetComponent<cunnon>().names;//圖標的名字==物體的名字cuncopy[chuncopynum].transform.parent
=
bag.transform;//圖標的父節點為背包cuncopy[chuncopynum].transform.localPosition
=
firpos[chuncopynum];//圖標位置為對應序號格子的位置farmertext[chuncopynum]
=
Instantiate(firtext);//把文字放入圖標中farmertext[chuncopynum].transform.parent
=
cuncopy[chuncopynum].transform;farmertext[chuncopynum].transform.position
=
cuncopy[chuncopynum].transform.position;ojnum[chuncopynum]
=
1;4.5.5背包圖標堆疊以及數字顯示添加圖標的時候由于會有圖標重復浪費背包空間的現象,為了避免該現象發生,需要將相同圖標的物體做堆疊,以及顯示堆疊的數目。在游戲場景中新增一個游戲對象firtext,該對象上增加一個文字組件。在腳本中新添一個長度為40的游戲對象數組:文字組farmertext[],用來存放圖標的文字對象。以及新添一個長度為40的int數組:數字組ojnum[],用來存放圖標的堆疊數字,初始值為0。在添加圖標時,先查詢背包的子節點里面有沒有該圖標對象,如果返回值為空,則在背包中添加該物體的新圖標,并且給該圖標子節點文字對象,在數字組中與該圖標編號相同的數字對象值+1,然后文字組中相應的文字的顯示為數字組中對應的數字。如果背包的字節點中存在與該物體相同的圖標,則在數字組中獲取對應該圖標對象的數字,使其+1。代碼如下:if
(cunchaxun
==
null)//檢測背包里沒有這個物體時{GameObject
agc
=
(GameObject)Resources.Load("prefab/tubiao/"
+
panduanduixiang.GetComponent<cunnon>().names);cuncopy[chuncopynum]
=
Instantiate(agc);//把相應圖標放進背包cuncopy[chuncopynum].name
=
panduanduixiang.GetComponent<cunnon>().names;//圖標的名字==物體的名字cuncopy[chuncopynum].transform.parent
=
bag.transform;//圖標的父節點為背包cuncopy[chuncopynum].transform.localPosition
=
firpos[chuncopynum];//圖標位置為對應序號格子的位置farmertext[chuncopynum]
=
Instantiate(firtext);//把文字放入圖標中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//背包里已經有物體了{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背包物品的使用新聲明游戲對象:使用的物品
handname。在移動選擇框之后,如果選擇框內的圖標非空,監聽鍵盤按鍵事件在按下E后,將使用的物品即為處理格位置編號所對應的圖標。如果該圖標的堆疊數字值大于1,該數字值減一;如果該圖標的堆疊數字為1,刪除該圖標。代碼如下:if
(Input.GetKeyDown(KeyCode.E)
&&
foodbag.transform.position.z
==
-0.5f)//在背包狀態按下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;}由于刪除該圖標后,背包中被刪除的圖標所在的格子位置會空出來,所以要將刪除圖標后面的圖標前進一位。新建一個循環,將圖標組中編號大于刪除圖標編號的圖標對象,位置新改為格子位置組中自身編號減一的格子位置。代碼如下:if
(bag.transform.GetChild(savei
+
2).transform.GetChild(0).GetComponent<TextMesh>().text
==
"0")//當圖標數目為0時刪除圖標,+2是因為背包原本有兩個物體,圖標是第3個開始{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];//把刪除后的圖標位置前移一格}chuncopynum--;return;}4.6商店系統實現4.6.1商店系統的觸發以及商店UI的位置改變將商店UI放入游戲場景中,初始z位置為10000。在游戲中的商店模型前新增一個帶有碰撞體的空游戲對象shopoj,當主角走到商店前面,處理格接觸到碰撞體之后,商店UI的Z位置移動到2.5,進入攝像機視野中。但是商店UI的位置要求比使用后的背包UI更后面,這樣才能選擇賣背包中的物品給商店。代碼如下:if
(npc.transform.position.x
!=
shopoj.transform.position.x
||
npc.transform.position.y
!=
shopoj.transform.position.y)//沒碰到商店
{
ExitK1
=
true;//商店沒開啟
}
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商店系統的組成以及功能商店UI主要由6部分組成:一、商店UI貼圖。包括商人頭像貼圖,歡迎語句,以及金幣貼圖。二、菜單。總共有種子、動物、工具、委托單、退出5個菜單。三、選擇框。包括菜單選擇框以及商品選擇框。四、顯示金幣數。在商店中會實時顯示你現存的金幣以及你想買的商品的價格。4.6.3菜單選擇的實現以及商品頁面的切換由于菜單只有一行五個,所以移動菜單選擇框只需要AD兩個按鍵監聽事件,定義一個int類型變量:當前菜單編號K1用來記錄移動到哪個菜單,當按觸發鍵盤AD按鍵事件,菜單編號就會增減,菜單選擇框也會向左向右移動,所有的商品頁面都會隱藏gameObject.SetActive(false);然后對應當前菜單編號的商品頁面設置為顯示gameObject.SetActive(true);。當菜單選擇框移動到退出菜單時,商店UI退出攝像機視野,位置回到z==10000。由于選擇框的移動會與游戲中主角的移動相矛盾,所以在開啟商店時,主角的移動腳本將被關閉。代碼如下:if
(Input.GetKeyDown(KeyCode.A)&&K1!=0&&
shopbag.transform.localPosition.z==4&&
DontUningShopLconthing)//按A鍵上一個菜單{K1--;Blackkuan1.transform.localPosition
=
ShopLconmenu[K1];}if
(Input.GetKeyDown(KeyCode.D)
&&
K1
!=
5
&&
shopbag.transform.localPosition.z
==
4&&
DontUningShopLconthing)//按D鍵下一個菜單{K1++;Blackkuan1.transform.localPosition
=
ShopLconmenu[K1];}if
(Input.GetKeyUp(KeyCode.S)&&
DontUningShopLconthing)//按S鍵轉到商品欄{Blackkuan2.gameObject.SetActive(true);DontUningShopLconthing
=
false;K2
=
0;}if
(K1==5)//當選到第六個菜單退出商店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商品的選擇在商品頁面中,所有的格子位置和背包格子位置的設置方法一樣,并在之后將所有商品的位置移動到對應編號的格子位置。商品選擇框的初始狀態設置為隱藏,當鍵盤監聽事件S觸發時,商品選擇框將顯示,并且將菜單選擇框的移動功能關閉。商品選擇框的移動功能也和背包系統中選擇框的移動功能實現方法一樣。代碼如下: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];
}
當商品選擇框的位置移動到最上面一層的商品,此時再按W按鍵,菜單選擇框的移動功能將重新開發,并且商品選擇框的顯示狀態將關閉。代碼如下: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金幣系統在背包與商店的交互中需要貨幣系統來實現物品交互。所有物品都要有價格,因此為所有物品添加腳本,在腳本中聲明一個公共int變量buythingmoney存該物品的價格。在背包中新添一個公共int變量money用來存現存的金幣數量。商店UI的顯示金幣模塊腳本中引用背包中的現存金幣數,并且獲取子節點中的文字對象,將文字對象中的數字組件的值顯示為現存金幣數。當商品選擇框移動到商品上面時,獲取商品腳本中的金幣變量,并同理顯示到商品價格模塊中。代碼如下:圖4-3物品價格屬性int
buythingmoney=0;//獲取商品價格buything
=
Blackkuan2.transform.GetComponent<shoppnegzhuang>().shoppeng;//商品選擇框碰撞判斷選擇的商品if(Blackkuan2.transform.GetComponent<shoppnegzhuang>().shoppeng){buythingmoney
=
buything.transform.GetComponent<cunnon>().gold;//獲取商品本身腳本的價格}4.6.6購買商品如果現存金幣數大于商品價格,并且在商品選擇框移動到商品上并且按下鍵盤按鍵E后,獲取背包系統中的碰撞判斷物體,并將該變量改為所選商品的名字。在背包腳本中復制添加腳本的函數,并且給該函數增加判斷條件:當商店開啟,并且按下按鍵E,這樣之后就能把商品加入背包。并且將現存金幣數減去商品的價格,文字組件重新顯示。代碼如下:GameObject
abc
=
Instantiate(buything);
=
;GameObject.Find("npcs1/Main
Camera").GetComponent<BAG>().panduanduixiang
=
abc;//把買了的商品改成背包欄中判斷添加的對象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;//減了商品價格后的錢4.6.7出售商品在商店開啟的基礎上,如果再開啟背包就可以出售背包中的商品。由于要顯示物品的價格,因此新建一個出售UI,用來顯示背包圖標的價格,出售UI的位置要求在背包位置的上面。在出售UI的腳本中,出售UI的初始位置為z==10000,如果商店系統和背包系統同時打開,出售UI的位置改為z==1.5。在背包中的圖標選擇框移動時,商店中的商品選擇框和菜單選擇框兩者的移動函數關閉。在背包中,復制腳本的使用物品函數,限定條件改為商店開啟,背包開啟。銷售結束后,將現存金幣數加上商品的價格,文字組件重新顯示。代碼如下:if
(Input.GetKeyDown(KeyCode.E)
&&
shopbag.transform.position.z<10&&bag.transform.position.z<10)//在背包狀態按下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植物系統實現4.7.1時間系統在種下種子之后,該植物會隨著天數的增加而慢慢成長。因此需要添加時間系統。在游戲場景的燈光對象中新添一個腳本,聲明公共int對象:已過天數。已過天數初始值為一,并且隨著限定事件發生,值+1。圖4-4聲明公共變量已過天數4.7.2種下種子復制背包的使用物品函數,給函數添加限定條件:使用的圖標的標簽為種子,主角處理格的判斷對象為澆了水的耕地。此時按下按鍵E,公共字符串變量:判斷對象即為使用的種子名字。在開墾澆過水的耕地新添腳本,聲明字符串對象:使用的種子seed,如果背包的判斷對象為濕潤耕地自身,則引用背包的使用物體,賦值與使用種子名字,聲明游戲對象:植株nowseed,然后從資源文件夾中查詢使用種子名字所對應的種子,將其賦值于植株,并將植株于作為子節點,復制到濕潤耕地中。因為出現了同一片濕潤耕地可以同時種下多顆種子的情況,所以要在添加種子的函數中添加判斷條件:濕潤耕地自身的子節點數目為0。gameobject.transform.childCount<1。4.7.3種子的成長當種下了種子以后,種子會隨著已過天數的增加而長大。因此在腳本中聲明int類型變量:已有日期,初始值為0.聲明int類型變量:出生日期,初始值為0。引用已過日期,當種子種下的時候出生日期被賦值于已過日期。已過日期減去出生日期的值賦值于已有日期。代碼如下: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植物圖片的改變植物的圖片會隨著已過日期的增加而改變,直至其成熟。在處理植物素材的時候,將對應植物素材的名字按照成長程度順序排序,并將其名字改為:植物種子+數字順序。在植物已有天數函數中,隨著已有天數增加,聲明一個字符串類型:植物名字,將植株的名字刪除后兩位字符串,然后加上已過天數,將其賦值于植物名字,之后從資源文件中查詢植物名字對應的物體,將其賦值于植株,植株作為子節點復制進濕潤土壤中。代碼如下: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植物的成熟與收獲當植物隨著已過天數慢慢成長,終于成長成熟,成為農作物。在腳本中聲明int類型:成熟所需天數。當已有天數等于成熟所需天數,則將植株字符串刪去后4位,即為農作物的名字,刪除植株,在資源文件中查詢該名字所對應的物體,將其賦值于植株,然后將其作為子節點復制進濕潤土壤中。為了將其收獲入背包之中,需要主角的處理格能與該農作物作交互。因此需要給農作物加上碰撞體組件。由于濕潤的耕地也有碰撞體,因此處理格所判斷的對象會受濕潤耕地的干擾。在絲潤土地增加種子的腳本中,如果濕潤耕地擁有子節點,則將濕潤耕地的碰撞體組件關閉。如果濕潤耕地沒有子節點,則將濕潤耕地的碰撞體組件重新打開。代碼如下: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動物系統實現4.8.1動物的添加牧場總共有三個,用來培養不同的動物。在商店購買了動物之后,獲取動物商品的名字,不需要通過背包,直接通過名字查詢特定的牧場,然后把動物幼崽添加到牧場。先在牧場腳本聲明公共int類型變量:當前的動物數量animalnum,初始值為0,當買了動物之后,獲取該變量,使其+1。代碼如下:if(K1==2)//當選了動物欄,并且買了動物。不用把商品加入背包,動物自動出現{string
abc
=
+
"zoo";GameObject.Find(abc).GetComponent<addanimal>().animalnum++;}4.8.2動物的加載牧場腳本聲明一個int變量:牧場動物舊數量oldanumalnum,初始值為0。因為牧場的動物數量會動態增加,所以當前動物數量減去舊的動物數量就等于需要增加的動物數量。之后舊數量被賦予新數量的值。從資源文件里查詢與動物名字相同的動物,作為子節點Instantiate增加入牧場對象。代碼如下: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動物的隨機移動在牧場里的動物會隨機移動,但是動物又不會移動出柵欄在腳本中聲明四個Int類型變量,用來記錄柵欄中格子位置中X和Y最大值和最小值。由于動物隨機會往上下左右四個方向移動,使用隨機函數Random.Range(1,5);1到4代表四個方向。再隨時記錄牧場XY最大值最小值減去動物自身的坐標,就可以得到動物能移動的最大距離。再使用Random.Range(1,最大距離);就可以實現動物的隨機移動。由于動物這樣移動是改變位置,瞬間移動的,使用平滑阻尼Mathf.SmoothDamp()將動物追蹤生成的坐標就可以實現平滑移動。代碼如下: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動物的成長在腳本中聲明int類型變量:動物出生日期,在增加動物的時候,引用已過天數,賦值給出生日期。已過日期減去出生日期就等于動物成長天數。在動物腳本中定義動物成熟所需要的時間,當動物成長天數haveday等于動物成熟所需要的時間needday,刪除該動物貼圖,然后從資源文件中加載成熟期的動物圖片。代碼如下: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飼料系統實現隨著天數增加,如果動物沒用飼料食用,動物也不會成長的,如果有優質的飼料可以使動物生長時間縮短。為此需要新建一個飼料UI,顯示所添加的飼料,和合成的普通飼料,以及優質飼料。4.9.1飼料槽UI以及位置飼料槽UI由3部分組成:一、UI框架;二、所添加的三種飼料格子;三、所合成的普通飼料和優質飼料的數目。在牧場門前設置碰撞體,當主角處理格碰撞到該碰撞體,飼料槽UI將顯示在攝像機視野中,否則飼料槽UI的z位置為1000。4.9.2飼料槽飼料的添加在背包腳本中復制使用物體的函數,并添加限定條件:先當飼料槽UI顯示,背包UI顯示時,在背包使用的物體將為飼料槽中的飼料配方。在飼料槽腳本中,聲明一個長度為3的字符串組:飼料槽組inst,用來存放所添加的飼料配方。聲明一個int類型對象:當前飼料槽編號foodpsnownum,用來存放當前使用的飼料槽,初始值為0。獲取背包中的飼料配方,根據名字從資源文件中加載相對應的物體,將其復制到飼料槽組中,當前飼料槽編號加1。當飼料槽編號為3,將飼料槽組清空,飼料槽編號為零。聲明一個int類型變量:普通飼料數量ptsiliao,初始值為0。普通飼料數量加1。每種
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論