-2

我正在制作游戏,目前正在研究近战伤害。我已经完成了寻找敌人等的所有代码,但现在我需要让那个敌人受到伤害。这就是为什么我需要在脚本中访问我的敌人(史莱姆)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()
    {

    }
}
4

1 回答 1

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);
于 2017-04-04T09:04:37.750 回答