从另一个脚本访问variables/函数
所以即时通讯尝试通过触摸一个立方体更改另一个脚本中的variables。 当前设置
- 1x播放器
- 1x敌人
每个人都有自己的脚本Enemy_Stats
& Character_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碰撞一次