查看: 1366|回复: 1
打印 上一主题 下一主题

[经验分享] unity实现RPG中攻击与受伤时的分数的动态效

[复制链接]

100

主题

3

听众

7683

积分

高级设计师

Rank: 6Rank: 6

纳金币
2378
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2015-2-8 22:10:48 |只看该作者 |倒序浏览
unity使用AnimationCurve实现RPG中攻击与受伤时的分数的动态效果ScoreFlash

先看一下很普通的实现方式:


随便命名一个javascript脚本。然后复制如下的代码之后随便挂在一个对象上,观察效果。

var Point : float;      //要显示的分数  
private var GetHitEffect : float;      
private var targY : float;         //分数所要显示的位置Y值  
private var PointPosition : Vector3;   //分数的显示位置  

var PointSkin : GUISkin;  
var PointSkinShadow : GUISkin;  

function Start() {  
Point = Mathf.Round(Random.Range(Point/2,Point*2));  
PointPosition = transform.position + Vector3(Random.Range(-1,1),0,Random.Range(-1,1));  
targY = Screen.height /2;  
}  

function OnGUI() {  
var screenPos2 : Vector3 = Camera.main.camera.WorldToScreenPoint (PointPosition);  
GetHitEffect += Time.deltaTime*30;  
GUI.color = new Color (1.0f,1.0f,1.0f,1.0f - (GetHitEffect - 50) / 7);//改变分数的透明度逐渐消失  
GUI.skin = PointSkinShadow;  
GUI.Label (Rect (screenPos2.x+8 , targY-2, 80, 70), "+" + Point.ToString());  
GUI.skin = PointSkin;  
GUI.Label (Rect (screenPos2.x+10 , targY, 120, 120), "+" + Point.ToString());  
}  

function Update() {     //分数向上移动  
targY -= Time.deltaTime*200;  
}  


然后来介绍 曲线的运动方式。
新建一个脚本如下:

// -------------------------------------------------------------------------------------  
// <copyright file = "MyTween.cs" company = "Game Developer">  
// <author = Sunguangdong>  
// </copyright>  
//  
// <summary>  
// 可以挂在UI上,进行砍杀时受击,分数的动态显示  
// </summary>  
// -------------------------------------------------------------------------------------  
using UnityEngine;  
using System.Collections;  
using System;  

public class MyTween : MonoBehaviour {  

    public bool m_Pingpong = false;  
    public bool UseTweenPos = false;  

    public bool PosSpeedCurve = false;  
    public AnimationCurve PosCurve;  
    public Vector3 m_BeginPos = Vector3.zero;  
    public Vector3 m_EndPos = Vector3.zero;  

    public bool UseTweenScale = false;  
    public AnimationCurve ScaleCurve;  
    public Vector3 m_BeginScale = Vector3.one;  
    public Vector3 m_EndScale = Vector3.one;  

    public bool UseTweenRot = false;  
    public AnimationCurve RotCurve;  
    public Vector3 m_BeginRot = Vector3.zero;  
    public Vector3 m_EndRot = Vector3.zero;  

    /// <summary>  
    /// tween的持续时间  
    /// </summary>  
    public float TweenTime = 1f;  

    // 接口区域  
    public void Play(Vector3 offset, bool reverse = false , Transform target = null, Action callback = null )  
    {  
        m_BeginTime = Time.time;  
        m_Reverse = reverse;  
        m_Target = target;  
        m_EndCallback = callback;  
        m_Offset = offset;  
        m_PlayTween = true;  
    }  

    /// <summary>  
    /// tween的起始时间  
    /// </summary>  
    private float m_BeginTime = 0f;  

    private Vector3 PosDist  
    {  
        get  
        {  
            return ToPos - FromPos;  
        }  
    }  

    private Vector3 ScaleDist  
    {  
        get  
        {  
            return ToScale - FromScale;  
        }  
    }  

