學習Unity已經10天了,也沒發現有什么長進,真的急。昨天仿着官方Demo做了個射擊游戲輪廓,其中需要給每個怪做一個血條。
搜了一些,挺復雜的,用NGUI或者UGUI,外加很長的代碼。。。不過還是找到了一篇簡單的。
但是那一篇把所有的東西都放一起了,不太好,我在這整理分離一下。
背景:
官方Demo惡魔射手。其中每個怪都有一個EnemyHealth腳本,該腳本主要有怪物的血量等,然后有個TakeDamage()函數來計算傷害后的血量。
開始:
1、制作圖片:
PS一張細長的紅色圖片作為血量;
2、制作一個材質球,起名為“XuetiaoMaterial”,單擊這個材質球,在Inspector面板中把紅色圖片加進來,就成了紅色的材質球了。
Inspector面板的Shader下選擇Unlit/Transparent
3、創建一個Cube,放到你需要加血條的怪上,Cube作為怪的子物體。拖動成紙片子的形狀,然后拖動到合適的位置即可。
4、單擊這個Cube,你願意改名就改名。把2中的材質球加到這個Cube中來,它就變成紅色的了。把Cube的Collider、倆Shdow勾選掉。畢竟血條不用陰影也不用碰撞嘛。
5、在你的控制血量的腳本里加點東西,我是在EnemyHealth.cs中加的,如下:
血條貼圖是一個新貨,代碼計算后會重新賦給Cube
public Texture2D bloodBarRed; // 血條貼圖 public Transform bloodBar; // 代表血條的CUBE
另外還有:
void Start() { bloodBar = transform.FindChild("BloodBarCube"); //獲得血條物體 bloodBarRed = new Texture2D(512, 32); // 新建一個貼圖,用以變化后賦給Cube bloodBarRed.wrapMode = TextureWrapMode.Clamp; // 拉伸該圖 }
還有,要使血條時刻正對攝像機的:
void Update () { bloodBar.LookAt(Camera.main.transform.position); // 朝向攝像機 }
下面是加入的一個更新血條的函數:
public void UpDateBloodBar() { float cunrrentRed = currentHealth * bloodBarRed.width / startingHealth; //直接除,會因為兩個整型得到0,所以先乘以后除 for (var x = 0; x < bloodBarRed.width; x++) { // 對每個坐標點 for (var y = 0; y < bloodBarRed.height; y++) {//循環執行y軸從0開始,y軸小於血條的寬的話執行下面,否則+ if (x < cunrrentRed) bloodBarRed.SetPixel(x, y, Color.red); //x小於血條長度的范圍塗成紅色, else bloodBarRed.SetPixel(x, y, Color.gray); //其他部位塗成黑色 } } bloodBarRed.Apply(); // 應用該圖 bloodBar.gameObject.renderer.material.mainTexture = bloodBarRed; // 將修改后的貼圖給血條Cube }
其中 currentHealth是我EnemyHealth類中的成員變量,startingHealth也是,代表了總血量。
然后你可以在血量改變的函數中調用此函數。從而更新血條。如果有必要,你也可以將當前血量作為形參傳入。
6、將腳本拖入對應的對象(需要血條的怪)中,單擊該怪,在Inspector面板中,找到該腳本,把紅色圖片拖入bloodBarRed中,把血條Cube(該怪的子物體)拖入bloodBar即可。
運行就OK了。
致謝:
http://www.manew.com/forum.php?mod=viewthread&tid=33694&page=1