unity学习之怪物名称血条
2015-01-16 21:25
351 查看
欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频,我们致力于打造业内unity3d培训、学习第一品牌。
人物的名称与血条的绘制方法很简单,但是我们需要解决的问题是如何在3D世界中寻找合适的坐标。因为3D世界中的怪物是会移动的,它是在3D世界中移动,并不是在2D平面中移动,但是我们需要将3D的怪物坐标换算成2D平面中的坐标,继而找到怪物头顶在屏幕中的2D坐标最后使用GUI将名称与血条绘制出来。
//主摄像机对象
privateCamera
camera;
//NPC名称
privatestringname="老鼠";
//主角对象
GameObject hero;
//怪物模型高度
floatnpcHeight;
//红色血条贴图
publicTexture2D
blood_red;
//黑色血条贴图
publicTexture2D
blood_black;
//默认怪物血值
privateintHP=100;
voidStart()
{
//根据Tag得到主角对象
hero=GameObject.FindGameObjectWithTag("Player");
//得到摄像机对象
camera=Camera.main;
//注解1
//得到模型原始高度
floatsize_y=collider.bounds.size.y;
//得到模型缩放比例
floatscal_y=transform.localScale.y;
//它们的乘积就是高度
npcHeight=(size_y*scal_y);
}
voidUpdate()
{
//保持可以让怪物一直面朝主角
transform.LookAt(hero.transform);
}
voidOnGUI()
{
//得到怪物头顶在3D世界中的坐标
//默认怪物坐标点在脚底下,所以这里加上npcHeight它模型的高度即可
Vector3 worldPosition=newVector3(transform.position.x,transform.position.y+npcHeight,transform.position.z);
//根据怪物头顶的3D坐标换算成它在2D屏幕中的坐标
Vector2 position=camera.WorldToScreenPoint(worldPosition);
//得到真实怪物头顶的2D坐标
position=newVector2(position.x,Screen.height-position.y);
//注解2
//计算出血条的宽高
Vector2
bloodSize=GUI.skin.label.CalcSize(newGUIContent(blood_red));
//通过血值计算红色血条显示区域
intblood_width=blood_red.width*HP/100;
//先绘制黑色血条
GUI.DrawTexture(newRect(position.x-(bloodSize.x/2),position.y-bloodSize.y,bloodSize.x,bloodSize.y),blood_black);
//在绘制红色血条
GUI.DrawTexture(newRect(position.x-(bloodSize.x/2),position.y-bloodSize.y,blood_width,bloodSize.y),blood_red);
//计算怪物名称的宽高
Vector2 nameSize=GUI.skin.label.CalcSize(newGUIContent(name));
//设置显示颜色为黄色
GUI.color =Color.yellow;
//绘制怪物名称
GUI.Label(newRect(position.x-(nameSize.x/2),position.y-nameSize.y-bloodSize.y,nameSize.x,nameSize.y),name);
}
人物的名称与血条的绘制方法很简单,但是我们需要解决的问题是如何在3D世界中寻找合适的坐标。因为3D世界中的怪物是会移动的,它是在3D世界中移动,并不是在2D平面中移动,但是我们需要将3D的怪物坐标换算成2D平面中的坐标,继而找到怪物头顶在屏幕中的2D坐标最后使用GUI将名称与血条绘制出来。
//主摄像机对象
privateCamera
camera;
//NPC名称
privatestringname="老鼠";
//主角对象
GameObject hero;
//怪物模型高度
floatnpcHeight;
//红色血条贴图
publicTexture2D
blood_red;
//黑色血条贴图
publicTexture2D
blood_black;
//默认怪物血值
privateintHP=100;
voidStart()
{
//根据Tag得到主角对象
hero=GameObject.FindGameObjectWithTag("Player");
//得到摄像机对象
camera=Camera.main;
//注解1
//得到模型原始高度
floatsize_y=collider.bounds.size.y;
//得到模型缩放比例
floatscal_y=transform.localScale.y;
//它们的乘积就是高度
npcHeight=(size_y*scal_y);
}
voidUpdate()
{
//保持可以让怪物一直面朝主角
transform.LookAt(hero.transform);
}
voidOnGUI()
{
//得到怪物头顶在3D世界中的坐标
//默认怪物坐标点在脚底下,所以这里加上npcHeight它模型的高度即可
Vector3 worldPosition=newVector3(transform.position.x,transform.position.y+npcHeight,transform.position.z);
//根据怪物头顶的3D坐标换算成它在2D屏幕中的坐标
Vector2 position=camera.WorldToScreenPoint(worldPosition);
//得到真实怪物头顶的2D坐标
position=newVector2(position.x,Screen.height-position.y);
//注解2
//计算出血条的宽高
Vector2
bloodSize=GUI.skin.label.CalcSize(newGUIContent(blood_red));
//通过血值计算红色血条显示区域
intblood_width=blood_red.width*HP/100;
//先绘制黑色血条
GUI.DrawTexture(newRect(position.x-(bloodSize.x/2),position.y-bloodSize.y,bloodSize.x,bloodSize.y),blood_black);
//在绘制红色血条
GUI.DrawTexture(newRect(position.x-(bloodSize.x/2),position.y-bloodSize.y,blood_width,bloodSize.y),blood_red);
//计算怪物名称的宽高
Vector2 nameSize=GUI.skin.label.CalcSize(newGUIContent(name));
//设置显示颜色为黄色
GUI.color =Color.yellow;
//绘制怪物名称
GUI.Label(newRect(position.x-(nameSize.x/2),position.y-nameSize.y-bloodSize.y,nameSize.x,nameSize.y),name);
}
相关文章推荐
- 学习Unity3D之血条和打死怪物增加。
- Unity UGUI HUD 怪物血条实现
- (三)unity 3D 学习-按名称、标签访问其它物体
- unity 自我学习 怪物AI 【转】
- Unity学习之不同的怪物自动生成到自己的初始位置
- Unity 怪名称、血条和飘血跟随
- Unity学习之绘制血条及仇恨距离
- Unity插件之TDTK的学习之超萌怪物(四)
- Unity 学习笔记(3) -- 生命周期管理
- Unity Application Block 1.2 图文学习笔记
- MVC依赖注入Unity应用学习
- 条款43:学习处理模板化基类内的名称
- windows api学习笔记-遍历系统进程,获取进程名称和ID(进程快照)
- Unity 学习笔记(1) -- Unity简介及简单使用
- Unity Application Block 1.2 学习笔记 [转]
- 条款43:学习处理模板化基类内的名称
- Unity Application Block 1.2 图文学习笔记
- Petshop4.0学习笔记一——通过appSettings存储程序集名称
- .NET学习(2) 类,组和名称空间 (3)面向对象程序设计
- Unity Application Block 学习笔记之一使用接口