You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态切换比较运算符?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:55:19