所以我试图通过触摸一个立方体来改变另一个脚本中的变量。 当前设置
每个都有自己的脚本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
?
答案 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
但是,这里的条件是只有一个敌人和一个玩家。