TDPConscious
2021-07-28 10:41
采纳率: 28.6%
浏览 383
已结题

怎么确定一个float值是否经过某值?

比如判断这个动态float值是否经过0.5f
因为float值不准确所以当前的方法是范围 0.501f至0.499f之间 问题也出现在这
动态float的来源是一个拖动条 也就是用户 无法避免的可能手抖 将会导致到达区间后没出去,原路返回,这个时候事件不应触发,所以我加了bool判断
但这样就会导致必须经过区间两点才能触发事件 这样就会导致另一个问题
用户是可以通过点击来使float直接到达某值的 直接点击区间内就会导致bool失效

其次在此基础上 最好能知道经过区间时的方向(从左至右经过区间或从右至左)当前用的方法是bool开关 ,但也无法解决值直接出现在区间内时的BUG(可以通过移动之前存值,移动后更新BOOL状态来解决这个问题,但逻辑会变得更复杂BUG会更多),我觉得单纯是我想的复杂了,应该会有简单的方法能做到,只是我没反应过来。望各位给个逻辑清晰的思路或者方案

  • 点赞
  • 收藏

7条回答 默认 最新

  • dark9spring 2021-07-30 17:13
    已采纳
    
    using UnityEngine;
    using Random = UnityEngine.Random;
    
    public class TestConstraint : MonoBehaviour
    {
        /// <summary>
        /// 模拟Slider的数值
        /// </summary>
        private float simulateNum;
    
        /// <summary>
        /// true为当前值大于0.5f
        /// </summary>
        private bool? flag;
    
        /// <summary>
        /// true为之前值大于0.5f
        /// </summary>
        private bool? oldFlag;
        private void Awake()
        {
            simulateNum = 0f;
            flag = false;
            oldFlag = null;
        }
    
        private void Update()
        {
            oldFlag = simulateNum > 0.5f;
            if (!Input.GetKeyDown(KeyCode.A)) return;
            simulateNum = Random.Range(0f, 1f);
            flag = simulateNum > 0.5f;
            Debug.Log("flag="+flag);
            Debug.Log("oldFlag="+oldFlag.Value);
            if (flag!=oldFlag)
            {
                Debug.Log("经过了0.5这个值");
            }
            Debug.Log("simulateNum="+simulateNum);
        }
    }
    
    

    大概模拟一下就是这样的,你试试,我这边没问题

    点赞 打赏 评论
  • 浪客 2021-07-28 10:46

    可以设置个误差值,比如1e-6,当2数相减小于这个误差则可以判定2数相等。
    if(abs(a-b)<1e-1)

    点赞 打赏 评论
  • qfl_sdu 2021-07-28 10:51

    可以加一个误差范围来解决,比如当这个float值在4.999-5.001之间时,都把它当做0.5处理就可以了。也就是说,左右误差范围控制在[-0.001,0.001]范围之内就可以了,这个范围根据你的实际情况来调整。

    点赞 打赏 评论
  • TDPConscious 2021-07-28 10:57

    感谢回复 正在尝试

    点赞 打赏 评论
  • TDPConscious 2021-07-28 14:29

    有关误差范围的已经测试过了,我原本的设计就是误差范围,只不过范围比较大
    按照1 2楼的说法改小后,移动的很慢的时候能触发,但是会触发多次,移动的快的话根本不会触发。

    点赞 打赏 评论
  • TDPConscious 2021-07-29 11:07

    原本的问题用其他的方法解决了,但这个记录值的问题我依旧想知道,4楼的方法也尝试过了,有两个问题 一个是不知道方向 一个是会触发两次 再看看有没有更好的方法,谢谢的大家的回复,过两天如果还是没有满意答案,我就结帖给分 虽然挺遗憾的问题没解决。。

    点赞 打赏 评论
  • dark9spring 2021-07-30 16:54

    我这样想的,两个bool值,flag储存现在是否大于0.5f,oldFlag储存拖动之前的状态是否大于0.5f,当两个状态不一样的时候肯定就是经过了0.5这个值

    点赞 打赏 评论

相关推荐 更多相似问题