如何动态切换比较运算符?AI Director距离判定场景需求
问题描述
我正在开发AI Director,需要实现AI何时向玩家施压、何时撤离的逻辑切换。目前有一个Object类型的TArray,需要检测数组中对象与玩家的距离,以此获取最大距离或最小距离。
我尝试过以下写法,但无法生效:
operator comparer = PlayerTensionLevel > BackstageThreshold ? > : <;
上述代码中PlayerTensionLevel和BackstageThreshold均为float类型变量。我希望能将comparer用于如下场景:
if(DistanceSquared(objectA, objectB) comparer _currentThresholdDistance){ _currentObject = objectA; _currentThresholdDistance = DistanceSquared(objectA, objectB); }
解决方案
C++不支持直接将运算符符号赋值给变量,但可以通过以下几种方式实现动态切换比较逻辑:
方法一:函数指针
先定义统一的比较函数类型,再根据张力等级选择对应的比较逻辑:
// 定义比较函数类型,参数为当前距离和阈值,返回bool结果 using DistanceComparer = bool(*)(float, float); // 用于判断当前距离是否大于阈值(对应找最大距离) bool IsGreater(float Distance, float Threshold) { return Distance > Threshold; } // 用于判断当前距离是否小于阈值(对应找最小距离) bool IsLess(float Distance, float Threshold) { return Distance < Threshold; } // 根据张力等级选择比较器 DistanceComparer comparer = (PlayerTensionLevel > BackstageThreshold) ? &IsGreater : &IsLess; // 使用比较器 float currentDistance = DistanceSquared(objectA, objectB); if (comparer(currentDistance, _currentThresholdDistance)) { _currentObject = objectA; _currentThresholdDistance = currentDistance; }
方法二:Lambda表达式(更简洁)
用Lambda直接生成比较逻辑,无需单独定义函数:
auto comparer = (PlayerTensionLevel > BackstageThreshold) ? [](float d, float t) { return d > t; } : [](float d, float t) { return d < t; }; // 使用方式与函数指针一致 float currentDistance = DistanceSquared(objectA, objectB); if (comparer(currentDistance, _currentThresholdDistance)) { _currentObject = objectA; _currentThresholdDistance = currentDistance; }
方法三:直接分支判断(适合简单场景)
如果逻辑不需要复用,也可以直接在循环内做分支处理,省去额外定义:
float currentDistance = DistanceSquared(objectA, objectB); if (PlayerTensionLevel > BackstageThreshold) { // 找最大距离 if (currentDistance > _currentThresholdDistance) { _currentObject = objectA; _currentThresholdDistance = currentDistance; } } else { // 找最小距离 if (currentDistance < _currentThresholdDistance) { _currentObject = objectA; _currentThresholdDistance = currentDistance; } }
内容的提问来源于stack exchange,提问作者Paul Brown
相关产品推荐
相关产品推荐

