将函数调用转换为常量

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我们有一个变量a,它是WhatIsA()为了一个for循环而用函数计算的。WhatIsA的值是编译时知道的。有什么我可以做的(一个属性,也许?)让编译器知道它可以擦除变量并放置常量来代替它的所有引用?

for (int i = 0; i < 1343434; i++)
{
    int a = WhatIsA(); //retval of WhatIsA does not change after compilation, ever.
    DoSomethingWithVariableA(a);
    DooooSomethingWithVariableA(a);
    DoooooooSomethingWithVariableA(a);
}

最初的问题来自Unity的环境。

private void Update()
{
    LayerMask mask = LayerMask.GetMask("Terrarin");
    CollidesBottom = Raycast((Vector2)transform.position + colliderBottomLeftOffset, Vector2.right, colliderWidth, mask);
    CollidesTop = Raycast((Vector2)transform.position + colliderTopRightOffset, Vector2.left, colliderWidth, mask);
    CollidesRight = Raycast((Vector2)transform.position + colliderTopRightOffset, Vector2.down, colliderHeight, mask);
    CollidesLeft = Raycast((Vector2)transform.position + colliderBottomLeftOffset, Vector2.up, colliderHeight, mask);
}

GetMask是已知的编译时间,或者至少它应该是。编译器可能会也可能不会对其进行优化。我自己唯一能做的就是将掩码提升为一个字段变量并在Start函数中计算它,但是它的范围要大于它需要的范围。

提问于
用户回答回答于

您可以查看此主题以获得更深入的解释,了解LayerMasks的工作原理。

简而言之:LayerMask基本上是一个int值。它表示一个二进制位标志系统,您可以在其中打开(1)和关闭(0)某些层索引。所以例如一个价值

00000101

表示应启用layer1和layer3,并且十进制具有该值5。只有Unity的图层系统才有32图层,所以这里还有24个额外的图层0

因此,可以选择使这个图层掩码保持不变。最简单的方法是输出一次

LayerMask mask = LayerMask.GetMask("Terrarin");
Debug.Log(mask.value);

这将为您提供图层掩码的十进制表示。而且你可以简单地使用

// 256 e.g. is the layer9
// the first entry after Unity's 8 default layers
LayerMask mask = 256;

或者,如果您已经知道所需图层的索引,您也可以使用

LayerMask mask = 1 << 9;

或者使用这个有用的位掩码计算器

但我也不会推荐它。稍后的设计更改,您将不得不更改代码。您希望比首先重新计算值时添加一个图层。等等...

当然,你也可以这样做,Update但为什么每一帧重新创建它?如果你硬编码它,你也可以使用一个const或在另一个答案中说,只需获得一次值Awake

我也不理解你对“范围”的担忧。只要它保持私密状态就没关系

..相反:你的Update解决方案mask一次又一次地分配和销毁- >为GC做更多的工作。

但实际上在我看来,最好的解决方案是永远不要硬编码图层名(和其他字符串),而是让开发人员在检查器中调整它:

[SerializeField] private LayerMask mask;

这会在Inspector中为您提供一个字段,您可以在其中选择图层。出于调试原因,您甚至可以在运行时更改它们。

你仍然可以给它一个硬编码的默认值,例如

[SerializeField] private LayerMask mask = 3;
用户回答回答于

设置aStart()或内部Awake()并引用变量。

扫码关注云+社区

领取腾讯云代金券