在Unity中,如果在IF条件中发现一个组件,就立即使用它。

问题描述 投票:0回答:2

我见过 "如果在IF条件中发现了一个组件,就用它 "的速记。

如此一来

SomeScript script = gameObject.GetComponent<SomeScript>();

if (script != null) {
  script.DoSomething();
}

我看到了某种速记,像这样的。

if (SomeScript script = gameObject.GetComponent<SomeScript>()) {
  script.DoSomething();
}

有谁知道我说的是什么意思?对不起,我不懂专业术语

c# unity3d
2个回答
3
投票

你很可能正在寻找(最近添加的,我想从2019.2及以上版本开始)。TryGetComponent.

来自 统一文件:

获取指定类型的组件(如果存在)。

TryGetComponent将尝试检索指定类型的组件。与GameObject.GetComponent相比,显著的区别在于当请求的组件不存在时,该方法不会在编辑器中进行分配。

using UnityEngine;

public class TryGetComponentExample : MonoBehaviour
{
    void Start()
    {
        if (TryGetComponent(out HingeJoint hinge))
        {
            hinge.useSpring = false;
        }
    }
}

或者使用你的例子

if (TryGetComponent(out SomeScript script)) 
{
  script.DoSomething();
}

如果使用 TryGetComponent 找到的组件的引用将被存储在 out 参数,然后你可以在 if 块。

如果没有找到匹配的组件,就会转到 else 节。


2
投票

该节。真正 一句话...

gameObject.GetComponent<SomeScript>()?.DoSomething();

1
投票

如果你想多次运行该方法,那么最好分两次调用,先在awake中缓存一下

 private someScript script;
 void Awake()
 {
     someScript = GetComponent<SomeScript>();
 }

然后当你在例如Update.NET中使用它的时候,你就会发现它是一个很好的例子。

void Update()
{
     if(someScript)
     {
         // Do something with someScript
     }
     // or:
     someScript?.DoSomething();
 }

强烈建议你用 RequireComponent 属性来注释你的脚本。

[RequireComponent(typeof(SomeScript))]
public class MyScriptThatRequiresSomeScript : MonoBehaviour

这样当你把脚本添加到游戏对象中时,这个组件就会自动被添加进来。

© www.soinside.com 2019 - 2024. All rights reserved.