为什么这个 bool 在自定义函数中不起作用,但在更新函数中工作正常?

Why does this bool not work in a custom function, but works fine in the update function?

我正在尝试检查一个对象 (obj_a) 是否已经与另一个对象 (obj_b) 达到一定距离,然后将 bool 变为 true,移动对象(obj_a) 到另一个对象 (obj_b),并将 bool 改回 false。

我正在尝试在我自己的函数中执行此操作以避免我拥有的意大利面条代码,但是现在它在我自己的函数中,布尔值永久停留在 false

我已经在一个函数之外尝试了相同的代码并且它运行良好,我只希望它在一个函数中,这样我就可以让它更加模块化并轻松添加更多对象,并且更容易编辑它

这是我的代码:

public GameObject obj_a, obj_b;
public GameObject obj_c, obj_d;
public float specifiedDistance = 5.0f;
private bool bool1 = false; // initialize as false because they start within the distance
private bool bool2 = false;

// custom function to be called in Update()
void checkTargets(GameObject _a, GameObject _b, bool _bool)
{
  Vector3 dist = _a.transform.position - _b.transform.position;
  if(dist.magnitude > specifiedDistance)
{
  _bool = true;
}
  if(_a.transform.position == _b.transform.position)
{
  _bool = false;
}

void Update()
{
  checkTargets(obj_a, obj_b, bool1);
  checkTargets(obj_c, obj_d, bool2);
}

C# 默认按值传递方法参数。对于值类型,例如 bool,这意味着方法参数 _bool 和传递的字段 bool1 存储在内存中的不同位置。因此,您不要通过在方法内部修改_bool来修改bool1的值。

解决此问题的最简单方法是 return 方法中的布尔值:

bool1 = checkTargets(obj_a, obj_b);
bool2 = checkTargets(obj_c, obj_d);

bool checkTargets(GameObject _a, GameObject _b)
{
  Vector3 dist = _a.transform.position - _b.transform.position;
  if(dist.magnitude > specifiedDistance)
  {
    return true;
  }
  if(_a.transform.position == _b.transform.position)
  {
    return false;
  }
}

我的猜测是您将参数 _bool 作为 传递,而它应该作为 reference.

传递

编辑:但按照 的建议,在可读性和可维护性方面可能更好,因为您清楚地写下了分配给什么的内容。你有一个纯函数。

这个答案我也觉得。 暂时指定如何通过引用传递值。

public GameObject obj_a, obj_b;
public GameObject obj_c, obj_d;
public float specifiedDistance = 5.0f;
private bool bool1 = false; // initialize as false because they start within the distance
private bool bool2 = false;

// custom function to be called in Update()
void checkTargets(GameObject _a, GameObject _b, ref bool _bool)
{
    Vector3 dist = _a.transform.position - _b.transform.position;

    if(dist.magnitude > specifiedDistance)
    {
        _bool = true;
    }

    if(_a.transform.position == _b.transform.position)
    {
        _bool = false;
    }
}

void Update()
{
    checkTargets(obj_a, obj_b,ref bool1);
    checkTargets(obj_c, obj_d,ref bool2);
}