从另一个脚本访问变量/函数

时间:2016-05-20 08:14:12

标签: c# unity3d unityscript

所以我试图通过触摸一个立方体来改变另一个脚本中的变量。 当前设置

  • 1x Player
  • 1x Enemy

每个都有自己的脚本Enemy_Stats& Character_Stats
正如您在这个小片段中看到的那样,从另一个脚本访问变量是一种非常好的解决方法。

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);
        }
    }
}

我是Unity的新手,但是没有办法像以下那样引用它:
collision.Health

4 个答案:

答案 0 :(得分:5)

如何从另一个类访问变量/函数。您要访问或调用的变量或函数必须为type而不是public

private

public class ScriptA : MonoBehaviour{ public int playerScore = 0; void Start() { } public void doSomething() { } } 中来自playerScore的访问变量ScriptA。首先,使用ScriptB函数找到脚本或组件所附加的GameObject,然后使用GameObject.Find函数检索附加到其上的脚本或组件。

GetComponent

答案 1 :(得分:2)

不,因为Health不是碰撞对象的一部分,而是Enemy_Stats。你可以缓存一个Component(这就是Enemy_Stats是什么),如果你多次使用它来为你节省一些打字(以及一些性能,但这个例子相当微不足道)。您也可以缓存“已知”组件,例如Player_Stats。你可以这样做,例如在Start或公共变量和检查员。

你应该做的是让敌人对他的生命而不是玩家负责,所以将Destroy - 部分移动到Enemy_Stats(准确地说进入Health属性)。

答案 2 :(得分:0)

使这个更短(并且最终更快)的第一件事是将gameObject.GetComponent<Character_Stats>()存储在Start()私有变量中(如果可以避免,应该避免频繁调用GetComponent它)。

对于Health变量,一种避免GetComponent调用的方法可能是缓存:您创建一个Dictionary<GameObject, Enemy_Stats>并在此游戏对象发生碰撞时立即读取

答案 3 :(得分:0)

一开始我的意思是在 Awake() 方法中你可以找到一个 game-object with tag 然后在 Heath 方法中得到 Collision(),你应该只 decrease the health 但是,这里的条件是只有一个敌人和一个玩家。