Unity + NGUI 实现人物头顶UI的信息展示
1、思路:
(1)信息数据:需要展示属性信息
(2)信息的展示:负责显示UI属性信息
(3)UI的跟随:负责实现UI对人物的跟随
(4)UI的管理:负责对UI进行创建于回收,游戏中需要用到UI的地方都是与该脚本的交互。
2、将需要用到的UI资源打到一个图集中,以免出现大量人物的时候图集穿插造成不良的影响。
3、创建一个头顶UI预设,当道对应的目录下面:


为了测试的方便,在Resources下面也放一个做好的UI预设:

需要注意的是,做的这个预设是不带Panel的,因为希望可以把游戏展示的所有人物头顶UI信息放到同一个Panel下管理。
4、创建一个Panel,用来管理头顶的UI信息:

5、UI跟随脚本:
using UnityEngine; /// <summary>
/// 2DUI跟随3D物体
/// </summary>
public class UIFollow3DPosition : MonoBehaviour
{
public Transform targetTrans; //2DUI需要跟随的3D目标
public Camera targetCa; //照射的3D目标的摄像机
public Vector3 offsetPos; //2DUI需要在3D目标点的基础上做出的偏移量
public float dis; //3D目标点与摄像机之间的距离,为了实现:3D目标点摄像机机发生变化的时候2DUI也跟随发生变化
public float ratio; //2DUI的缩放比例 [HideInInspector]
public bool isAutoScale = false; //控制2DUI是否发生缩放 public const float FarDistance = 40f; //3D目标点与摄像机的最大距离
public const float NearDistance = 6.5f; //3D目标点与摄像机的最小距离
public static Vector3 MaxScale = Vector3.one;
public static Vector3 MinScale = new Vector3(0.5f, 0.5f, 0.5f); private Camera uiCa; //NGUI摄像机
Transform selfTrans; //2DUI,因为该脚本是挂在2DUI上的
GameObject selfObj; //2DUI
Vector3 screenPos; //2DUI的屏幕坐标
Vector3 curPos; //2DUI的世界坐标
Vector3 backPos = new Vector3(, , ); public Transform cachedTransform
{
get
{
if (trans == null)
trans = transform;
return trans;
}
}
private Transform trans; void Awake()
{
selfTrans = transform;
selfObj = gameObject;
uiCa = UICamera.first.cachedCamera;
}
public void QuickUpdate()
{
LateUpdate();
}
void LateUpdate()
{
if (targetTrans != null && targetCa != null)
{
screenPos = targetCa.WorldToScreenPoint(targetTrans.position + offsetPos);
if(screenPos.z < )
{
selfTrans.localPosition = backPos;
}
else
{
curPos = uiCa.ScreenToWorldPoint(screenPos);
curPos.z = ;
selfTrans.position = curPos;
}
if(isAutoScale)
{
dis = Vector3.Distance(targetTrans.position, targetCa.transform.position);
ratio = Mathf.Clamp01((dis - NearDistance) / (FarDistance - NearDistance));
cachedTransform.localScale = Vector3.Lerp(MaxScale, MinScale, ratio);
}
}
}
}
6、数据及展示的实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine; namespace Module.UI
{
//头顶显示需要用到的是数据
public class CharacterTopParam
{
public int level;
public string name; public CharacterTopParam(int level, string name)
{
this.level = level;
this.name = name;
}
} public class UI_Character_TopUI : MonoBehaviour
{
[SerializeField]
UILabel lblInfo; GameObject obj = null;
public GameObject cachedGameObjec
{
get
{
if (null == obj)
obj = gameObject;
return obj;
}
} UIFollow3DPosition followPos = null;
public UIFollow3DPosition FollowPos
{
get
{
if (null == followPos)
{
followPos = cachedGameObjec.GetComponent<UIFollow3DPosition>();
followPos.isAutoScale = true;
}
return followPos;
}
} public void Show(CharacterTopParam param)
{
if (null != param)
{
lblInfo.text = string.Format("LV.{0} Name.{1}", param.level, param.name);
cachedGameObjec.SetActive(true);
}
} public void Hide()
{
cachedGameObjec.SetActive(false);
} }
}
7、将以上两个脚本挂载到做好的UI预设上,并进行相应的设置:

