在以下代码中,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);
}
}
答案 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
的实例附加到。