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()
onStart()
(如果可以避免的话,应该避免频繁调用GetComponent)
对于Health变量,避免调用GetComponent
的一种方法可能是缓存:您创建一个字典
,并在该游戏对象发生一次碰撞时立即读取该字典否,因为Health
不是碰撞对象的一部分,而是敌方统计数据
。您可以缓存组件
(这就是敌人统计数据的含义)如果你多次使用它来节省一些输入(和一些性能,但在本例中这是非常有限的)。你也可以缓存“已知”组件,如本例中的Player\u Stats
。你可以这样做,例如在Start
中或使用公共变量和检查器
但是你可能应该做的是让敌人为他的生命负责,而不是玩家,所以将摧毁-部分移动到敌人的属性中(确切地说是进入健康属性)。一开始我的意思是在唤醒()
方法中,你可以找到一个带有标签的游戏对象
然后在Collision()中得到它的Heath
方法你只需降低生命值
但是,这里的条件是只有一个敌人和一个玩家。不,因为这是一次碰撞,而不是敌人的统计数据。你也不会期望苹果尝起来像桔子。你不能使用Character\u统计数据作为名称。它将是CharacterStats。其他人也是如此。即使我不符合语言标准不会导致错误。最后一部分:你真的不能在游戏中以这种方式缓存…狗屎变化太多,组件来来去去去等。你只需要做一个查找,这没什么大不了的。正确。西蒙,你必须做的是:collision.gameObject.GetComponent().TakeDamage(stats.doesDamage)
编写你认为合适的例行程序攻击伤害
。你必须将敌人的统计数据更改为敌人的统计数据。请注意,你有大写的“攻击伤害”等。除非你实际使用属性,否则它们必须比使用查找
和获取组件
的大小写更好。通常情况下,只需制作[序列化字段]ScriptA scriptInstance;
并通过拖放方式通过Unity Inspector引用它