8、UI管理脚本的实现:
using System.Collections;
using System.Collections.Generic;
using UnityEngine; namespace Module.UI
{
public class BillboardUIManager
{
static BillboardUIManager billboardMgr = null;
public static BillboardUIManager BillboardMgr
{
get
{
if (null == billboardMgr)
billboardMgr = new BillboardUIManager();
return billboardMgr;
}
} Transform childParent; public BillboardUIManager()
{
GameObject go = GameObject.Find("UI Root/BillboardPanel");
childParent = NGUITools.AddChild(go).transform;
} public void Destroy()
{
GameObject.Destroy(childParent.gameObject);
} public void SetParentRootActive(bool active)
{
childParent.gameObject.SetActive(active);
} Queue<UI_Character_TopUI> queueCharacterTopUI = new Queue<UI_Character_TopUI>();
public UI_Character_TopUI GetCharacterTopUI(Transform target, Camera cam)
{
UI_Character_TopUI topUI = null;
if (queueCharacterTopUI.Count <= )
{
Object go = Resources.Load("ui_character_top");
if (go)
{
GameObject prefab = GameObject.Instantiate(go) as GameObject;
prefab.transform.parent = childParent;
prefab.transform.localPosition = Vector3.zero;
prefab.transform.localRotation = Quaternion.identity;
prefab.transform.localScale = Vector3.one;
NGUITools.SetLayer(prefab, childParent.gameObject.layer);
topUI = prefab.GetComponent<UI_Character_TopUI>();
}
}
else
{
topUI = queueCharacterTopUI.Dequeue();
} topUI.FollowPos.targetTrans = target;
topUI.FollowPos.targetCa = cam;
topUI.FollowPos.offsetPos = new Vector3(, , ); return topUI;
} void RecycleCharacterUI(UI_Character_TopUI topUI)
{
if (null != topUI)
{
topUI.Hide();
queueCharacterTopUI.Enqueue(topUI);
}
}
}
}
9,以上就是全部的核心逻辑,下面是调用逻辑:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Module.UI; public class CubeCtrl : MonoBehaviour
{
[SerializeField]
Camera targetCam; float speed = 20.0f; Transform trans = null;
public Transform Trans
{
get
{
if (null == trans)
trans = transform;
return trans;
}
} //Show UI Info
UI_Character_TopUI characterTopUI = null;
public UI_Character_TopUI CharacterTopUI
{
get
{
if (null == characterTopUI)
characterTopUI = BillboardUIManager.BillboardMgr.GetCharacterTopUI(Trans, targetCam);
return characterTopUI;
}
} void Start()
{
Trans.transform.rotation = Quaternion.identity;
CharacterTopParam param = new CharacterTopParam(, "我是方的");
CharacterTopUI.Show(param);
} void Update()
{
if (Input.GetKey(KeyCode.A))
{
Trans.Translate(-Time.deltaTime * speed, , );
}
else if (Input.GetKey(KeyCode.D))
{
Trans.Translate(Time.deltaTime * speed, , );
}
else if (Input.GetKey(KeyCode.W))
{
Trans.Translate(, , Time.deltaTime * speed);
}
else if (Input.GetKey(KeyCode.S))
{
Trans.Translate(, , -Time.deltaTime * speed);
}
}
}

10、项目运行前后的效果对比图:

11、项目运行时候的结构:

