Unity3D游戏开发之伤害数值显示.docx_第1页
Unity3D游戏开发之伤害数值显示.docx_第2页
Unity3D游戏开发之伤害数值显示.docx_第3页
Unity3D游戏开发之伤害数值显示.docx_第4页
Unity3D游戏开发之伤害数值显示.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Unity3D游戏开发之伤害数值显示众所周知,在RPG游戏策划中最为重要的一个环节是数值策划。数值策划是一个关于游戏平衡方面的概念,它是一种非常深奥的概念。游戏从某种意义上 是多种选择的组合,因此如果一个游戏失去平衡,那么就会减少选择而影响游戏的乐趣。数值策划人员通常需要按照一定的规则和方法将整个游戏系统的相关数值调整到一个合适的范围,以确保玩家可以有更多地选择以增强游戏的可玩性。文章出处:狗刨学习网。数值策划是近年来国内游戏行业从国外游戏业引申过来的一个概念,博主认为我们在学习游戏设计的过程中,除了专注于技术上的实现以外,还应该对游戏设计中的相关理论有所了解。 好了,下面我们开始今天的内容:Unity3D游戏开发之伤害数值显示。如图所示,是博主十分喜欢的一部游戏血雨前传:蜃楼。这部游戏虽然脱离了前两部作品回合制的模式,以爽快的ACT横版过关模式再次进入玩家的视野中,但是相信只有真正玩过这个游戏的人才知道这是一部地地道道的RPG游戏,诡异、独特的画面风格,古龙式武侠叙事风格都为这部作评带来了无限的生命力。而雨血系列更是近年来少有的走出国门、享誉国外的游戏。这部游戏一招一式都很华丽,而且爽快的打击感让人欲罢不能。作为一部PRG游戏,在战斗中最重要的当属敌我双方生命值的对比,所以在战斗中实时显示玩家对敌人造成的伤害值十分重要。文章出处:狗刨学习网。仙剑奇侠传五前传更是在战斗中加入了伤害统计,方便玩家对于战场局势的把握。好了,讲了这么多,我们来继续我们的Unity3D学习之旅,在下面的文章中,我们将使用Unity3D中的OnGUI()方法来实现伤害数值的 显示。 既然是基于OnGUI()方法的, 相信大家一定很熟悉了,所以我们直接给出代码:1. using UnityEngine;2. using System.Collections;3. 4. public class DamagePopup : MonoBehaviour 5. 6. /目标位置7. private Vector3 mTarget;8. /屏幕坐标9. private Vector3 mScreen;10. /伤害数值11. public int Value;12. 13. /文本宽度14. public float ContentWidth=100;15. /文本高度16. public float ContentHeight=50;17. 18. /GUI坐标19. private Vector2 mPoint;20. 21. /销毁时间22. public float FreeTime=1.5F;23. 24. void Start () 25. 26. /获取目标位置27. mTarget=transform.position;28. /获取屏幕坐标29. mScreen= Camera.main.WorldToScreenPoint(mTarget);30. /将屏幕坐标转化为GUI坐标31. mPoint=new Vector2(mScreen.x,Screen.height-mScreen.y);32. /开启自动销毁线程33. StartCoroutine(Free);34. 35. 36. void Update()37. 38. /使文本在垂直方向山产生一个偏移39. transform.Translate(Vector3.up * 0.5F * Time.deltaTime);40. /重新计算坐标41. mTarget=transform.position;42. /获取屏幕坐标43. mScreen= Camera.main.WorldToScreenPoint(mTarget);44. /将屏幕坐标转化为GUI坐标45. mPoint=new Vector2(mScreen.x,Screen.height-mScreen.y);46. 47. 48. void OnGUI()49. 50. /保证目标在摄像机前方51. if(mScreen.z0)52. 53. /内部使用GUI坐标进行绘制54. GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString();55. 56. 57. 58. IEnumerator Free()59. 60. yield return new WaitForSeconds(FreeTime);61. Destroy(this.gameObject);62. 63. 在上面的代码中我们需要把握下面几点: 1、根据Transform组件获取位置坐标,将此坐标转化为屏幕坐标及GUI坐标。 2、Unity3D中常见的四种坐标系: a、世界坐标:场景中物体的坐标,使用 transform.position获得。 b、屏幕坐标:以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来 衡量的。如Input.mousePosition即为屏幕坐标。 c、视口坐标:视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。 d、GUI坐标:该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。 3、在代码中我们将世界坐标先转化为屏幕坐标,再转化为GUI坐标 好了,下面我们将这个脚本绑定在一个空的游戏体上,并制作成预设,在下面的示例中,我们将使用这个预设。1. using UnityEngine;2. using System.Collections;3. 4. public class Enemy : MonoBehaviour 5. 6. public GameObject PopupDamage;7. 8. void OnTriggerEnter(Collider mCollider)9. 10. if(mCollider.gameObject.tag=Player)11. 12. /克隆伤害弹出组件13. GameObject mObject=(GameObject)Instantiate(PopupDamage,transform.position,Quaternion.identity);14. mObject.GetComponent().Value=Random.Range(20,40);15. 16. 17. 这里我们设定玩家对敌人造成的伤害值为20到40,运行程序,我们会得到下面的结果: 由于这里博主使用的是非精确碰撞,所以导致程序一开始角色就和胶囊体发生了碰撞,而OnTrigger()方法由于只能在碰撞开始的时候捕捉碰撞,所以这里只显示了一次伤害值。理论上只有当玩家攻击胶囊体,才会触发伤害值的显示,不过这个问题再这里我们可以先不追究,因为我们关注的是伤害数值的显示。到目前为止,这个问题已经圆满的解决了。 有朋友可能会问:为什么人家的游戏里显示的伤害效果看起来那么眩目,而你的程序却只能显示普普通通的文字呢?对于这个问题,我们这里给出两种思路,留给大家自己去探究啊。第一种方法是在项目中创建一个GUISkin,然后在DamagePopup脚本中添加一个GUIStyle类型的成员变量mStyle,通过该变量我们可以引用到在项目中创建的GUISkin。这样,我们就可以定义整体的GUI样式。此时,我们将OnGUI中的方法修改为: 如图,我们希望实现当角色攻击红色的胶囊体时,在游戏场景中显示玩家对胶囊体造成的伤害值。具体怎么做呢?我们可以先给模型和胶囊体加上碰撞器,并勾选IsTrigger使其成为一个触发器。我们分别将他们的tag设为Player和Enemy。接下来,为Enemy编写一个脚本:1. GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论