从另一个脚本访问variables/函数

所以即时通讯尝试通过触摸一个立方体更改另一个脚本中的variables。 当前设置

  • 1x播放器
  • 1x敌人

每个人都有自己的脚本Enemy_StatsCharacter_Stats
正如你可以在这个小片段中看到的,从另一个脚本访问variables是一个很好的解决方法。

 void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Enemy") { collision.gameObject.GetComponent<Enemy_Stats>().Health = collision.gameObject.GetComponent<Enemy_Stats>().Health - gameObject.GetComponent<Character_Stats>().AttackDamage; if (collision.gameObject.GetComponent<Enemy_Stats>().Health <= 0) { Destroy(collision.gameObject); } } } 

Iam是Unity的新成员,但是没有办法像这样引用它:
collision.Health 。健康?

如何从另一个类访问variables/函数。 您想要访问的variables或函数必须是public而不是private

 public class ScriptA : MonoBehaviour{ public int playerScore = 0; void Start() { } public void doSomething() { } } 

ScriptB访问playerScore中的variablesScriptB

 public class ScriptB : MonoBehaviour{ ScriptA scriptInstance = null; void Start() { GameObject tempObj = GameObject.Find("NameOfGameObjectScriptAIsAttachedTo"); scriptInstance = tempObj.GetComponent<ScriptA>(); //Access playerScore variable from ScriptA scriptInstance.playerScore = 5; //Call doSomething() function from ScriptA scriptInstance.doSomething(); } } 

否,因为Health不是碰撞对象的一部分,而是Enemy_Stats 。 你可以caching一个Component (这就是Enemy_Stats是什么),如果你多次使用它来为你节省一些input(和一些性能,但是这个例子对于这个是相当边际的)。 您也可以caching“已知”组件,例如在这种情况下Player_Stats 。 你可以做到这一点,例如在Start或公共variables和检查员。

你应该尽可能做的是让敌人对自己的生命负责,而不是对玩家负责,所以把Destroy Part移到Enemy_Stats (准确的说是进入Health属性)。

首先要做到这一点(并最终更快)将存储在一个私有variables的Start() gameObject.GetComponent<Character_Stats>() (你应该避免频繁调用GetComponent,如果你可以避免它) 。

对于Healthvariables,避免GetComponent调用的一种方法可能是caching:创build一个Dictionary<GameObject, Enemy_Stats> ,一旦这个gameobject碰撞一次