我是第一次学习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方法。我看了几个小时的教程,对于我的特定项目,我遇到了麻烦。
1条答案
按热度按时间kh212irz1#
深继承链并不一定是坏事,只要你的类真的是基类的。然而,当你只是继承来访问基类成员时,那么复合就是你要走的路。尽管如此,我还是看不到你的代码有什么内在的问题:在我看来,拥有一个
Enemy
-类是完全有意义的。相反,一个Enemy
* 拥有一个Character
对我来说似乎有点不自然。另一方面,一个Enemy
拥有一些攻击。争论一个Enemy
是攻击列表是没有意义的。然而,一个盒子里的苹果 * 可能 * 是一个苹果列表。然而,你最好在盒子里 * 有 * 一个苹果列表,然后只向外面暴露你真正 * 想 * 暴露的成员。特别是,你可能不想暴露对底层列表中的项的基于索引的访问,例如,这看起来很奇怪:
事实上,你提到的就像Fildor正确提到的那样--更多的是一种经验法则。特别是,它是“偏爱”组合而不是继承。这意味着在某些情况下,继承是绝对正确的方式,而在某些情况下,组合更好。