    private Vector3 RotDist  
    {  
        get  
        {  
            return ToRot - FromRot;  
        }  
    }  
    private Vector3 UILocalPos  
    {  
        get  
        {  
            return m_Target == null ? Vector3.zero : m_Offset + UITool.PosToLocal(m_Target.position, m_RootScale);  

        }  
    }  
    private Vector3 FromPos  
    {  
        get  
        {  
            return m_Reverse ? UILocalPos + m_EndPos : UILocalPos + m_BeginPos;  
        }  
    }  
    private Vector3 ToPos  
    {  
        get  
        {  
            return m_Reverse ? UILocalPos + m_BeginPos : UILocalPos + m_EndPos;  
        }  
    }  
    private Vector3 FromScale  
    {  
        get  
        {  
            return m_Reverse ? m_EndScale : m_BeginScale;  
        }  
    }  
    private Vector3 ToScale  
    {  
        get  
        {  
            return m_Reverse ? m_BeginScale : m_EndScale;  
        }  
    }  
    private Vector3 FromRot  
    {  
        get  
        {  
            return m_Reverse ? m_EndRot : m_BeginRot;  
        }  
    }  
    private Vector3 ToRot  
    {  
        get  
        {  
            return m_Reverse ? m_BeginRot : m_EndRot;  
        }  
    }  
    private float EndTime  
    {  
        get  
        {  
            return m_BeginTime + TweenTime;  
        }  
    }  
    private float PosVal  
    {  
        get  
        {  
            return m_Reverse ? 1 - PosCurve.Evaluate(CurTime) : PosCurve.Evaluate(CurTime);  
        }  
    }  
    private float ScaleVal  
    {  
        get  
        {  
            return m_Reverse ? 1 - ScaleCurve.Evaluate(CurTime) : ScaleCurve.Evaluate(CurTime);  
        }  
    }  
    private float RotVal  
    {  
        get  
        {  
            return m_Reverse ? 1 - RotCurve.Evaluate(CurTime) : RotCurve.Evaluate(CurTime);  
        }  
    }  
    private float CurTime  
    {  
        get  
        {  
            return m_Reverse ? (EndTime - Time.time) / TweenTime : (Time.time - m_BeginTime) / TweenTime;  
        }  
    }  

    private void UpdatePos()  
    {  
        if( !UseTweenPos || PosCurve == null )  
        {  
            return;  
        }  

        if (PosSpeedCurve )  
        {  
            transform.localPosition = FromPos + PosDist * PosVal;  
        }  
        else  
        {  
            m_CurVect.x = FromPos.x + PosDist.x * (Time.time - m_BeginTime) / TweenTime;  
            m_CurVect.y = FromPos.y + PosDist.y * PosVal;  
            m_CurVect.z = FromPos.z + PosDist.z * (Time.time - m_BeginTime) / TweenTime;  
            transform.localPosition = m_CurVect;  
        }  
    }  
    private void UpdateScale()  
    {  
        if (!UseTweenScale || ScaleCurve == null )  
        {  
            return;  
        }  
        transform.localScale = FromScale + ScaleDist * ScaleVal;  
    }  
    private void UpdateRot()  
    {  
        if(!UseTweenRot || RotCurve == null)  
        {  
            return;  
        }  
        transform.localRotation = Quaternion.Euler(FromRot + RotDist * RotVal);  
    }  
    void Start()  
    {  
        m_BeginTime = Time.time;  
        m_RootScale = UIRoot.FindObjectOfType<UIRoot>().transform.localScale;  
    }  
    void Update()  
    {  
        if(m_PlayTween)  
        {  
            if(Time.time > EndTime)  
            {  
                m_PlayTween = false;  
                if(m_Pingpong)  
                {  
                    m_Reverse = !m_Reverse;  
                    m_PlayTween = true;  
                    m_BeginTime = Time.time;  
                }  
                else  
                {  
                    if(m_EndCallback != null)  
                    {  
                        m_EndCallback();  
                    }  
                }  
                return;  
            }  
            UpdatePos();  
            UpdateRot();  
            UpdateScale();  
        }  
    }  
}  

注意、:程序是针对NGUI的




设置曲线如下:

效果从图片中是看不出来的。  自己动手吧!


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2015-2-8 22:45:01 |只看该作者
THanks for sharing t!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-5-14 08:56 , Processed in 0.102958 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部