我正在制作游戏并正在进行近战伤害。我已经完成了寻找敌人等所有代码,但现在我需要让敌人受到伤害。这就是为什么我需要在脚本中访问我的enemys(Slime)curHealth int。
以下是近战武器的代码:(可能是瑞典语中的一些话,不介意它)
{
private float meeleAttackStart = 0f;
private float meeleAttackCooldown = 0.5f;
public int meeleDamage = 40;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Mouse0) && Time.time > meeleAttackStart + meeleAttackCooldown )
{
RaycastHit2D[] hitArea = Physics2D.BoxCastAll(transform.position, Vector2.one, 0, Vector2.up);
if(hitArea != null)
{
for(int i = 0; i < hitArea.Length; i = i+1)
{
if(hitArea[i].collider.tag == "Enemy")
{
// do stuff
}
}
}
meeleAttackStart = Time.time;
}
}
...
}
这是我的敌人代码(仍在进行中)
{
public int maxSlimeHealth = 40;
public int curSlimeHealth = 40;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
答案 0 :(得分:2)
简单和糟糕的解决方案是使用hitArea[i].collider.gameObject.GetComponent<TYPE_OF_YOUR_COMPONENT>().curSlimeHealth;
但是如果你想以更优雅的方式做到这一点,我建议制作一个接口,例如。 IMortal
或基类CreatureBehaviour
然后只调用该接口/抽象类的方法。在示例中,它可能是这样的:
public class CreatureBehaviour
: MonoBehaviour
{
int m_Health = 40;
public int Health { get { return m_Health; } }
// you can add defense attribute
int m_Defense;
public int Defense { get { return m_Defense; } }
public void DoDamage(double atkPower)
{
// calculate this creature defence agains attack power
int damage = atkPower - this.Defense;
m_Health -= damage;
// check health and other stuff.
}
}
现在创造你的粘液:
public class Slime
: CreatureBehaviour
{
}
你可以用类似的方式使用它,但不要检查你的hitArea[i].collider.tag
是"Enemy"
还是"AnotherTag"
,你可以查看:
var creature = hitAread[i].collider.gameObject.GetComponent<CreatureBehaviour>();
if ( creature )
creature.DoDamage(13.37D);