如何使用某些未知类中的公共公用变量?

时间:2019-04-05 19:22:32

标签: c# unity3d

我没有在统一论坛上发布此内容,因为我认为与c#相关性比与统一性更多有关。 我想向敌人开枪。 我的敌人是玩家还是敌人AI。 Player具有PlayerCombatSystem,而敌人Ai具有EnemyCombatController。我正在使用Object变量通过

获取这两个脚本之一
GetComponent<ScriptName>()

对撞机是指我要与之碰撞的对象

我该怎么做才能增加存储在PlayerCombatSystem或EnemyCombatController中的损坏值?损害是公共价值

这是我两次修th的尝试

float gotDamage = shotterDamage * (100 / (100 + enemy.GetInstanceID.

float gotDamage = shotterDamage * (100 / (100 + enemy.damage;


Object enemy;
float shotterDamage;

if(shotter.GetComponent<PlayerCombatSystem>() != null)
{
    shotterDamage = shotter.GetComponent<PlayerCombatSystem>().damage;
}
else if(shotter.GetComponent<EnemyCombatController>() != null)
{
    shotterDamage = shotter.GetComponent<EnemyCombatController>().damage;
}
else
{
    Debug.Log("ERROR 0");
}

if (collision.GetComponent<PlayerCombatSystem>() != null)
{
    enemy = collision.GetComponent<PlayerCombatSystem>();
}
else if (collision.GetComponent<EnemyCombatController>() != null)
{
    enemy = collision.GetComponent<EnemyCombatController>();
}

float gotDamage = shotterDamage * (100 / (100 + enemy

2 个答案:

答案 0 :(得分:1)

创建一个共享的基类,例如

// abstract just makes sure this can't be instanced 
// directly but only inherited types
public abstract class CombatBase : MonoBehaviour
{
   public float Damage; 
}

,然后使您的两个脚本都从该基类继承

public class PlayerCombatSystem : CombatBase 
{
    // inherits Damage and everything implemented in CombatBase
    // so remove it here

    // and here you can extend it with its speicifc behaviour
}

public class EnemyCombatController : CombatBase 
{
    // inherits Damage and everything implemented in CombatBase
    // so remove it here

    // and here you can extend it with its speicifc behaviour
}

比起您的脚本,您可以简单地使用

CombatBase enemy;

...

// this will also find either PlayerCombatSystem 
// or EnemyCombatController since they are both of type 
// CombatBase
enemy = collision.GetComponent<CombatBase>();

...

float gotDamage = shotterDamage * (100 / (100 + enemy.Damage);

答案 1 :(得分:0)

另一种选择是使用构造函数,例如:

public class EnemyCombatController : MonoBehaviour
{

public PlayerCombatSystem constructorPlayerCombatSystem ;

//your code

//...

//Damage has changed in the other script (PlayerCombatSystem)



float gotDamage = shotterDamage * (100 / (100 + enemy.constructorPlayerCombatSystem.Damage);

}

要在两个类中都使用变量时,将使用创建另一个类的构造函数

我不太了解您的代码的操作,但是为了简化起见,我推断游戏是在另一个或其他脚本中进行的,并且当检测到(或击中)电击时,变量Damage会发生变化。

假设此变量位于播放器拥有的脚本中,则您想在有敌人(或相反)的脚本中使用它(或者该变量位于另一个脚本中,并且想要在该脚本中使用它)其他两个),则可以创建其他类类型的变量,然后在该类中使用它。

请记住,您必须在检查器中引用包含该类的对象

希望对您有所帮助,或者告诉我我是否理解您的问题