標籤:if語句 oca height 改變 這一 類型 碰撞 指令碼 出現
聲明:
本文系轉載,由於Unity版本不同,文中有一些小的改動,原文地址:http://www.jianshu.com/p/97b630a23234
上一節Unity-2017.2官方執行個體教程Roll-a-ball(一)我們講到了:
一、如何建立一個新項目(Project)
二、如何建立一個新的遊戲情境(Scene)
三、如何添加基本的遊戲對象(GameObject)
四、如何添加燈光(Light)
五、如何給遊戲對象添加指令碼(Script)
如果運行過遊戲的朋友就會發現一個問題,雖然我們可以控制球體運動了,但是遊戲視角好像不會隨著球體而移動,球體一下子就會跑到攝像機看不到的地方去了,那麼這一節我們就會學習以下內容:
一、如何讓攝像機跟隨球體移動
二、製作圍牆來防止球體跑出平台
三、添加一個內建旋轉動畫的方塊
四、製作一個Prefab和使用Global模式
五、讓球體可以拾取方塊
六、如何?一個簡單的計分板UI(Text)
七、如何發布遊戲(Build)
一、讓攝像機跟隨球體移動
首先我們選中我們的網路攝影機(Main Camera),然後我們會看到如下的情況:
在中,我們可以看到,在Scene視窗的右下角,也就是圖中紅框處,有一個小視窗,這個視窗就顯示我們此時選中的攝像機所有看到的內容,方便我們調整攝像機的位置,所以我們先拖動攝像機的位置和角度,來處於一個合適的視角,本例中,我們將網路攝影機的Position的Y和Z分別調至5和-6,然後把其的Rotation的X值調至45,這樣攝像機的視角就變成了45°俯視角:
視角調整好後,我們接下來要讓網路攝影機跟隨球體來移動,我們第一個想到的辦法,也是最簡單的方法,就是把攝像機變成球體的一個子物件,這樣球體移動,攝像機也會跟著變化,我們馬上做做看:
Tips:把攝像機變成球體的一個子物件的方法是:把Main Camera對象拖到Player對象上
然後我們運行遊戲,我們發現網路攝影機的確是跟著球體移動了,但是它不止位置跟著球體變化,他的角度也會跟著球體變化,這樣網路攝影機就會出現天旋地轉的效果,這不是我們想要的效果。
Tips: Unity中,子物件的Transform屬性會跟隨父物件一起進行變化
我們想要的效果只需要攝像機的位置跟隨球體移動,角度不需要,所以我們只能用指令碼來實現這一效果,首先我們給攝像機添加一個指令碼(大家應該還記得如何添加吧,不記得可以回去看第一節的內容,這裡就不再重複介紹了),我們給指令碼命名為CameraController,指令碼語言選擇C#。然後我們看看指令碼內容:
(1)、首先,我們定義了一個public的GameObject變數,這個變數就是用來告訴程式,攝像機會跟隨哪個GameObject來移動
(2)、然後我們定義一個private的Vector3的變數,這個變數我們主要用來記錄攝像機初始的位置,用作之後更新攝像機的位置的位移向量
(3)、然後我們在Start方法中,攝像機的position數值賦給offset變數,意思是在開始前,用offset變數記錄下攝像機的初始位置
(4)、最後我們在LateUpdate方法中,把攝像機的位置變更為球體的位置加上最開始的位移位置
Tips:這裡其實指令碼中使用Update方法一樣可以達到效果,但是我們使用LateUpdate(最後更新)效率會更高一點
寫完指令碼內容後,我們儲存一下指令碼,然後回到Unity編輯器介面,我們會發現攝像機的指令碼組件中,多了一個Player屬性,如:
這就是我們剛剛在指令碼中定義的public類型的屬性。
Tips:在Unity指令碼中,public的屬性會在編輯器中顯示出來
然後我們把球體拖入到Player屬性中,如:
接下來我們運行一下遊戲,就可以發現攝像機現在可以正常跟隨球體移動了。
二、製作圍牆,防止球體跑出平台
攝像機可以跟隨球體移動後,我們又看到一個問題,球體如果移動超過平台的邊界,就會掉下去,這不太友好,所以我們接下來給平台加上一圈圍牆,來防止球體跑出平台
我們建立一個cube對象,然後reset他的Transform屬性會發現cube和球體擋住到了一起,這樣不方便我們來編輯cube:
為了方便編輯cube,我們可以暫時不顯示球體,我們選中球體,將球體的Inspector下方的勾選去掉,如:
這樣一來,球體就展示在我們的Scene視窗中不顯示了。接下來我們可以編輯cube的屬性,將其的長度設定成和平台一樣,然後將其的位置移動到平台北面的邊緣,如:
然後同樣的,我們給平台的南面,西面,東面都製作一堵牆,如:
然後在運行一下,可以看到球體就沒法跑出平台了。
Tips:運行時記得把Player顯示出來
三、製作一個旋轉的方塊有了平台,有了球體,接下來我們就需要一個方塊,這個方塊可以讓球體碰撞並拾取,為了讓方塊變得有吸引力一點,我們讓方塊可以自動旋轉起來,首先我們建立一個cube對象(不要忘記建立GameObject之後的兩個標準動作),然後我們將cube命名為PickUp,並把它的Rotation的X、Y、Z值都設定為45,然後將其拖動到一個你覺得合適的位置,比如這樣:
之後我們給這個方塊添加一個自動旋轉的指令碼,指令碼名稱為Rotator,指令碼內容如下:
裡面我們就添加了一句話,Time.deltaTime就是根據時間變化來改變方塊的Rotation屬性,從而達到旋轉的效果,儲存指令碼,然後運行一下,就可以看到方塊自己旋轉起來了。
四、製作一個Prefab和使用Global模式
為了讓遊戲豐富起來,我們只有一個方塊是不夠的,因此我們需要多建立幾個方塊,在這之前呢,我們需要先製作一個Prefab(預製件),製作一個預製件有以下好處:
(1)、一次製作,重複使用,可以在任何項目中使用Prefab
(2)、一次修改,全部變化,我們修改Prefab的屬性後,所有使用該Prefab的對象屬性都會跟著發生變化
而製作Prefab的方法也非常簡單,我們為了資源管理方便,先在Assets檔案夾下面建立一個Prefabs檔案夾來存放Prefab檔案,然後在Prefabs檔案夾下建立一個Prefab,重新命名為PickUp,拖動Pickup(剛才建立的Cube)對象到PickUp(Prefab資源),一個Prefab就建立好了,具體步建立方法有兩種:
第一種:首先點擊選中Assets檔案夾下的Prefabs檔案夾,點擊功能表列的Assets->Create->Prefab
第二種:點擊選中Assets檔案夾下的Prefabs檔案夾,右鍵->Create->Prefab
然後我們可以複製PickUp對象,並拖拽新的PickUp到合適的位置,此時你會發現拖拽沒有辦法保持Y軸不變,因此為了方便我們移動PickUp對象的位置,我們先將Scene視圖改為Y軸模式:
然後將Local模式改為Global模式:
此時我們便可以方便的調整PickUp對象的位置了,最後效果如下:
我們可以看到,一共擁有8個PickUp方塊。
五、讓球體拾取方塊
接下來我們實現球體拾取方塊的功能,我們通過查API得知有一個OnTriggerEnter的方法可以用來在球體碰到物體的時候調用(觸發器),光有這個方法還不夠,我們還需判斷球體碰到的是什麼東西,我們不能碰到任何東西都拾取,所以我們需要給被拾取的方塊增加一個標記(Tag),增加標記的方法如下:
(1)、因為我們情境裡面一共有8個方塊,如果一個個的設定標記,就有點太麻煩了,還記得上面我們提到的Prefab的第2點好處嗎?對了,這邊我只需要給Prefab標記就可以了
(2)、首先我們選中PickUp Prefab,然後在Inspector視圖的Tag裡面新增一個Tag,我們命名為PickUp
接下來我們就可以進行指令碼編寫了,我們開啟球體的PlayerController指令碼,然後新增下面的代碼:
首先這裡other變數代表球體碰到的對象,在這個方法裡面,我先用if語句判斷碰到的對象的Tag是否等於“PickUp”,如果等於,我就將碰到的對象設定為不啟用(不顯示)
做完這些,我們就可以運行一下遊戲,看看效果。我們運行了遊戲發現,球體碰撞方塊並沒有將它拾取,這是為什麼呢?原因是我們沒有將方塊設定為碰撞觸發器(Is Trigger),只有設定成碰撞觸發器,我們才可以的OnTriggerEnter方法才能起效果,在這裡我們還是給Prefab設定成Is Trigger屬性,這樣每個方塊都有了這個屬性。設定完成後,再運行遊戲,可以發現,現在球體碰到方塊就可以拾取了。
六、製作一個計分板
好了,我們的遊戲基本可以玩了,但是我們還需給玩家增加一點刺激,做一個計分板來鼓勵玩家多拾取方塊,那麼實現一個計分板我們需要以下元素:
(1)、用一個變數儲存玩家的分數
(2)、然後將分數顯示在UI上面
首先我們修改PlayerController指令碼,如下:
第一個紅框處,我們定義了一個count變數用來儲存分數,然後在Start方法中將Count的值初始化為0,即我們在遊戲開始時,將分數初始化為0,最後我們在拾取方塊的時候,把count的數值加1。現在我們有了變數來記錄分數,但是我們還沒有顯示給玩家,所以我們需要一個UI來顯示分數,我們建立一個文本UI(Text),然後我們調整Text的位置至螢幕的左上方:
接下來我們再次修改PlayerController,如下:
(1)、在代碼最前面,我們需要引入UnityEngine.UI,只有這樣後面代碼才會識別Text類型的變數
(2)、然後我們在定義countText變數來儲存UI Text
(3)、接著我們在Start方法中調用setCountText方法,來更新countText的內容
(4)、然後我們在每次球體碰到方塊的時候,也需要更新countText的內容
(5)、最後是我們定義的setCountText方法
然後我們儲存代碼,回到Unity編輯器裡面,將Text拖入到Player裡面的Count Text屬性:
做完這些,我們就可以運行遊戲,看到效果了!
七、發布遊戲
遊戲到這裡我們就告一段落了,接來下我們可以嘗試將遊戲發布,Unity發布遊戲非常簡單:
(1)、首先選擇File->Build Settings
(2)、我們選擇PC平台,然後點擊Switch Platform
(3)、我們點擊Add Current按鈕,將當前遊戲情境加入進去
(4)、點擊Build按鈕,然後選擇儲存路徑,就可以完成發布了
最後我們找到儲存路徑下產生的檔案,點擊exe檔案,就可以運行遊戲了。
Unity-2017.2官方執行個體教程Roll-a-ball(二)