Ngui角色信息跟随
在一些网络游戏中,我们常常能看到角色上方显示着角色的名称、等级、血量等信息,这些信息会跟随角色移动,还能进行显示和隐藏操作。要实现Ngui角色信息跟随功能,我们需要学习不少知识。今天,我们就来详细探讨其实现方法。
1. 新建Unity工程并导入NGUI插件
对于字体、按钮等的制作方法,可参考以前的系列教程。下面我们直接开始学习具体制作步骤:
- 新建一个2D UI,将UI的层设置为NGUI。
- 新建完成后,使用菜单“NGUI --> Create a Panel”,在现有Panel的节点下新建一个Panel,命名为“Panel_CharacterInfo”,将其作为角色信息面板的根节点。
- 使用Widget Tool创建两个Label,一个命名为“Name”,另一个命名为“Life”。
- 再创建一个Progress Bar,用于显示角色的血量信息。创建完成后,场景中的视图列表可参考对应图示。
2. 场景设置
- 新建一个Plane作为地面。
- 新建一个PointLight用于场景照明。
- 新建一个Cube,将其作为我们的角色。场景设置可参考对应图示。
3. 为Cube添加角色控制器
- 导入角色控制Package。在工程窗口中点击右键,选择“Import Package”,然后选择“Character Controller”。该包包含两个角色控制器。
- 先把Cube自带的BoxCollider删除,然后为它添加“FPSInputController”和“CharacterMotor”两个脚本,至此完成Cube的角色设置。点击运行,按下键盘的方向键,可看到Cube能根据按键左右移动。
4. 编写UI跟随角色控制脚本
要实现UI跟随角色移动,思路如下:我们要让UI跟随Cube移动,就需要让UI获取Cube在屏幕上的坐标位置,然后根据该位置进行相应移动。在Unity中,“Camera.WorldToScreenPoint”和“Camera.ScreenToWorldPoint”可以分别实现世界坐标和屏幕坐标的相互转换。下面是具体代码,代码中已添加详细注释:
public class UIFollowTarget : MonoBehaviour {
public GameObject TargetObject; // 目标物体,这里指Cube
public Camera worldcamera; // 世界相机
public Camera guiCamera; // UI相机
// Use this for initialization
void Start () {
worldcamera = NGUITools.FindCameraForLayer(TargetObject.layer);
// 通过物体的层获得相应层上的相机
guiCamera = NGUITools.FindCameraForLayer(this.gameObject.layer);
// 通过脚本所在物体的层获得相应层上的相机
}
// Update is called once per frame
void Update () {
// 可根据需求添加其他逻辑
}
void LateUpdate() {
Vector3 pos = worldcamera.WorldToScreenPoint(TargetObject.transform.position);
// 获取目标物体的屏幕坐标
pos = guiCamera.ScreenToWorldPoint(pos);
// 将屏幕坐标转换为UI的世界坐标
pos.z = 0;
// 由于NGUI 2D界面的Z轴都为0,这里将坐标修改为0,只取其X、Y坐标
transform.position = pos;
// 将修改过的坐标赋给UI界面,这里指Panel_CharacterInfo
}
}
5. 脚本赋值与运行测试
将上述脚本赋给“Panel_CharacterInfo”,设置目标物体为Cube,Worldcamera为Main Camera,guicamera设置为NGUI的Camera。完成后点击运行,此时可以看到UI已经在跟随物体移动了。
6. 多角色信息显示与隐藏思路
当场景中有很多角色时,我们可能只想查看选中角色的信息,未选中的角色信息则隐藏。以下是实现该功能的思路供大家参考:首先定义一个角色信息的类,然后根据当前选择的角色,读取该角色的信息,并将其赋值给UI里的“Name”“Life”等参数。同时,将角色的位置信息赋值给UI,这样UI就能动态地显示在相应角色的位置上。待大家熟悉前面的操作后,可自行实现该功能。