大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。众所周知,在RPG游戏策划中最为重要的一个环节是数值策划。数值策划是一个关于游戏平衡方面的概念,它是一种非常深奥的概念。

游戏从某种意义上 是多种选择的组合,因此假设一个游戏失去平衡,那么就会降低选择而影响游戏的乐趣。

数值策划人员通常须要依照一定的规则和方法将整个游戏系统的相关数值调整到一个合适的范围。以确保玩家能够有很多其它地选择以增强游戏的可玩性。数值策划是近年来国内游戏行业从国外游戏业引申过来的一个概念。博主觉得我们在学习游戏设计的过程中,除了专注于技术上的实现以外,还应该对游戏设计中的相关理论有所了解。关于数值策划的具体内容,大家能够从这里了解:http://baike.baidu.com/view/1756429.htm

好了,以下我们開始今天的内容: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.z>0)
  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坐标

好了。以下我们将这个脚本绑定在一个空的游戏体上。并制作成预设,在以下的演示样例中。我们将使用这个预设。

如图,我们希望实现当角色攻击红色的胶囊体时。在游戏场景中显示玩家对胶囊体造成的伤害值。具体怎么做呢?我们能够先给模型和胶囊体加上碰撞器,并勾选IsTrigger使其成为一个触发器。我们分别将他们的tag设为Player和Enemy。

接下来,为Enemy编写一个脚本:

  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<DamagePopup>().Value=Random.Range(20,40);
  15. }
  16. }
  17. }

这里我们设定玩家对敌人造成的伤害值为20到40,执行程序,我们会得到以下的结果:

因为这里博主使用的是非精确碰撞,所以导致程序一開始角色就和胶囊体发生了碰撞,而OnTrigger()方法因为仅仅能在碰撞開始的时候捕捉碰撞。所以这里仅仅显示了一次伤害值。

理论上仅仅有当玩家攻击胶囊体,才会触发伤害值的显示。只是这个问题再这里我们能够先不追究,因为我们关注的是伤害数值的显示。

到眼下为止,这个问题已经圆满的攻克了。

有朋友可能会问:为什么人家的游戏里显示的伤害效果看起来那么眩目,而你的程序却仅仅能显示普普通通的文字呢?对于这个问题,我们这里给出两种思路,留给大家自己去探究啊。

第一种方法是在项目中创建一个GUISkin,然后在DamagePopup脚本中加入一个GUIStyle类型的成员变量mStyle。通过该变量我们能够引用到在项目中创建的GUISkin。

这样,我们就能够定义总体的GUI样式。此时,我们将OnGUI中的方法改动为:

  1. GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString(),mStyle);

这样我们就能够实现自己定义的文字效果了。另外一种方法是使用贴图,即首先准备0-9的数字图片,然后我们将Value各个数位上的数字分别截取出来,依据截取的结果来绘制贴图,这样相同能够实现自己定义的效果。好了。今天的内容就是这样了。感谢大家关注我的博客,希望大家能够喜欢今天的内容。

每日箴言:活得优雅些,别人压不垮你,内心的强大才是真正的强大。

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

[Unity3D]Unity3D游戏开发之伤害数值显示的更多相关文章

  1. Unity3D手机游戏开发

    <Unity3D手机游戏开发> 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 ...

  2. 关于《Unity3D/2D游戏开发从0到1》书籍再版说明

    关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于U ...

  3. 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结

    前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...

  4. 《Unity3D/2D游戏开发从0到1》正式出版发行

    <Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息:      书籍的名称: <Uni ...

  5. Unity3D 入门 游戏开发 Unity3D portal game development

    Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...

  6. Unity3D独立游戏开发日记(二):摆放建筑物

    在沙盒游戏里,能自由建造是很重要的特点,比如说风靡全球的<我的世界>,用一个个方块就能搭建出规模宏大的世界.甚至有偏激的人说,没有自由建造,就不是一个真正的沙盒游戏.的确,沙盒游戏的魅力有 ...

  7. Unity3D独立游戏开发日记(一):动态生成树木

    目前写的独立游戏是一个沙盒类型的游戏.游戏DEMO视频如下: 提到沙盒类型的游戏,就有人给出了这样的定义: 游戏世界离现实世界越近,自由度.随机度越高才叫沙盒游戏.所谓自由度,就是你在游戏里想干啥就干 ...

  8. Unity3D小游戏开发之两个我踩过的坑

    最近在开发一个植物大战僵尸小游戏,今天写了一早上的代码,踩了两个坑,这两个坑的位置分别位于触发器和数据转换,写这篇博文以此来让其他程序员不要再去踩这两个坑. 1.我在做简易僵尸模型的时候,这个僵尸模型 ...

  9. Photon + Unity3D 在线游戏开发 学习笔记(两)

    本文和大家 和大家说说 Photon 解压后的目录结构 这里面最基本的我们 以后开发要用到的目录 就是  deploy目录,这个目录里 放的是要挂载的 server 当然我们的 server端也要放在 ...

随机推荐

  1. asp.net权限控制的方式

    我们在使用asp.net开发Web程序的时候经常需要进行一些权限控制,如: 限制用户没有登陆就无法查看一些页面,又或者是说登陆之后如果不是管理员,或是没有响应的权限就无法进行相关的操作. 实现的方法有 ...

  2. service 和 Controller 差别

    service  层能够看做是还有一个 DAO 层,仅仅是在里面封装了还有一些逻辑. 而 Controller 和 service 差别就大了.Controller 要处理请求映射, service ...

  3. SQL Server 高性能写入的一些经验总结

    转自:http://www.jb51.net/article/31162.htm 本篇博文将针对一些常用的数据库性能调休方法进行介绍,而且,为了编写高效的SQL代码,我们需要掌握一些基本代码优化的技巧 ...

  4. nyoj237 游戏高手的烦恼(最小点覆盖)

    题目237 题目信息 pid=237" style="text-decoration:none; color:rgb(55,119,188)">执行结果 本题排行 ...

  5. wifi破解到局域网渗透

    本文转自 _博客 一,密码破解 wifi破解最主要的还是抓握手包破解(不要给我说某某钥匙的“分享”). wifi认证主要分为四步: 1,无线客户端与ap连接时,首先发送一个认证请求包 2,ap收到请求 ...

  6. POJ 2942 Knights of the Round Table 黑白着色+点双连通分量

    题目来源:POJ 2942 Knights of the Round Table 题意:统计多个个骑士不能參加随意一场会议 每场会议必须至少三个人 排成一个圈 而且相邻的人不能有矛盾 题目给出若干个条 ...

  7. 小伙子又乱码了吧-Java字符编码原理总结

    前提 配合前面阅读的I/O和NIO的资料,现在总结一下关于字符集和乱码问题的原理和解决方案.参考资料: 码表ASCII Unicode GBK UTF-8 字符编码笔记ASCII,Unicode和UT ...

  8. 获取request中的查询参数

    //获取request中的查询参数 public static Map<String, Object> getRequestParamsByMap(HttpServletRequest r ...

  9. Refactoring之——代码的坏味道(一)过长方法

    1 代码的坏味道 重构一书中提到了22种代码的坏味道,大致可以分为几类. 识别代码的坏味道,有助于发现代码的潜在问题,从而可以有的放矢的修改现有代码,使之不断完善. 1.1 Bloaters(臭鲱,暂 ...

  10. Spark on Yarn 集群运行要点

    实验版本:spark-1.6.0-bin-hadoop2.6 本次实验主要是想在已有的Hadoop集群上使用Spark,无需过多配置 1.下载&解压到一台使用spark的机器上即可 2.修改配 ...