zoukankan      html  css  js  c++  java
  • Unity3d中角色模型和角色名字保持相对位置

    3D游戏中,经常遇到这样的情况。角色模型上需要显示角色名字或者血条等信息。

    如果用一个摄像机会有可能出现名字或血条显示不正常等问题,所以我采用两个摄像机。一个渲染名字或血条等UI,另一个渲染角色模型。

    下面以NGUI为例,实现这一功能。

    如图所示,一个相机负责渲染UI,另外一个负责渲染游戏场景。

    再添加脚本NamePanel,代码如下:

    /*
    date:2014-10-13
    author:wg
    description:英雄名字面板
    */
    
    using UnityEngine;
    using System.Collections;
    
    public class NamePanel : MonoBehaviour
    {
        [SerializeField]
        UILabel lblName;
    
        [SerializeField]
        GameObject obj;
    
        [SerializeField]
        Camera mainCamera;
    
        [SerializeField]
        Camera uiCamera;
    
        void Update()
        {
            UpdateNamePosition();
        }
    
        Vector3 m_position;
        /// <summary>
        /// 更新名字位置
        /// </summary>
        void UpdateNamePosition()
        {
            //取模型在主摄像机中的世界坐标
            m_position = obj.transform.position;
            //转换为主摄像机的屏幕坐标
            m_position = mainCamera.WorldToScreenPoint(m_position);
            //用得到的屏幕坐标,在UI摄像机中转换为世界坐标
            m_position = uiCamera.ScreenToWorldPoint(m_position);
            m_position.z = 0f;
            m_position.y += 0.1f;
            lblName.transform.position = m_position;
        }
    }

    在Update中更新坐标,实际使用按照具体情况。这里是以屏幕坐标为参考,同时也可以用视口坐标。

    将脚本挂在GameManager上,其中:Obj是角色模型。

     然后点击运行,就会发现名字面板紧跟着模型

  • 相关阅读:
    Python 基础之 线程与进程
    python 基础之 模块
    Python 基础之socket编程(三)
    Python 基础之socket编程(二)
    Python全栈开发之11、进程和线程
    用 Python实现一个ftp+CRT(不用ftplib)
    Python全栈开发之10、网络编程
    Python全栈开发之9、面向对象、元类以及单例
    Python全栈开发之8、装饰器详解
    用python实现一个无界面的2048
  • 原文地址:https://www.cnblogs.com/wugang/p/4022485.html
Copyright © 2011-2022 走看看