C# 从另一个组件访问变量/函数

C# 从另一个组件访问变量/函数,c#,unity3d,unityscript,C#,Unity3d,Unityscript,所以我试图通过触摸一个立方体来改变另一个脚本中的变量。 当前设置 1x播放器 1x敌人 每个人都有自己的脚本敌人统计数据和角色统计数据 正如您在这个小片段中所看到的,从另一个脚本访问变量是一个很好的解决方法 void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Enemy") { collision.gameObject.GetComponent<Ene

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

  • 1x播放器
  • 1x敌人
每个人都有自己的脚本
敌人统计数据
角色统计数据

正如您在这个小片段中所看到的,从另一个脚本访问变量是一个很好的解决方法

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);
        }
    }
}
void OnCollisionEnter(碰撞)
{
如果(collision.gameObject.tag==“敌人”)
{
冲突。gameObject.GetComponent()。运行状况=
collision.gameObject.GetComponent().Health
-gameObject.GetComponent().AttackDamage;

if(collision.gameObject.GetComponent().Health如何从另一个类访问变量/函数。要访问或调用的变量或函数必须是
public
而不是
private

public class ScriptA : MonoBehaviour{

    public int playerScore = 0;

    void Start()
    {

    }

    public void doSomething()
    {

    }
}
ScriptB
访问
ScriptA
中的变量
playerScore
。首先,使用
GameObject查找脚本或组件附加到的游戏对象。查找
函数,然后使用
GetComponent
函数检索附加到它的脚本或组件

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();
    }
}
公共类脚本B:单行为{
ScriptA scriptInstance=null;
void Start()
{
GameObject tempObj=GameObject.Find(“NameOfGameObjectScriptAIsAttachedTo”);
scriptInstance=tempObj.GetComponent();
//从ScriptA访问playerScore变量
scriptInstance.playerScore=5;
//从ScriptA调用doSomething()函数
scriptInstance.doSomething();
}
}

缩短(并最终加快)的第一件事是将以下内容存储在私有变量中:
gameObject.GetComponent()
on
Start()
(如果可以避免的话,应该避免频繁调用GetComponent)


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

否,因为
Health
不是碰撞对象的一部分,而是
敌方统计数据
。您可以缓存
组件
(这就是敌人统计数据的含义)如果你多次使用它来节省一些输入(和一些性能,但在本例中这是非常有限的)。你也可以缓存“已知”组件,如本例中的
Player\u Stats
。你可以这样做,例如在
Start
中或使用公共变量和检查器


但是你可能应该做的是让敌人为他的生命负责,而不是玩家,所以将
摧毁
-部分移动到
敌人的属性中(确切地说是进入健康属性)。

一开始我的意思是在
唤醒()
方法中,你可以找到一个带有标签的
游戏对象

然后在
Collision()中得到它的
Heath
方法你只需
降低生命值
但是,这里的条件是只有一个敌人和一个玩家。

不,因为这是一次碰撞,而不是敌人的统计数据。你也不会期望苹果尝起来像桔子。你不能使用Character\u统计数据作为名称。它将是CharacterStats。其他人也是如此。即使我不符合语言标准不会导致错误。最后一部分:你真的不能在游戏中以这种方式缓存…狗屎变化太多,组件来来去去去等。你只需要做一个查找,这没什么大不了的。正确。西蒙,你必须做的是:
collision.gameObject.GetComponent().TakeDamage(stats.doesDamage)
编写你认为合适的例行程序
攻击伤害
。你必须将敌人的统计数据更改为敌人的统计数据。请注意,你有大写的“攻击伤害”等。除非你实际使用属性,否则它们必须比使用
查找
获取组件
的大小写更好。通常情况下,只需制作
[序列化字段]ScriptA scriptInstance;
并通过拖放方式通过Unity Inspector引用它