Unity3D游戏开发之实现血条技能培训

下面我们开始今天的Unity3D技能培训
我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D、3D小规模游戏及网页游戏开发。

今天呢,我们来做一个在游戏中十分重要的组成元素:血条。血条是什么呢?血条是生命值的一种体现,就像《仙剑奇侠传三》电视剧中,当景天说他想让那些被邪剑仙害死的人活过来的时候,天帝说需要等量的生命值来换,所以电视剧中的结局就变成了景天留在世上的时间并不多了,雪见依偎着他坐在新安当门口的时候,天上忽然下起了雪。聊完了游戏,我们继续回到Unity3D中来,我们今天要实现的是基于2D贴图的血条组件的开发。在正式开始之前,我们先来了解下原理:血条由前后两张大小相等贴图组成,前面的贴图就是我们可以看到的血量贴图,而后面的贴图就是我们的背景贴图,通过改变血量贴图的宽度,我们就可以实现血条的效果。好,讲完了原理我们就来一起学习今天的内容吧!

首先,我们准备两张不同颜色的贴图,如图:

更多精彩请到http://www.gopedu.com/

接下来,我们打开Unity3D创建一个新的项目,我们首先在场景中创建两个GUITexture对象,我们将这两个GUITexture对象分别命名为HPBackward、HPForward。在GUITexture中有一个很重要的属性PixelInset,它是一个Rect类型的值,用以描述GUITexture对象的左上角位置、宽度、高度。这里我们使用默认的坐标值,将宽度改为64,将高度改为5。两张贴图的设置要保持一致。如图所示:

在这里需要讲一下PixelInset,由于GUITexture是采用的二维屏幕坐标来定位的,即左下角为(0,0),右上角为(1,1),所以我们不能直接使用三维坐标来改变GUITexture对象的位置。在Unity中有一个WorldToScreenPoint()方法可以将三维坐标转化为二为左边,所以我们的思路是获取目标物体的位置,将其转化为二维坐标,再赋值给GUITexture对象。好,基于这样的思路,我们可以编写下面的脚本:

[csharp]view plaincopyprint?

  1. using UnityEngine;
  2. using System.Collections;
  3. public class Texture2DHP : MonoBehaviour
  4. {
  5. //前景贴图
  6. public Texture ForwardTexture;
  7. //背景贴图
  8. public Texture BackwardTexture;
  9. //目标对象
  10. public Transform Target;
  11. //水平偏移量
  12. public float OffSetX=0.05F;
  13. //垂直偏移量
  14. public float OffSetY=0.05F;
  15. //最大血量
  16. public int MaxHP=100;
  17. //当前血量
  18. public int HP=100;
  19. //血条宽度
  20. public int mWidth=64;
  21. //血条高度
  22. public int mHeight=5;
  23. //前景
  24. private Transform Forward;
  25. //背景
  26. private Transform Backward;
  27. void Start ()
  28. {
  29. //获得前景和背景
  30. Forward=transform.Find("HPForward");
  31. Backward=transform.Find("HPBackward");
  32. //设置前景、背景贴图
  33. Forward.guiTexture.texture=ForwardTexture;
  34. Backward.guiTexture.texture=BackwardTexture;
  35. //根据目标对象初始化血条位置
  36. UpdateLocation(Target,OffSetX,OffSetY);
  37. }
  38. void Update ()
  39. {
  40. UpdateLocation(Target,OffSetX,OffSetY);
  41. UpdateHP(HP);
  42. }
  43. //更新位置
  44. private void UpdateLocation(Transform mTransform,float mOffSetX,float mOffSetY)
  45. {
  46. //获取目标对象高度
  47. float mHight=Target.collider.bounds.size.y;
  48. float mScale=Target.transform.localScale.y;
  49. mHight=mHight * mScale;
  50. //将三维坐标转化为二维坐标
  51. Vector3 mPos3d=new Vector3(mTransform.position.x,mTransform.position.y+mHight,mTransform.position.z);
  52. Vector2 mPos2d=Camera.main.WorldToScreenPoint(mPos3d);
  53. //更新贴图的位置
  54. Forward.position=new Vector3(mPos2d.x/Screen.width+mOffSetX,mPos2d.y/Screen.height+mOffSetY,0);
  55. Backward.position=new Vector3(mPos2d.x/Screen.width+mOffSetX,mPos2d.y/Screen.height+mOffSetY,0);
  56. }
  57. //更新血量
  58. public void UpdateHP(int mValue)
  59. {
  60. if(mValue<0 || mValue>MaxHP)
  61. return;
  62. SetGUITextureWidth(Forward.guiTexture,
  63. (int)(mWidth * (mValue/(double)MaxHP)));
  64. }
  65. //设置贴图宽度
  66. private void SetGUITextureWidth(GUITexture mTexture,int mValue)
  67. {
  68. mTexture.pixelInset=new Rect(mTexture.pixelInset.x,mTexture.pixelInset.y,
  69. mValue,mTexture.pixelInset.height);
  70. }
  71. }

在上面的代码中,我们需要把握以下几点:

1、目标物体的高度是根据Collider来获取的,所以要使用血条组件的物体必须带有碰撞器。

2、通过WorldToScreenPoint()方法获取二维坐标后,要分别用x,y坐标去除以屏幕宽度、屏幕高度,目的是使坐标值介于0,1之间,因为GUITexture使用这样的坐标系。

3、当改变脚本中的血量和目标物体的位置时,血条位置和血条量会自动更新。换言之,我们只要要改变HP的值就可以实现血条数值的更新。

