当前位置: 首页 > article >正文

Unity 不规则进度条显示

using System.Collections;
using System.Collections.Generic;
using System.Text;
using TMPro;
using UniRx;
using UnityEngine;
using UnityEngine.UI;

public class Power : MonoBehaviour
{
//功率百分比
[SerializeField] private TextMeshProUGUI PowerValueText;
//功率输出0~100%
[SerializeField] private Image Img_PowerOutput;
//能量回收-25%~0
[SerializeField] private Image Img_EnergyRecovery;
//功率输出范围(Vector2[真实值,显示进度条位置])
[SerializeField] private List _power = new List();
//能量回收范围(Vector2[真实值,显示进度条位置])
[SerializeField] private List _energy = new List();

private static readonly string TAG = "Power";
private void Start()
{
    //当前功率
    DataCenter.Power.Subscribe(f =>
    {
        Log.I(TAG, "Power select value:  " + f);
        PowerValueText.text = f.ToString("0");
        if (f >= 0)
        {
            Img_EnergyRecovery.fillAmount = 0;
            Vector4 vector = GetLerpValue(f, ref _power);
            Img_PowerOutput.fillAmount = Mathf.Lerp(vector.x, vector.y, (Mathf.Abs(f) - vector.z) / (vector.w - vector.z));
        }
        else
        {
            Img_PowerOutput.fillAmount = 0;
            Vector4 vector = GetLerpValue(f, ref _energy);
            Img_EnergyRecovery.fillAmount = Mathf.Lerp(vector.x, vector.y, (Mathf.Abs(f) - vector.z) / (vector.w - vector.z));
        }
    }).AddTo(this);
}

private Vector4 GetLerpValue(float value, ref List<Vector2> values)
{
    Vector2 min = values[0];
    Vector2 max = values[values.Count - 1];
    float minX = Mathf.Abs(min.x), maxX = Mathf.Abs(max.x), valueAbs = Mathf.Abs(value);
    if (valueAbs >= minX && valueAbs <= maxX)
    {
        for (int i = 1; i < values.Count; i++)
        {
            Vector2 start = values[i - 1];
            Vector2 end = values[i];
            float startX = Mathf.Abs(start.x), endX = Mathf.Abs(end.x);
            if (valueAbs >= startX && valueAbs <= endX)
            {
                return new Vector4(start.y, end.y, startX, endX);
            }
        }
    }
    return new Vector4(min.y, max.y, minX, maxX);
}

}


http://www.kler.cn/news/288616.html

相关文章:

  • 操作系统页面置换: 最近最少使用算法(LRU)
  • Mac基本使用记录
  • 【正点原子K210连载】第三十四章 image图像滤波实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • 什么是抽象公共代码
  • PLC边缘计算网关的选择策略-天拓四方
  • 0826-0901 各种面试笔试题算法题整理
  • CSS 样式化表格——WEB开发系列24
  • 【数据库|第9期】SQL Server、Access和Sqlite 的字段别名详解
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频
  • 使用 树莓派3B+ 对日本葡萄园进行经济实惠的环境监测
  • Java 入门指南:Java 并发编程 —— 线程隔离技术 ThreadLocal
  • subclass-balancing的实验结果分析
  • 开放式耳机排行榜10强?这五款绝对不能错过!
  • mysql高可用之组复制 (MGR)
  • 基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证
  • 【战略游戏】
  • Docker笔记-启动容器时,时间与宿主机保持一致
  • 如何找到适合的IT外包服务商
  • 【JAVA】两轮充电桩设计模式实践分享
  • mysql5.7 TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ 换版8版本 引发的问题
  • 深入Redis:细谈持久化
  • 浅析前端数据埋点监控:用户行为与性能分析的桥梁
  • ES6基础----Generator的使用
  • 【RabbitMQ之一:windows环境下安装RabbitMQ】
  • 数分基础(05)中心极限定理、假设检验与AB测试简介
  • 多线程并发性
  • 二叉树展开为列表(LeetCode)
  • 改进YOLO的群养猪行为识别算法研究及部署(小程序-网站平台-pyqt)
  • 【通俗理解】最优控制之旅——强化学习中的策略优化
  • 物业|基于SprinBoot+vue的物业管理系统(源码+数据库+文档)