[Unity]如何使用GetComponent和注意事项

你好。
Eto(京都工程师)@ as00812145叫做

在游戏开发中,通常是一个特定的脚本访问并操纵另一个脚本。
而且,那时,Unity提供的功能GetComponent非常有用。
它可用于减少对象数量和所需脚本数量,并显着扩展游戏逻辑实现的范围。

这次,我将解释如何使用GetComponent及其注意事项。

Unity游戏概念

首先,让我们解释Unity游戏的概念。
Unity的所有元素均以称为组件的单位制成。
在Unity中,相机,程序,图像,所有内容均由“组件”构建。
但是,组件只是添加的属性。所以
有一个为其分配属性的主体。这是一个游戏对象。
让我们实际来看一下。

↑图像和脚本是组件。
正如我之前所做的,component是赋予游戏对象的属性。
它可以轻松删除。
让我们在编辑器上实际操作它。

我能够执行各种操作。
现在您知道了组件的概念。

如何在Unity中使用GetComponent

好吧,主要主题是从这里开始。 “获取组件”用于执行从脚本手动完成的组件工作。

顾名思义,这是一个允许您获取特定组件的函数。

从到目前为止的统一思想来看,要使用GetComponent,必须首先获取游戏对象。
这是因为组件是最后一个的“属性”,因此如果仅使用属性,则很难知道要获取哪个组件。
因此,游戏对象->必须在分配的组件的过程中获取它。

实际上,如果您查看GetComponent文档,
GameObject.GetComponent

GetComponent作为GameObject类的方法(如GameObject.GetComponent`)存在。

好吧,这很令人困惑,所以我实际上在组件中获得了另一个脚本的功能,
我想在解释执行示例时进行解释。

制备

这次,我将仅从编辑器中获取对象。
因此,您需要以下两个源代码。

  • 具有实际要执行功能的脚本
  • 实际执行目标脚本功能的脚本
  • 首先,让我们编写一个具有实际执行功能的脚本。
    由于它是下面的脚本,所以下面的源代码(如下sayHello.cs)到适当的对象。
    我实现了一个仅输出日志的功能,这次我将尝试从另一个脚本执行该功能。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    namespace say {
        public class sayHello : MonoBehaviour {
        
            public void Hello()
            {
                Debug.Log("hello");
            }
        }
    }
    

    这里要注意的一点是,您应该能够从外部使用名称空间来引用此类。
    这是因为当从外部获取脚本时,需要获取要获取的目标的类型信息,因此必须能够从外部读取脚本。

    接下来,一个实际执行目标脚本功能的脚本(如下TestScript.cs)是书面的。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using say; // 対象のスクリプトの情報を取得
    public class TestScript : MonoBehaviour {
    
        public GameObject targetObject; // エディターから取得できるようにpublicにしておく
    	// Use this for initialization
    	void Start () {
            sayHello say = targetObject.GetComponent<sayHello>(); //コンポーネントを取得
            say.Hello(); // 対象のコンポーネントのスクリプトを実行
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		
    	}
    }
    
    

    另外,将其附加到与以前不同的对象上。
    关于源代码有很多事情,因此我将在实际动手的同时对其进行解释。

    获取游戏对象

    让我们在Unity上实际操作它。

    现在,在附加TestScript.cs之后,我认为编辑器上已添加了一种表单。
    在Unity中,可以从编辑器操纵public变量。和
    组件和游戏对象也不例外。
    因此,让我们将要实际执行的对象拖放到此处。
    您现在有了一个游戏对象。

    这是来自TestScript.cs

    public GameObject targetObject; // エディターから取得できるようにpublicにしておく
    

    它是在部分中实现的。

    获取组件

    现在,让我们获取组件并实际执行功能。
    按照以前的文件
    GetComponent是一个GameObject方法,因此从您之前获得的GameObject
    调用GetComponent。
    由于此函数传递组件的类型并返回组件的实际状态,
    在TestScript.cs中,它是以下部分。

    using say; // 対象のスクリプトの情報を取得
    public class TestScript : MonoBehaviour {
        public GameObject targetObject; // エディターから取得できるようにpublicにしておく
    	// Use this for initialization
    	void Start () {
            sayHello say = targetObject.GetComponent(); //コンポーネントを取得
            say.Hello(); // 対象のコンポーネントのスクリプトを実行
    	}
    

    由于getComponent必须首先传递目标类型,即组件的信息,
    我正在使用泛型。这就是为什么我们首先从使用中获得该信息的原因。
    并且,作为getComponent的结果,组件的实际条件实际上作为组件返回。
    在这种情况下,它是一个脚本,因此将返回对该脚本类的引用。
    并从该参考中阅读功能

     say.Hello(); // 対象のコンポーネントのスクリプトを実行
    

    这将是一部分。

    现在尝试运行Unity。
    我认为它已按预期方式作为日志执行。

    实际用法(如何与常用功能和注意事项一起使用)

    好吧,我实际上可以使用[get component],但是游戏对象
    由于第一次设置很麻烦,因此如何从脚本中动态获取它
    让我解释。
    我们将为此使用GameObject.Find和类似的功能,因此让我们对其进行介绍。

    GameObject.Find

    GameObject.Find

    您可以通过场景中存在的游戏对象的名称来获得此名称。
    由于名称是完全匹配的,因此操作负担很大。

    GameObject.FindWithTag

    GameObject.FindWithTag
    通过游戏对象的标签名称获取。在这种情况下,您必须为该对象设置标签名称。

    GameObject.FindObjectsWithTag

    GameObject.FindGameObjectsWithTag
    此版本可获取GameObject.FindWithTag的多个对象。
    由于标签的性质,多个对象通常具有相同的标签,因此请获取所有具有要搜索的标签的对象。
    因此,返回值是一个数组,如果没有对应的数组,则返回from的数组。

    很重要的一点

    其中,性能问题是初学者经常遇到的。
    GameObject.Find非常重,因为它以完全匹配的名称扫描场景中的所有对象。
    因此,连续使用此功能将导致游戏画面变得混乱。

    但是,如果您通过标记名称管理所有内容并尝试与FindWithTag一起使用,
    标记名称会爆炸,变得难以管理,增加错误和错误的产生,并且是导致开发延迟的遥远原因。

    因此,让我们根据您制作的游戏和sono游戏对象所扮演的角色来正确使用它。

    就我而言
    从检查器设置:它的作用是单一的,不会在中间切换到另一个对象。
    GameObject.Find:在尽可能少使用或切割一次时(例如在初始化时)获得
    GameObject.Find&&FindObjectsWithTag:您必须经常获取游戏对象。如果您想一次更改多个游戏对象

    我已决定如何在某种程度上使用它。
    但是,根据所开发的游戏的不同,边界会不时变化,但是如果您从头开始划一条线,
    即使游戏变得庞大,也很难因此而死于性能。

    GetComponent的摘要

    这是最基本的事情,但是如果您犯了一个错误,那么游戏的行为就会变得很沉重。
    这些界限和界限是基于实际经验和试验次数的。
    开发中没有很多可用的子弹,因此让我们实际使用它们,以便它们可以在多种情况下使用。

    [团结]刚体介绍!我将以一种易于理解的方式进行解释

    如何在Unity中使用collouts [提供示例]

    撰写本文的人

    assa

    我是京都的工程师。记住assa或eh。 我的主要业务是在网上玩我的业余爱好。有什么好的