2016年6月9日 星期四

02162411_劉永健_Week16


開發人員的畫面精心設計,在PS里設計個字體,做成一張圖

片放到Unity。


在場景中找到適當位置,設計敵人生成點:


在這個遊戲中,坦克是源源不絕的,永遠打不完,打敗了又會從敵人生成點復活,因為生成點是在3D的世界里,不存在自適應問題,所以坐標點可以寫死:

五個敵人生成點:

1:(413.6,5.75,211.8)

2:(304.56,5.75,124.4)

3:(221.2,5.75,246.6)

4:(211.81,7.79,349.93)

5:(474,-3.3,460)

之前有考慮過把坦克做成Prefab的形式,在需要生成敵人的時候用實作Prefab的形式生成GameObject,被打敗后直接銷毀物件,但之後找了相關資料,了解到頻繁的生成和銷毀是很耗內存的,較好的方法是預先複製若干個坦克Prefab,被打敗后轉移到敵人生成點的坐標,復位速度、攻擊力等所有參數。


一些細節問題:

關於Unity的UGUI部分的細節,這種介面算是比較新的,上手不難,使用上挺方便,不過還是有一些細節問題要注意,比如多個canvas(畫布)在同一個場景的渲染問題,在主介面中有一個按鈕,如果切換到角色介面,滑鼠移到主界面按鈕那個對應的位置點擊(當然是看不到這個按鈕的,因為已經切換了畫布),就會發現仍然有觸發點擊的事件。

這問題的概念有點複雜,而且不容易發現,我也是之前在一次偶然的情況,利用排除法排除了其它多個可能性,才發現問題出在這裡。簡單來說就像PS中圖層的概念,一個圖層中有一個按鈕,無論上面疊加了多少個圖層,這個按鈕仍然可以按得到,圖層並不妨礙點擊。所以在Unity中要避免這種問題,最好就是隱藏掉其它的canvas,需要顯示哪一個就顯示哪一個,其它的都隱藏,不然就有可能會發生類似這種情況:滑鼠在一個空白的地方點了一下,結果整個遊戲退出了,原因就是在當前的canvas滑鼠沒有點到任何按鈕,但在主介面中滑鼠游標的這個位置剛好是移到了“結束”按鈕上,這樣就會造成了誤觸。

做好隱藏canvas的操作後,設定一下canvas的渲染優先順序也是有必要的:



這個參數可以設定canvas的渲染優先順序,數值越大越會被優先渲染


期末作品開發過程:

遊戲中一些常見效果的實現:

敵人頭上有浮動的血條:


這種效果在很多遊戲里都能看得到,只要是打怪的遊戲,一般都會有這種效果。血條能做到跟隨敵人一起移動,始終保持在敵人頭上,受到傷害時血量會減少。

實現方式:

建一個新的canvas,渲染模式選擇為World Space,也就是一個3D的canvas,裡面的UI都是以3D的形式渲染出來,與普通的顯示在熒幕的2D介面不同。


在Start方法里添加程式碼:

GameObject LifePrefab = (GameObject)Resources.Load ("LifeBar");
GameObject LifeBarObject = (GameObject)Instantiate (LifePrefab);
TankTransform = LifeBarObject.transform;
TankTransform.SetParent(GameObjectManager.Canvas3D.transform);
TankTransform.localScale = new Vector3 (0.06f,0.06f,0.06f);
TankLifeBar = LifeBarObject.GetComponent<Slider>();

然後在Update方法里添加程式碼:

Vector3 LifeBarPosition = this.transform.position;
LifeBarPosition.y += 8f;
TankTransform.transform.position = LifeBarPosition;
TankTransform.transform.eulerAngles = CameraManager.ThirdPersonCamera.transform.eulerAngles;

最後一行程式碼要根據具體需求來寫,看要控制血條的euler角度面向哪一個攝影機。

最後實現血條減血的效果就比較簡單:

LifeBar.value -= AttackValue;//血條的值減去傷害值

沒有留言:

張貼留言