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

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

C#
1
Vector2 position = camera.WorldToScreenPoint (worldPosition);

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

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

NPC.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109

using UnityEngine;
using System.Collections;
public class NPC : MonoBehaviour {
//主摄像机对象
private Camera camera;
//NPC名称
private string name = "我是雨松MOMO";
//主角对象
GameObject hero;
//NPC模型高度
float npcHeight;
//红色血条贴图
public Texture2D blood_red;
//黑色血条贴图
public Texture2D blood_black;
    //默认NPC血值
private int HP = 100;
void Start ()
{
//根据Tag得到主角对象
hero = GameObject.FindGameObjectWithTag("Player");
//得到摄像机对象
camera = Camera.main;
//注解1
//得到模型原始高度
float size_y = collider.bounds.size.y;
//得到模型缩放比例
float scal_y = transform.localScale.y;
//它们的乘积就是高度
npcHeight = (size_y *scal_y) ;
}
void Update ()
{
//保持NPC一直面朝主角
transform.LookAt(hero.transform);
}
void OnGUI()
{
//得到NPC头顶在3D世界中的坐标
//默认NPC坐标点在脚底下,所以这里加上npcHeight它模型的高度即可
Vector3 worldPosition = new Vector3 (transform.position.x , transform.position.y + npcHeight,transform.position.z);
//根据NPC头顶的3D坐标换算成它在2D屏幕中的坐标
Vector2 position = camera.WorldToScreenPoint (worldPosition);
//得到真实NPC头顶的2D坐标
position = new Vector2 (position.x, Screen.height - position.y);
//注解2
//计算出血条的宽高
Vector2 bloodSize = GUI.skin.label.CalcSize (new GUIContent(blood_red));
//通过血值计算红色血条显示区域
int blood_width = blood_red.width * HP/100;
//先绘制黑色血条
GUI.DrawTexture(new Rect(position.x - (bloodSize.x/2),position.y - bloodSize.y ,bloodSize.x,bloodSize.y),blood_black);
//在绘制红色血条
GUI.DrawTexture(new Rect(position.x - (bloodSize.x/2),position.y - bloodSize.y ,blood_width,bloodSize.y),blood_red);
//注解3
//计算NPC名称的宽高
Vector2 nameSize = GUI.skin.label.CalcSize (new GUIContent(name));
//设置显示颜色为黄色
GUI.color  = Color.yellow;
//绘制NPC名称
GUI.Label(new Rect(position.x - (nameSize.x/2),position.y - nameSize.y - bloodSize.y ,nameSize.x,nameSize.y), name);
}
//下面是经典鼠标点击对象的事件,大家看一下就应该知道是什么意思啦。
void OnMouseDrag ()
{
Debug.Log("鼠标拖动该模型区域时");
}
void OnMouseDown()
{
Debug.Log("鼠标按下时");
if(HP >0)
{
HP -=5 ;
}
}
void OnMouseUp()
{
Debug.Log("鼠标抬起时");
}
void OnMouseEnter()
{
Debug.Log("鼠标进入该对象区域时");
}
void OnMouseExit()
{
Debug.Log("鼠标离开该模型区域时");
}
void OnMouseOver()
{
Debug.Log("鼠标停留在该对象区域时");
}
}

