为啥我们可以将 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,数组除外,其中数组元素索引站点可以在 ref
和 out
参数中使用。请参阅@derHugo 的回答。
我不知道你的帖子为什么被降级,这正是我想知道的。我想专门将相机组件存储在行为数组中。
我考虑过类型匹配,这可以与数组一起使用,但这不是 OP 想要的。所以我的解决方案工作正常。但我会删除有关属性的内容,因为在这种情况下它们似乎是错误的。你总能学到新东西。以上是关于为啥我们可以将 GetComponent<Camera> 的结果放在 Behavior 数组中,但不能执行 GetComponent<Camera>(out behaviorA的主要内容,如果未能解决你的问题,请参考以下文章
unity中GetComponent获取组件中的材质的颜色,用C#写
[Unity] Awake 与 Start 的使用, 为什么将 GetComponent 逻辑放到 Awake 中
[Unity] Awake 与 Start 的使用, 为什么将 GetComponent 逻辑放到 Awake 中