码迷,mamicode.com
首页 > 其他好文 > 详细

UI3D转2D平面显示UI3DTo2D血条显示

时间:2018-09-09 15:31:14      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:变量   getc   abs   prefab   val   date()   ram   label   exception   

UI3D转2D平面显示UI3DTo2D血条显示:

using UnityEngine;

using System.Collections;

public class UI3DTo2D : MonoBehaviour

{

    private GameObject _TargetEnemyObj;                //目标物体

    private Camera worldcamera;                        //世界相机

    private Camera guiCamera;                          //UI相机

    private Slider uiSlider;                           //敌人的血条

    public float FloHPPrefabsLength = 2F;              //血条预设长度

    public float FloHpPrefabsHeight = 1F;              //血条预设高度

    public float FloHpHeightPosset = 1.5F;             //血条高度偏移量

    //敌人生命数值

    private float _FloCurrentHP = -999;                //当前生命数值

    private float _FloMaxHP = -999;                    //最大生命数值

    // 设置目标敌人

    public void SetTargetEnemy(GameObject goEnemy)

    {

        _TargetEnemyObj = goEnemy;

    }

    //初始化目标对象变量

    void Start()

    {

        //本UI Label 对象尺寸

        this.transform.localScale = new Vector3(FloHPPrefabsLength, FloHpPrefabsHeight, 0);

        //得到UI Slider 控件

        uiSlider = this.gameObject.GetComponent<Slider>();

        //世界摄像机(主摄像机)

        worldcamera = Camera.main.gameObject.GetComponent<Camera>();

        //带标签Tag_UICamera的UI摄像机

        guiCamera = GameObject.FindGameObjectWithTag(Tag.Tag_UICamera).GetComponent<Camera>();

        //参数检查

        if (_TargetEnemyObj == null)

        {

            return;

        }

    }

    // 计算敌人血量

    void Update()

    {

        //判断帧数

        if (Time.frameCount % 2 == 0)

        {

            try

            {

                //当前与最大生命值

                _FloCurrentHP = _FloCurrentHP;  //变化的生命值(实时更新)

                _FloMaxHP = _FloMaxHP;          //变化的生命值(实时更新)

                //计算敌人血量

                uiSlider.value = _FloCurrentHP / _FloMaxHP;

                //本UI Label 对象尺寸

                this.transform.localScale = new Vector3(FloHPPrefabsLength, FloHpPrefabsHeight, 0);

                if (_FloCurrentHP <= (_FloMaxHP * 0.05))

                {

                    //死亡销毁

                    Destroy(this.gameObject);

                }

            }

            catch (System.Exception)

            {

                throw;

            }

        }

    }

    // 敌人血量计算后,实时的把_TargetEnemyObj的世界坐标转换为UI世界坐标,通过世界摄像机,转屏幕坐标,再把3D敌人(世界摄像机)屏幕坐标,转UI摄像机的屏幕坐标

    void LateUpdate()

    {

        if (_TargetEnemyObj != null)

        {

            if (Time.frameCount % 2 == 0)

            {

                //获取目标物体的屏幕坐标

                Vector3 pos = worldcamera.WorldToScreenPoint(_TargetEnemyObj.transform.position);

                //将屏幕坐标转换为UI的世界坐标

                pos = guiCamera.ScreenToWorldPoint(pos);

                //由于NGUI 2D界面的Z轴都为0,只取其X,Y坐标              

                pos.z = 0;

                //将修改过的坐标赋给UI界面               

                transform.position = new Vector3(pos.x - 0.1f, pos.y + FloHpHeightPosset, pos.z);

            }

        }

    }

}

注:void LateUpdate()方法为摄像机转换坐标,是具体实现的过程,此方法为世界坐标和平面坐标之间的转换,可逆向操作实现

UI3D转2D平面显示UI3DTo2D血条显示

标签:变量   getc   abs   prefab   val   date()   ram   label   exception   

原文地址:https://www.cnblogs.com/XiaoLang0/p/9613265.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!