之前写回血之类的状态,用协程来做发现会有性能问题,虽然用起来很爽

干脆改成了一下,也可以用,再改改也可以用作技能之类的东西,希望对你有帮助

效果图

直接上代码

恢复基类

/// <summary>/// 恢复基类/// </summary>public abstract class RecoverBase {[SerializeField]private bool active = false;[SerializeField]private float rateMultiplier;[SerializeField]private float regenRate;[SerializeField]private bool isDone;[SerializeField]private bool regenerated;[SerializeField]private float regenWaitTime;[SerializeField]private float regenMaxValue;/// <summary> 停止自动恢复 </summary>public virtual bool Active { get => active; set => active = value; }         /// <summary> 当前的恢复的值  </summary>public Action<float> OnRegenValue { get; set; }/// <summary> 当前恢复的百分比 </summary>public Action<float> OnRegenValueNormalize { get; set; }/// <summary> 是否恢复完成 </summary>public Action<bool> OnIsDone { get; set; }/// <summary> 当恢复值为空[假]/满[真]</summary>public Action<bool> OnEmptyOrFull { get; set; }public bool Regenerated { get => regenerated; set => regenerated = value; }//是否自动恢复public float RegenRate { get => regenRate + (regenRate * rateMultiplier); set => regenRate = value; }//恢复率  public float RateMultiplier { get => rateMultiplier; set { rateMultiplier = Mathf.Clamp(value, 0, float.MaxValue); } }//恢复当前恢复速率的倍数/// <summary> 当前恢复的值 </summary>public float RegenMaxValue { get => regenMaxValue; set => regenMaxValue = value; }//恢复的最大值  public float RegenWaitTime { get => regenWaitTime; set => regenWaitTime = value; }//恢复等待时间 public virtual bool IsDone { get => isDone; set { isDone = value; OnIsDone?.Invoke(value); } } //是否恢复完成/// <summary> 真:增加 假:扣减 </summary>public abstract bool RegenType { get; set; }public abstract float RegenValue { get; set; }//这里是抽象的原因不知道是扣减还是增加  /// <summary>/// 恢复/// </summary>/// <param name="tick">delta time</param>public abstract void UpdateRegenValue(float tick);//恢复的实现}

