unity3d HudText、UIFollowTarget 产生掉血特效

前言

UIFollowTarget:
Target表示的是所要跟随的3D物体,一般是跟随在该物体正中心,所以为了使其跟随在物体顶部,一般做法是在物体下面创建子物体,然后让子物体位于父物体的顶部,把目标设置为子物体,这样就能实现跟随在父物体的顶部了。
Game Camera表示渲染Target的Camera,一般来说都是Main Camera。
然后在UI Root面板下面有个Camera
NGUI名字跟随、伤害显示、血条和miss效果的制作
该Camera的Layer为空,所有UIRoot下的NGUI物体都为空,所要该Camera是负责渲染NGUI物体,UiCamera则是它。添加了UIFollowTarget的任何一个NGUI控件,会跟随某3D物体。

HUDText:
用于显示所需要显示的字体,从上至下的属性名称依次为:
动态字体、静态字体、字体大小、字体风格、应用渐变、渐变字体顶部颜色、
渐变字体底部颜色、字体效果、字体效果的颜色、偏移曲线、透明度曲线和大小变幻曲线

大致实现掉血的分数思路

  1. 制作UI流血特效,做成预制体
  2. 制作生成UI特效预支体的特效位置(然后使用UIFollowTarget让其跟踪敌人对象上)
  3. 制作敌人预制体,敌人预支体上有个空物体,这个空物体就是特效预支体要跟随的敌人对象的具体位置
  4. 做生成多个敌人来进行测试

制作流程

  • 创建对象

    一个是HudParent空物体,做特效生成父物体位置
    一个是HudEffect空物体, UI特效 (做成预制体),包含一个HPSprite子物体对象
    一个Enemy对象, 做场景敌人 (做成预制体),包含一个孩子空物体做特效的位置
    一个空物体对象Span,用来生成敌人

  • 添加脚本

    这里写3个脚本,两个制作好的组件

    1. 给HudEffect添加两个组件HUDText,UIFollowTarget。给脚本HUDText的TrueTypeFont属性添加一个字体。
    2. 给HudParent写一个HudParent脚本,为了方面找到该物体对象,做成单例
    3. 给Span写一个创建敌人脚本CreateEnemy
    4. 给敌人写一个简单的检测掉血脚本Enemy

脚本代码

这里只列出主要的敌人脚本,每次生成敌人都会创建一个血量特效UI,让其跟随敌人的头上位置(子空物体),接着通过鼠标移动,控制HUDText 来控制血量丢失的文字Label显示

using UnityEngine;
using System.Collections;

public class MyEnemy : MonoBehaviour {

    public GameObject _enemyEffectPrefabs;

    GameObject _effectFollowTarget;

    GameObject _enemyHudEffect;

    UIProgressBar _effectHPProgress;

    float HP = 50;

    void Start(){
        _effectFollowTarget = transform.Find ("HudPosition").gameObject;

        //血条特效是UI,需要在UI层设置位置,创建gameObject
        _enemyHudEffect = NGUITools.AddChild (HudPosition._instance.gameObject, _enemyEffectPrefabs);

        //但是特效UI镜头要根据实际的敌人身上  ,camera如何理解?
        _enemyHudEffect.GetComponent<UIFollowTarget> ().target = _effectFollowTarget.transform;

        //找到特效位置
        _effectHPProgress = _enemyHudEffect.transform.Find ("HPSprite").GetComponent<UIProgressBar> ();

        _effectHPProgress.value = 1;

    }

    void OnMouseEnter(){
        Debug.Log (this.gameObject.name);

        _enemyHudEffect.GetComponent<HUDText> ().Add ("-10", Color.red, 0.3f);
        HP -= 10;
        float hpValue = HP / 50.0f;
        _effectHPProgress.value = hpValue;

        if (HP <= 0) {
            Destroy (gameObject);
        }
    }
}

测试图

1

猜你喜欢

转载自blog.csdn.net/liaoshengg/article/details/81096894