码迷,mamicode.com
首页 > 编程语言 > 详细

Unity3d人物的名称与血条的绘制方法

时间:2015-02-22 15:50:23      阅读:380      评论:0      收藏:0      [点我收藏+]

标签:3d游戏开发   unity3d培训   unity3d游戏   unity培训   



人物的名称与血条的绘制方法很简单,但是我们需要解决的问题是如何在3D世界中寻找合适的坐标。因为3D世界中的人物是会移动的,它是在3D世界中移动,并不是在2D平面中移动,但是我们需要将3D的人物坐标换算成2D平面中的坐标,继而找到人物头顶在屏幕中的2D坐标最后使用GUI将名称与血条绘制出来。

首先学习本文的重点内容,如何将游戏世界中任意3D坐标转换成屏幕中的2D坐标。根据这个方法计算出的2D坐标屏幕左下角的点为0.0 ,屏幕右上角的坐标为1.1 所以真实的2D坐标还得通过Screen.height 与Screen.width计算一下才行。
1
Vector2 position = camera.WorldToScreenPoint (worldPosition);

在unity工程导入角色控制器组件,不知道角色控制器的朋友请阅读我之前的文章哈。创建一个Plane做为游戏的地面,然后利用角色控制器组件创建两个模型,一个做为主角,一个作为NPC,主角可以通过控制来移动从四周来观察NPC对象。由于地面的面积比较小移动主角时为了避免主角越界掉下去,我们做一个边界的物理层。物理层其实很简单,就是给平面四周放置四个平面在四周将平面包围着,给四周的四个平面绑定上Box Collider组件,这样主角就不会越界掉下去啦。因为没有给贴图所以效果上看不到这四个对象。 如下图所示,在场景是途中主角被四个平面包围这,即时它拼命的想往外条但是还是跳不出去。

技术分享 

