为啥我们可以将 GetComponent<Camera> 的结果放在 Behavior 数组中,但不能执行 GetComponent<Camera>(out behaviorA

Posted

技术标签:

【中文标题】为啥我们可以将 GetComponent<Camera> 的结果放在 Behavior 数组中,但不能执行 GetComponent<Camera>(out behaviorArray[X])?【英文标题】:Why can we put the result of a GetComponent<Camera> in a Behaviour array but can't do GetComponent<Camera>(out behaviourArray[X])?为什么我们可以将 GetComponent<Camera> 的结果放在 Behavior 数组中,但不能执行 GetComponent<Camera>(out behaviorArray[X])? 【发布时间】:2021-11-08 12:53:17 【问题描述】:

我想知道为什么会这样:

Behaviour _BehaviourArray = new Behaviour[1];
BehaviourArray[0] = GetComponent<Camera>();

但不是这个:

Behaviour _BehaviourArray = new Behaviour[1];
TryGetComponent<Camera>(out BehaviourArray[0]);

如果两个相机组件都存在,应该(在我看来)给出相同的结果。

如果有人能回答我,将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

实际上,如果代码中的类型正确,您也可以这样做:

public Camera[] _BehaviourArray;

private void Awake()

    _BehaviourArray = new Camera[1];
    TryGetComponent<Camera>(out _BehaviourArray[0]);

    Debug.Log(_BehaviourArray[0]);

=>

【讨论】:

我的行为数组是用来放置多个不同类型的组件的。我这样做是为了用 for 循环禁用那些多个组件,所以我不能用你的方法来做。实际上我想专门将所有这些组件存储在一个 Behavior 数组中以禁用它们。 @Koromire 已经足够了。我要说的是,一般而言,只要类型匹配,您可以out 参数使用数组...如果它们不匹配,那么是的,您需要使用不同的东西严格输入 c#,尤其是泛型【参考方案2】:

类型不匹配,因此out 参数不能接受Behaviour 类型的变量。

你能做的就是写

Behaviour[] _BehaviourArray = new Behaviour[1];
TryGetComponent<Camera>(out Camera camera);
_BehaviourArray[0] = camera;

您甚至可以将其包装在一个方法中:

void GetComponentToArrayIndex<TComponent, TSpecificComponent>(TComponent[] array, int index) where TComponent : Component where TSpecificComponent : TComponent

    TryGetComponent<TSpecificComponent>(out TSpecificComponent component);
    array[index] = component;

并像这样使用它:

Behaviour[] _BehaviourArray = new Behaviour[1];
GetComponentToArrayIndex<Camera>(_BehaviourArray, 0);

这些只是建议和未经测试的代码,但我会在你的情况下尝试这样做。


我之前认为数组索引器类似于索引器运算符,归结为两种方法,但它们似乎不是这样的。感谢derHugo 的澄清。

【讨论】:

请注意 Behaviour _BehaviourArray = new Behaviour[1]; 仍然无法编译 ;) 实际上,只要类型正确匹配,can actually do it 大多数类型的索引器是属性 getter/setter,数组除外,其中数组元素索引站点可以在 refout 参数中使用。请参阅@derHugo 的回答。 我不知道你的帖子为什么被降级,这正是我想知道的。我想专门将相机组件存储在行为数组中。 我考虑过类型匹配,这可以与数组一起使用,但这不是 OP 想要的。所以我的解决方案工作正常。但我会删除有关属性的内容,因为在这种情况下它们似乎是错误的。你总能学到新东西。

以上是关于为啥我们可以将 GetComponent<Camera> 的结果放在 Behavior 数组中,但不能执行 GetComponent<Camera>(out behaviorA的主要内容,如果未能解决你的问题,请参考以下文章

unity中GetComponent获取组件中的材质的颜色,用C#写

component及刚体rigidbody用法

[Unity] Awake 与 Start 的使用, 为什么将 GetComponent 逻辑放到 Awake 中

[Unity] Awake 与 Start 的使用, 为什么将 GetComponent 逻辑放到 Awake 中

关于一个Unity的问题,AddComponent<>和GetComponent<>有啥区别?

为啥我不能禁用按钮?