unity3d 我如何重新格式化它以使用更多的组合而不是所有的继承?

sczxawaw  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(136)

我是第一次学习C#中的继承和组合,基于以下内容,到目前为止,有没有一种更干净/更模块化的方法可以通过实现2D平台游戏的组合来重组我的代码?我希望在游戏变得太大之前引入组合。
给予一些背景(我知道这是一个单独的问题),我也在试图找出一种方法,只有敌人受到伤害时,球员跳到敌人的顶部,所以球员不会受到伤害。我有两个碰撞器对敌人(下图),我也与重叠区()混乱。我真的不知道如何去。
Enemy with a collider on top to receive damage and one below to deal damage to player
基类:

public class Character : MonoBehaviour {
    public int maxHealth;
    public int currentHealth;
    public HealthBar healthBar;

    [SerializeField] protected float damageInterval = 2f; //in seconds
    protected float currentDamageInterval;

    protected SpriteRenderer sr;
    private Rigidbody2D rb;

    protected virtual void Start() {
        sr = GetComponent<SpriteRenderer>();
        rb = GetComponent<Rigidbody2D>();
        currentHealth = maxHealth;
        healthBar.SetMaxHealth(maxHealth);
    }
    protected virtual void Update() {
        //subtract 1 real life second
        if (currentDamageInterval >= 0)
            currentDamageInterval -= Time.deltaTime;
    }
    public bool CanTakeDamage() {
        return (currentDamageInterval < 0);
    }
    public virtual void TakeDamage(int damage) {
        currentHealth -= damage;
        healthBar.SetHealth(currentHealth);
        int yDamageVelocity = 15;

        rb.velocity = new Vector2(rb.velocity.x, yDamageVelocity);
        //set currentDamageInterval to start a new cooldown/delay period (2 seconds)
        currentDamageInterval = damageInterval;
    }
}

儿童班:
x一个一个一个一个x一个一个二个x
我试过在碰撞器上使用OnCollisionEnter和OnTriggerEnter以及OverlapArea方法。我看了几个小时的教程,对于我的特定项目,我遇到了麻烦。

kh212irz

kh212irz1#

深继承链并不一定是坏事,只要你的类真的是基类的。然而,当你只是继承来访问基类成员时,那么复合就是你要走的路。尽管如此,我还是看不到你的代码有什么内在的问题:在我看来,拥有一个Enemy-类是完全有意义的。相反,一个Enemy * 拥有一个Character对我来说似乎有点不自然。另一方面,一个Enemy拥有一些攻击。争论一个Enemy攻击列表是没有意义的。
然而,一个盒子里的苹果 * 可能 * 是一个苹果列表。然而,你最好在盒子里 * 有 * 一个苹果列表,然后只向外面暴露你真正 * 想 * 暴露的成员。特别是,你可能不想暴露对底层列表中的项的基于索引的访问,例如,这看起来很奇怪:

Box<Apple> b = new Box<Apple>(10);
b[0] = new Apple();

事实上,你提到的就像Fildor正确提到的那样--更多的是一种经验法则。特别是,它是“偏爱”组合而不是继承。这意味着在某些情况下,继承是绝对正确的方式,而在某些情况下,组合更好。

相关问题