好了,现在我们在场景中创建一个空的GameObject,命名为Texture2DHP。我们将前面创建的两个GUITexture对象拖放到该对象下,使其成为子对象。我们把脚本拖放到Texture2DHP对象上,此时,我们应该可以看到下面的内容:

我们将开始项目前准备好的两张贴图导入项目并将它们赋给脚本,其中红色的为血量贴图,黄色的背景贴图。好了,到目前为止,一个血条组件已经基本成型了,为了让它可以在项目中复用,我们将其制作成预设。下面来讲解预设的制作方法:

预设,在Unity3D中称为Prefab,是一种可以复用的游戏体。我们首先在Project窗口中创建一个Prefab文件夹,然后在该文件下创建一个名为Texture2DHP的Prefab。我们将Hierarchy窗口中的Texture2DHP拖放到Prefab中,Prefab将变成亮蓝色,此时表明预设已经创建成功。保存项目,将Hierarchy窗口中的Texture2DHP对象删除,在接下来的游戏开发中,我们将会一直用到这个预设文件。好,我们现在来测试一下今天的成果,我们首先在场景中创建一个Cube和一个胶囊体,然后我们将Texture2DHP预设直接拖放到游戏场景中,设置其目标物体为Cube,血量HP为35,将其改名为CubeHP。类似地,我们为胶囊体创建一个血条组件,设置其血量HP为85,将其改名为CapsuleHP。好了,现在我们来运行游戏:

那么,我们如何在脚本中动态的改变血条的血量呢?我们只需要获取指定名称的Texture2DHP组件,然后获取Texture2DHP脚本并修改其中的HP的值就可以了。怎么样,效果还不错吧?不过基于这种方式实现的血条有一个问题,就是所有对象的血条都是在一个平面上的,这样血条的大小是不会随着距离摄像机距离的变化而表现出一种渐变的效果的,这是原理性的问题,我们目前还无法避免。测试模型的时候,经常出现无法获取模型高度的问题,暂时还没有想到较好的解决办法,如果大家有更好的想法,欢迎大家给我留言。那么,有没有更好的方法呢?有,那就是NGUI!好了,关于NGUI的问题,稍后会与大家分享。

时间: 2024-10-27 13:34:57

Unity3D游戏开发之实现血条技能培训的相关文章

Unity3D游戏开发之网络游戏服务器架构设计培训

下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1.服务器跑在什么样的操作系统环境下?2.采用哪几种语言开发?主要是什么?3.服

Unity3D游戏开发之网络游戏服务器架构设计培训(如何做一名好主程)

在我们初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发.后面就应该朝着主程的方面前进 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1.服务器跑在什么样的操作系统环境下?2.采用哪几种语言开发?主要是什么?3.服务器和客户端以什么样的接口通讯?4.采用哪些第三方的类库? 除了技术背

[Unity3D]Unity3D再叙NGUI之血条及技能冷却效果

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3D游戏开发之从<魂斗罗>游戏说起(上)--目标追踪这篇文章后再写一篇<Unity3D游戏开发之从<魂斗罗>游戏说起(下)>,只是眼下博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享. 作为大家等待博主更新博客的回报,我们今天来说一说Unity3D中的游戏场景异步

Unity3D游戏开发之如何截屏的技能培训

下面我们开始今天的Unity3D技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天我们来做点简单的东西,做个什么呢?答案就是截屏.作为一名热爱单机游戏的玩家,每次在玩游戏的同时截取游戏中比较喜欢的画面,特别是学习了Unity3D以后玩游戏的时候更多地是从一个游戏设计者的角度来看待游戏,换句话说,可能关注技术的成分更多一点吧.比如在写<Unity3D游戏开发之自由视角下的角色控制>和<

Unity3D游戏开发之《愤怒的小鸟》弹弓实现技能培训

今天我们来做一个高端大气上档次的东西.我相信大家都玩过一款叫做<愤怒的小鸟>的游戏,这款游戏之所以能够受到玩家的喜爱,是因为这是一款物理游戏,在游戏中处处充满了物理.我们熟悉的抛物线.引力等物理元素都在这款游戏中得到了体现.那么<愤怒的小鸟>这款游戏使用的正是Unity引擎,所以我们在游戏中看到了各种各种有趣的物理现象.那么,我们今天呢,就以<愤怒的小鸟>游戏中的小鸟发射器——弹弓为例,来讲述在Unity中如何实现弹性效果. 下面我们开始今天的Unity3D游戏开发技能

Unity3D游戏开发之《愤怒的小鸟》弹弓实现的技能培训

下面我们开始今天的Unity3D游戏开发技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天我们来做一个高端大气上档次的东西.我相信大家都玩过一款叫做<愤怒的小鸟>的游戏,这款游戏之所以能够受到玩家的喜爱,是因为这是一款物理游戏,在游戏中处处充满了物理.我们熟悉的抛物线.引力等物理元素都在这款游戏中得到了体现.那么<愤怒的小鸟>这款游戏使用的正是Unity引擎,所以我们在游戏中

unity3d游戏开发之简单的透明shader技能培训

下面我们开始今天的Unity3D游戏开发技能透明shader技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. [plain] view plaincopy // Shader created with Shader Forge Beta 0.34 // Shader Forge (c) Joachim Holmer - http://www.acegikmo.com/shaderforge/

Unity3D游戏开发初探—2.初步了解3D模型基础

一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被.机械等等,比如一个大楼的3D模型图.3D模型也包括玩具和电脑模型领域. 互联网的形态一直以来都是2D模式的,但是随着3D技术的不断进步,在未来的时间里,将会有越来越多的互联网应用以3D的方式呈现给用户,包括网络视讯.电子阅读.网络游戏.虚拟社区.电子商务.远程教育等等.甚至对于旅游业,3D互联网也能