创建脚本NPC.cs 然后把脚本挂在NPC对象身上,在脚本中我们绘制主角的血条以及名称。

  1. NPC.cs
  2. 001
  3. using UnityEngine;
  4. 002
  5. using System.Collections;
  6. 003
  7.   
  8. 004
  9. public class NPC : MonoBehaviour {
  10. 005
  11.   
  12. 006
  13. //主摄像机对象
  14. 007
  15. private Camera camera;
  16. 008
  17. //NPC名称
  18. 009
  19. private string name = "我是雨松MOMO";
  20. 010
  21.   
  22. 011
  23. //主角对象
  24. 012
  25. GameObject hero;
  26. 013
  27. //NPC模型高度
  28. 014
  29. float npcHeight;
  30. 015
  31. //红色血条贴图
  32. 016
  33. public Texture2D blood_red;
  34. 017
  35. //黑色血条贴图
  36. 018
  37. public Texture2D blood_black;
  38. 019
  39. //默认NPC血值
  40. 020
  41. private int HP = 100;
  42. 021
  43.   
  44. 022
  45. void Start ()
  46. 023
  47. {
  48. 024
  49. //根据Tag得到主角对象
  50. 025
  51. hero = GameObject.FindGameObjectWithTag("Player");
  52. 026
  53. //得到摄像机对象
  54. 027
  55. camera = Camera.main;
  56. 028
  57.   
  58. 029
  59. //注解1
  60. 030
  61. //得到模型原始高度
  62. 031
  63. float size_y = collider.bounds.size.y;
  64. 032
  65. //得到模型缩放比例
  66. 033
  67. float scal_y = transform.localScale.y;
  68. 034
  69. //它们的乘积就是高度
  70. 035
  71. npcHeight = (size_y *scal_y) ;
  72. 036
  73.   
  74. 037
  75. }
  76. 038
  77.   
  78. 039
  79. void Update ()
  80. 040
  81. {
  82. 041
  83. //保持NPC一直面朝主角
  84. 042
  85. transform.LookAt(hero.transform);
  86. 043
  87. }
  88. 044
  89.   
  90. 045
  91. void OnGUI()
  92. 046
  93. {
  94. 047
  95. //得到NPC头顶在3D世界中的坐标
  96. 048
  97. //默认NPC坐标点在脚底下,所以这里加上npcHeight它模型的高度即可
  98. 049
  99. Vector3 worldPosition = new Vector3 (transform.position.x , transform.position.y + npcHeight,transform.position.z);
  100. 050
  101. //根据NPC头顶的3D坐标换算成它在2D屏幕中的坐标
  102. 051
  103. Vector2 position = camera.WorldToScreenPoint (worldPosition);
  104. 052
  105. //得到真实NPC头顶的2D坐标
  106. 053
  107. position = new Vector2 (position.x, Screen.height - position.y);
  108. 054
  109. //注解2
  110. 055
  111. //计算出血条的宽高
  112. 056
  113. Vector2 bloodSize = GUI.skin.label.CalcSize (new GUIContent(blood_red));
  114. 057
  115.   
  116. 058
  117. //通过血值计算红色血条显示区域
  118. 059
  119. int blood_width = blood_red.width * HP/100;
  120. 060
  121. //先绘制黑色血条
  122. 061
  123. GUI.DrawTexture(new Rect(position.x - (bloodSize.x/2),position.y - bloodSize.y ,bloodSize.x,bloodSize.y),blood_black);
  124. 062
  125. //在绘制红色血条
  126. 063
  127. GUI.DrawTexture(new Rect(position.x - (bloodSize.x/2),position.y - bloodSize.y ,blood_width,bloodSize.y),blood_red);
  128. 064
  129.   
  130. 065
  131. //注解3
  132. 066
  133. //计算NPC名称的宽高
  134. 067
  135. Vector2 nameSize = GUI.skin.label.CalcSize (new GUIContent(name));
  136. 068
  137. //设置显示颜色为黄色
  138. 069
  139. GUI.color = Color.yellow;
  140. 070
  141. //绘制NPC名称
  142. 071
  143. GUI.Label(new Rect(position.x - (nameSize.x/2),position.y - nameSize.y - bloodSize.y ,nameSize.x,nameSize.y), name);
  144. 072
  145.   
  146. 073
  147. }
  148. 074
  149.   
  150. 075
  151. //下面是经典鼠标点击对象的事件,大家看一下就应该知道是什么意思啦。
  152. 076
  153. void OnMouseDrag ()
  154. 077
  155. {
  156. 078
  157. Debug.Log("鼠标拖动该模型区域时");
  158. 079
  159. }
  160. 080
  161.   
  162. 081
  163. void OnMouseDown()
  164. 082
  165. {
  166. 083
  167. Debug.Log("鼠标按下时");
  168. 084
  169.   
  170. 085
  171. if(HP >0)
  172. 086
  173. {
  174. 087
  175. HP -=5 ;
  176. 088
  177. }
  178. 089
  179.   
  180. 090
  181. }
  182. 091
  183. void OnMouseUp()
  184. 092
  185. {
  186. 093
  187. Debug.Log("鼠标抬起时");
  188. 094
  189. }
  190. 095
  191.   
  192. 096
  193. void OnMouseEnter()
  194. 097
  195. {
  196. 098
  197. Debug.Log("鼠标进入该对象区域时");
  198. 099
  199. }
  200. 100
  201. void OnMouseExit()
  202. 101
  203. {
  204. 102
  205. Debug.Log("鼠标离开该模型区域时");
  206. 103
  207. }
  208. 104
  209. void OnMouseOver()
  210. 105
  211. {
  212. 106
  213. Debug.Log("鼠标停留在该对象区域时");
  214. 107
  215. }
  216. 108
  217.   
  218. 109
  219. }
复制代码


注解1:通过collider.bounds.size 可以拿到模型对应三个轴向的高度,但是模型是可以缩放的,所以真实的模型高度应当是原始高度乘以缩放系数才行。 transform.localScale可以拿到模型对应三个轴向的缩放系数,因为这里我们需要模型的高度,所以忽略X轴与Z轴。
注解2:在这里我们计算血条的宽度,GUI.skin.label.Calcsize()这个方法是以默认的皮肤对象Label对象去参数对象的宽高。参数是new GUIContent(blood_Red)意思是拿红色血条的贴图的宽高,它将保存在返回的size中。最后以宽高将血条绘制在屏幕中,我们的血条采取两层。背景是黑色的,前面是红色的,当人物费血时红色血条减少。
注解3: 这里通过字符串来获取它整体的宽度与高度,因为NPC的名称是可变的,所以我们需要动态的获取整体的显示区域。同样是以GUI.skin.label对象去调用CalcSize。【狗刨学习网

如下图所示,当使用鼠标点击NPC对象时,NPC头顶的血条将开始发生减血。这个例子我使用OnGUI绘制当然大家也可以在Hierarchy 视图中的创建GUI Texture 或者GUI Text对象 来实现,不过原理都是这样的 大家可以试试。


技术分享

Unity3d人物的名称与血条的绘制方法

标签:3d游戏开发   unity3d培训   unity3d游戏   unity培训   

原文地址:http://blog.csdn.net/book_longssl/article/details/43907617

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!