学习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