比如判断这个动态float值是否经过0.5f
因为float值不准确所以当前的方法是范围 0.501f至0.499f之间 问题也出现在这
动态float的来源是一个拖动条 也就是用户 无法避免的可能手抖 将会导致到达区间后没出去,原路返回,这个时候事件不应触发,所以我加了bool判断
但这样就会导致必须经过区间两点才能触发事件 这样就会导致另一个问题
用户是可以通过点击来使float直接到达某值的 直接点击区间内就会导致bool失效
其次在此基础上 最好能知道经过区间时的方向(从左至右经过区间或从右至左)当前用的方法是bool开关 ,但也无法解决值直接出现在区间内时的BUG(可以通过移动之前存值,移动后更新BOOL状态来解决这个问题,但逻辑会变得更复杂BUG会更多),我觉得单纯是我想的复杂了,应该会有简单的方法能做到,只是我没反应过来。望各位给个逻辑清晰的思路或者方案
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);
}
}
大概模拟一下就是这样的,你试试,我这边没问题
可以设置个误差值,比如1e-6,当2数相减小于这个误差则可以判定2数相等。
if(abs(a-b)<1e-1)
可以加一个误差范围来解决,比如当这个float值在4.999-5.001之间时,都把它当做0.5处理就可以了。也就是说,左右误差范围控制在[-0.001,0.001]范围之内就可以了,这个范围根据你的实际情况来调整。
感谢回复 正在尝试
有关误差范围的已经测试过了,我原本的设计就是误差范围,只不过范围比较大
按照1 2楼的说法改小后,移动的很慢的时候能触发,但是会触发多次,移动的快的话根本不会触发。
原本的问题用其他的方法解决了,但这个记录值的问题我依旧想知道,4楼的方法也尝试过了,有两个问题 一个是不知道方向 一个是会触发两次 再看看有没有更好的方法,谢谢的大家的回复,过两天如果还是没有满意答案,我就结帖给分 虽然挺遗憾的问题没解决。。
我这样想的,两个bool值,flag储存现在是否大于0.5f,oldFlag储存拖动之前的状态是否大于0.5f,当两个状态不一样的时候肯定就是经过了0.5这个值