为什么一起使用GetComponent?

时间:2017-08-23 15:15:37

标签: unity3d c#-4.0 unity5 unityscript

在以下代码中,AnotherScript附加到同一个游戏对象,因此如果我想在playerScore中访问AnotherScript,为什么我在清醒功能中使用GetComponent?我可以声明类anotherScript = new AnotherScript()的实例来访问playerScore吗?希望我的问题很清楚..谢谢

using UnityEngine;
using System.Collections;

public class UsingOtherComponents : MonoBehaviour
{ 
    private AnotherScript anotherScript;

    void Awake ()
    {
        anotherScript = GetComponent<AnotherScript>();
    } 

    void Start ()
    {
        Debug.Log("The player's score is " + anotherScript.playerScore);

    }
}

2 个答案:

答案 0 :(得分:1)

如果你查看文档,你会发现MonoBehaviour构造函数可以出现在脚本中,但它也有很多限制。例如,你不能有任何参数。通过检查员设置组件参数的能力也非常方便。当非程序员完成这项工作时,它非常有用,因为您不必更改代码来修改游戏对象的行为。

还有一个原因是Unity与脚本的构造函数之间存在如此复杂的关系:因为Unity在内存方面所做的每一个游戏对象和其他东西(渲染,声音等)都是由Unity驱动的本身和脚本内存管理由c#垃圾收集器完成。因此,为了避免在创建组件之前可能发生的麻烦,游戏对象实际上是在场景上创建的,或者在删除游戏对象之前从内存中移除游戏对象,存在构造函数和析构函数的限制。通过实施Start()Awake()Destroy()等单一行为方法,此功能隐藏在Unity中。

最后要补充的是,如果您使用Unity中的纯c#类(非单声道继承),您可以根据需要使用构造函数,因为您不会遇到此内存管理问题。如果您的自定义功能不需要具有任何MonoBehavi功能(如果您不希望它们附加到任何游戏对象),那么使用纯c#类更为可取。

答案 1 :(得分:1)

还值得考虑的是,任何其他GameObject都可以附加AnotherScript(实际上可能有多个实例)。

当您编写private AnotherScript anotherScript;时,您只需声明对AnotherScript实例的引用,这可以引用任何AnotherScript中的任何GameObject实例。

通过在GetComponent函数中使用Awake,您可以精确指定要引用的实例,也就是说:第一个附加到当前GameObject的{​​{1}} UsingOtherComponents的实例附加到。