Unity + NGUI 实现人物头顶UI的信息展示的更多相关文章
- Unity NGUI 网络斗地主 -界面制作
Unity NGUI 网络斗地主 -界面制作 源文件在群(63438968群共享!) @灰太龙 这一节说一下NGUI的界面摆放,并且教会大家使用NGUI的自适应功能! 在这里感谢@Gamer,是他给我 ...
- Unity NGUI实现Tabview
unity版本:4.5.1 NGUI版本:3.5 参考链接:http://blog.csdn.net/g__dragon/article/details/17242969,作者:CSDN G_Drag ...
- BMFont中文字体图集制作的方法~(for unity ngui)
BMFont中文字体图集制作的方法~(for unity ngui) 好吧~似乎这个问题困扰了很多人,游戏开始中文化是个不错的事儿啊,这里我就做下说明,如何制作中文字体图集~ 这里的字库图集的制作更多 ...
- Unity NGUI 粒子的排序
Unity NGUI系统中是没有对粒子进行排序的,如: 怎么解决这个问题呢? 思路是把粒子的渲染层级,相对于UI组件的层级进行一个偏移. 解决后的效果如下: 代码如下: using System.Co ...
- unity NGUI点击消息不传入到场景中去
unity NGUI点击消息不传入到场景中去 1.今天遇到的问题是点击NGUI的按钮,场景中也相应了这个消息 解决的办法是在场景中需要互动的时候,也就是在update中进行判断 是否是点击了NGUI按 ...
- Unity NGUI 网络斗地主 -发牌 脚本交互
Unity NGUI 网络斗地主 -发牌 脚本交互 @By 灰太龙 Unity4.2.1f4 NGUI 3.0.4 本篇说的问题是脚本与控件的交互! 现在对界面进行了改进,先看副图! 1.制作发牌效果 ...
- Unity NGUI 网络斗地主 -制作图集 Atlas
Unity NGUI 网络斗地主 -制作图集 Atlas by @杨海龙 开发环境 Win7+Unity4.2.1f4+NGUI 3.0.4版本 这一节告诉大家如何制作(图集)Atlas! 1.首 ...
- Unity NGUI 3.0.4版本 制作网络版斗地主
Unity NGUI 3.0.4版本 @by 灰太龙 开发环境 Win7旗舰版 Unity 4.2.1f4 本文就写个开门篇,告诉大家怎么用NGUI,第一步导入NGUI 3.0.4版本! 1.启动U ...
- Unity里的人物驱动/换装备/换武器/换衣服/卡通重定位(转)
Unity里的人物驱动/换装备/换武器/换衣服/动画重定位 刚学的过程被这个问题困扰最多. 首先,基本的,大家都知道驱动人物需要骨架.绑骨的Mesh和动画(这三个要是不知道的话就得考虑看看计算机图形学 ...
随机推荐
- Trove系列(四)—Trove的快照功能介绍
Trove 快照用于支持DbaaS 备份,复制等功能.在Trove API (guest_agent)上将支持本功能.本功能将能够支持快照,从而用来进行副本设置,主数据库克隆和备份,以及数据恢复.目前 ...
- sql when null 判断
Sql Server 中使用case when then 判断某字段是否为null,和判断是否为字符或数字时的写法不一样,如果不注意,很容易搞错 错误方法: CASE columnName WHEN ...
- Python: 去掉字符串开头、结尾或者中间不想要的字符
①Strip()方法用于删除开始或结尾的字符.lstrip()|rstirp()分别从左右执行删除操作.默认情况下会删除空白或者换行符,也可以指定其他字符. ②如果想处理中间的空格,需要求助其他技术 ...
- python webdriver api-读取、设置配置文件
文件结构: db.ini放置db信息的配置文件 文件中[gloryroad]是section信息 下边的dbname等是option信息 UiObjectMap.ini放置访问web的配置信息 配置用 ...
- Wireshark图解教程(简介、抓包、过滤器)(转)
本文转自:http://www.cnblogs.com/observer/archive/2011/11/04/2235219.html 下面是一张地址为192.168.1.2的计算机正在访问&quo ...
- 我用了7年时间成长为阿里Java架构师,你呢?(附学习路线图)
前言:我用了七年的时间,一步一步走到了现在,中途也有了解过其他的技术,也想过要转其他的语言,但是最后还是坚持下来走Java这条路,希望我的经历可以帮助到后来的人,要是觉得对你有帮助的话,可以点赞关 ...
- 手撕vue-cli配置文件——check-versions.js篇
check-versions.js,vue-cli中检查版本的js文件. 'use strict' const chalk = require('chalk') const semver = requ ...
- 20145206邹京儒Exp6 信息搜集与漏洞扫描
20145206邹京儒Exp6 信息搜集与漏洞扫描 一.实践过程记录 openvas漏洞扫描 1.openvas-check-setup来查看下他的安装状态: 如下图所示:在步骤7中出现错误,显示需要 ...
- 20145322 Exp5 利用nmap扫描
20145322 Exp5 利用nmap扫描 实验过程 使用命令创建一个msf所需的数据库 service postgresql start msfdb start 使用命令msfconsole开启m ...
- 20145335郝昊《网络攻防》Exp9 Web安全基础实践
20145335郝昊<网络攻防>Exp9 Web安全基础实践 实验内容 理解常用网络攻击技术的基本原理. 完成WebGoat实践下相关实验 实验步骤 XSS注入攻击 Phishing wi ...