实现

 public static class Tools {//工具类
//判断有无到底持续时间public static bool ElapsedTime(float StartTime, float intervalTime) => (Time.time - StartTime) >= intervalTime;
}public enum StateType{Health = 1,//生命Stamina = 2,//精力Hungry = 3,//饥饿  }[System.Serializable]public class Status : RecoverBase{public StateType stateType;[SerializeField]private float regenValue;[SerializeField] private bool regenType;public override bool IsDone{get => base.IsDone; set{base.IsDone = value;inRegen = false;}}public override bool RegenType { get => regenType; set => regenType = value; }public override float RegenValue{get => regenValue; set{if (value < regenValue) inRegen = false;//这里只做增加时的判断,如果下次来的值小于上次的值,则为减少,意味着不再自动恢复了regenValue = Mathf.Clamp(value, 0, RegenMaxValue); OnRegenValue?.Invoke(regenValue);OnRegenValueNormalize?.Invoke(regenValue / RegenMaxValue);}}private float startTime;[SerializeField]private bool inRegen;//是否处于恢复中public override void UpdateRegenValue(float tick){if (!Regenerated || !Active) return;if (RegenWaitTime > 0){if (!inRegen)//不在恢复状态{if (!Tools.ElapsedTime(startTime, RegenWaitTime)) return;      //如果没有达到固定时间inRegen = true;//下一帧开始恢复}else{C_Regen(tick);startTime = Time.time;}}else{C_Regen(tick);}}void C_Regen(float tick){if (RegenType){RegenValue += tick * RegenRate;}else{RegenValue -= tick * RegenRate;}if (RegenType){if (RegenValue == RegenMaxValue){IsDone = true;OnEmptyOrFull?.Invoke(true);}}else{if (RegenValue == 0){IsDone = true;OnEmptyOrFull?.Invoke(false);}}}}

脚本测试

public class ValueToString : MonoBehaviour
{//这个脚本挂载text上,就可以看到数值的编号了public Text txt;private void Awake(){if (txt == null)  txt = GetComponent<Text>();}public void FloatToString(float value) => txt.text = value.ToString("#0.00");
}public class StatusTest : MonoBehaviour{public  List<Status> stas = new List<Status>();public Dropdown dpd_Type;[Header("生命值")]public Image heathl;public Image stamina;public Image hungry;public Text heathlText;public Text staminaText;public Text hungryText;private void Start(){foreach (var item in stas){switch (item.stateType){case StateType.Health:item.OnRegenValueNormalize += HeathlAmount;item.OnRegenValue += heathlText.GetComponent<ValueToString>().FloatToString;break;case StateType.Stamina:item.OnRegenValueNormalize += StaminaAmount;item.OnRegenValue += staminaText.GetComponent<ValueToString>().FloatToString;break;case StateType.Hungry:item.OnRegenValueNormalize += HungryAmount;item.OnRegenValue += hungryText.GetComponent<ValueToString>().FloatToString;break; }item.OnRegenValue(item.RegenValue);item.OnRegenValueNormalize(item.RegenValue/item.RegenMaxValue);}}void HeathlAmount(float value) => heathl.fillAmount = value;void StaminaAmount(float value) => stamina.fillAmount = value;void HungryAmount(float value) => hungry.fillAmount = value;private void Update(){foreach (var item in stas){item.UpdateRegenValue(Time.deltaTime);}}//按钮onclick调用,测试增加或者减少public void  DoStatusValue(int value){var sta = stas.Find(a => a.stateType == (StateType)dpd_Type.value+1 );if(sta != null){sta.RegenValue += value;}}}

编辑器挂的脚本

UI挂载

Unity 实现回血效果相关推荐

  1. unity 条目换位效果_Unity AI主题博客条目

    unity 条目换位效果 Welcome to the first of Unity's new AI-themed blog entries! We have set up this space a ...

  2. Unity 实现贴花效果的制作教程

    c#教程​https://www.cnblogs.com/Yesi/p/15829200.html ​ 有些游戏中的战斗痕迹的效果会通过贴花来实现的,贴花的方式多种多样.而在Unity中,有一种给官方 ...

  3. unity气流模拟效果

    机房气流模拟效果 参考 效果展示: 资源链接:unity气流模拟效果-Unity3D文档类资源-CSDN下载

  4. 用Unity实现景深效果

    用Unity实现景深效果 景深也是一种非常常见的后处理手段,它用来模拟相机拍摄画面的效果.今天我们讨论如何在Unity中实现它. 简单来说,景深效果可以拆分为两个部分,一个部分是聚焦,使画面中指定的区 ...

  5. Unity 翻书效果

    Unity翻书效果 目前做的VR项目中需要一个翻阅魔法书的效果,考虑过使用UnityBookPageCurl-master插件,但是那个插件是纯UI显示的,只有二维效果,在VR里观感不佳,之后在网上找 ...

  6. Unity时光倒流效果实现

    Unity时光倒流效果实现<25/11/2017> 场景:一个Panel,一个由众多小Cube堆叠而成的巨大Cube,巨大Cube中心放置爆炸点Bomb. 实现方式:一共就三个脚本,每个C ...

  7. Unity UV 水效果实现

    Unity UV 水效果实现 Unity Water Shader 组件搭载 基本参数调节 所需图片 效果呈现 Unity Water Shader Shader "Custom/SeaWa ...

  8. [Unity Shader]凌波微步效果

    [Unity Shader]凌波微步效果 相信很多人都看过天龙八部,里面的段誉有一个技能就是凌波微步:移动的时候人先到,衣角跟随其后.说白了就是移动时有一个残影跟着他.下面先看下最终效果 下面我们看如 ...

  9. unity 打字机变色效果

    unity 打字机变色效果 实现效果 工程文件下载 实现难点 打印文字的最后一个字的颜色是与前面文字的颜色不同的,而且打印后逐渐变为前面字的颜色. 实现思路 考虑到unity的text组件的颜色是整体 ...

最新文章

  1. MaxCompute用户初体验
  2. 倒计时几秒_和平精英:倒计时0秒时进圈会不会被淘汰?主播展示极限卡圈
  3. LCD LED OLED QLED区别
  4. 考研【研究所和高校的区别、全国375所独立于高校系统之外的 “研究生所”】
  5. 48岁的C语言,你知道它背后的历史吗?
  6. centos 重启网卡_CentOS6 网络管理之网卡配置及简单路由设置
  7. 【剑指offer】面试题10- II:青蛙跳台阶问题(Java)
  8. 新发布 | Azure镜像市场正式上线
  9. AutoPlay Media Studio光盘开发利器
  10. bash算术求值和errexit陷阱
  11. 概率论与数理统计——Chapter0
  12. centos7 文件系统修复
  13. 如何选取最佳前缀索引长度
  14. 图片化加手动推导深刻记忆冒泡排序全过程
  15. 李彦宏发布小度在家“解锁”中国家庭市场,被称作AI性价比之王
  16. 怎么把两个表格的内容合并
  17. Layabox引擎开发H5打地鼠游戏(一)
  18. 微信小程序滴滴服务器报错,如何使用mpx框架(滴滴)给微信小程序分包
  19. 程序猿敲击代码的指法推荐
  20. 计算机 交换机和IP/Mac地址

热门文章

  1. 电商卖家们必须关注的几个数据
  2. 中秋节快到了,一起用MATLAB绘制一款2.5D月饼叭
  3. thinkphp ajax 跨域请求 Access-Control-Allow-Origin 完美解决
  4. 微信 服务器架构,微信技术总监周颢:一亿用户背后架构秘密
  5. 古人的智慧之回文诗——《两相思》
  6. Springboot毕业设计管理系统毕业设计-附源码221032
  7. DAO 中独特的通证经济
  8. 开源多云应用平台 Choerodon猪齿鱼发布0.14版本
  9. 深度卷积神经网络之AlexNet
  10. Win7下虚拟机安装Mac OS X