注解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 任务头上的血条相关推荐

  1. unity3d做会减少的血条_2019-2020年Unity3D——人物主角的血条-经验的显示.doc

    Unity3D--人物主角的血条 经验的显示 今天说一下人物主角的血量和经验还有人物等级金币的显示.? ? ???//主角刚出现的时候现有血量? ? public static int blood = ...

  2. 血条HpBar跟随敌人

    需求分析 在上节NGI--->制作血条UI中,已经制作好了血条UI即HpBar, 那么本节实现HpBar跟随敌人进行移动. 具体实现 1. 首先导入NGUI插件NGUI_HUD_Text_v1. ...

  3. UE4蓝图制作各种血条笔记兼教程

    前言 目前,网络上虽然有比较多的血条制作教程,但是都比较片面.或许你搜索到血条教程的并不是你需要的那种类型,本文就把笔者能想到的所有类型血条的蓝图教程做一个整合,一来与大家分享,二来作为一次笔记.** ...

  4. Unity3D NGUI学习(一)血条

    这次来讲讲Unity3D NGUI这个插件的学习,这个插件是收费的,不过去网上可以下载得很多可用版本.用来做用户的交互UI,学习起来比较简单 第一步,导入NGUI包 http://pan.baidu. ...

  5. Unity3D 人形血条制作小知识

    这几天用Unity3D做个射击小游戏,想做个人形的血条.百思不得其解,后来问了网上的牛牛们,攻克了,事实上挺简单的,GUI里面有个函数DrawTextureWithTexCoords就能够实现图片的裁 ...

  6. Unity3D游戏编程-血条

    Unity3D游戏编程-血条 文章目录 Unity3D游戏编程-血条 一.作业要求 二.项目配置 三.项目演示 (1)视频演示 (2)项目下载 (3)文字说明 (4)项目截图 四.前置内容 (1)IM ...

  7. 【Unity3D——UIFixedObj】用于跟随物体显示UI标签(如角色名、血条等)

    该脚本用于跟随物体显示UI标签(如角色名.血条等). 跟随角色,显示角色名或者血条/蓝条等,且不受摄像机距离远近影响. 可扩展:使该UI未处于视野范围内时隐藏,处于视野范围内时显示. 效果图如下所示: ...

  8. unity3d做会减少的血条_用Unity做血条或进度条常用脚本 - 纳金网

    本节汇宝盆为大家带来的是:用Unity做血条或进度条常用脚本 * 血条或进度条的效果 用Unity3d做血条或进度条真的很方便,GUI里scrollbar就可以轻松实现,再加上lerp一个血条或进度条 ...

  9. unity3d做会减少的血条_Unity3d中NGUI加强版血条(Healthbar)的制作

    这阵子项目中需要用到一种特殊样式的血条.描述如下: 1. 正常颜色为红色.受到伤害后,即将扣除的血量变暗(暗红色),并有下降动画效果: 2. 加护盾效果后,增加一部分血量值,该额外部分为白色,护盾效果 ...

最新文章

  1. Linux下高并发socket最大连接数所受的各种限制
  2. C语言取小于自身的最大整数,C语言整数类型(含取值范围和长度)
  3. mysql跨库分页查询,“跨库分页”的四种方案
  4. vue实现卡片式上下滑动_小卡片左右滑动的实现
  5. 广数980td系列2级密码及相关操作
  6. 倾斜摄影Smart3D建模培训视频 附文档数据下载
  7. 有关产品项目管理的ISO/IEC/IEEE标准
  8. 8086+8255A写数码管Proteus仿真及8086Proteus仿真问题
  9. Managing Supply and Demand Balance Through Machine Learning-笔记
  10. 谷粒学院P21所需的maven jar包
  11. 实战八:美国人口普查数据进行收入预测分类
  12. 1月16日云栖精选夜读 | 阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景...
  13. ELF文件格式, ELF文件是什么,里面包含什么内容
  14. sipp脚本撰写(二)
  15. NPC内网穿透教程-入门
  16. 干货!CDN内容分发网络实战技巧
  17. python模拟鼠标键盘操作_python3实现复制粘贴 Python-模拟鼠标键盘动作 | 猴头客
  18. chrome滚动条样式修改
  19. 数据结构与算法-最小生成树之克鲁斯卡尔(Kruskal)算法
  20. QOS—CoS值/IP优先权值 应用类型/令牌桶算法

热门文章

  1. boost 文件操作
  2. C++语法:求vector中的最大值及其位置
  3. icse ccf_ICSE的完整形式是什么?
  4. Java StringBuffer char charAt(int index)方法与示例
  5. 线性方程组 python_线性方程组的表示 使用Python的线性代数
  6. 请问染色浴比对染色性能有影响吗?浴比对染色的哪些性能有影响?染色亲和力测定有哪些实际应用意义
  7. Java——获取和设置多线程的名称
  8. 283. 移动零golang
  9. PyCharm怎么关闭端口,解决端口占用问题
  10. mysql gtid基础_MySQL 基础知识梳理学习(四)----GTID