提升你的代码:面向对象编程 (OOP) 是游戏开发的支柱
Source: Dev.to
介绍
如果你曾经深入了解过像 Unreal(C++)或 Unity(C#)这样的现代游戏引擎,你会发现一个共同点:Object‑Oriented Programming (OOP)。
虽然函数式和面向数据的方法正日益受到关注,OOP 仍然是构建复杂、交互式世界的主要思维模型。本文将探讨 OOP 的四大支柱如何直接映射到游戏机制上。
封装
在游戏中,像玩家或敌人这样的对象不应该让其他脚本直接操作其内部变量。
封装让我们能够隐藏对象的内部状态,只通过方法公开必要的功能。
示例 – 玩家生命值
public class Player : MonoBehaviour
{
private int health = 100;
public void TakeDamage(int amount)
{
// 检查无敌帧、护甲增益等
health = Mathf.Max(health - amount, 0);
// 这里可以加入额外逻辑(例如死亡处理)
}
public int GetHealth() => health;
}
敌人脚本调用 player.TakeDamage(damageAmount) 而不是直接设置 player.health = 0,从而保持了玩家内部规则的完整性。
继承
为什么要为“哥布林”“兽人”和“龙”写相同的代码,如果它们都共享基本特征?
继承让我们可以定义一个包含共享属性的基类,并从中派生出专门的子类。
基类和子类
public class Enemy : MonoBehaviour
{
public Vector3 Position;
public int Health;
public Transform Target;
}
public class ArcherEnemy : Enemy
{
public float Range;
// Additional archer‑specific behavior
}
public class BossEnemy : Enemy
{
public void PhaseTwo()
{
// Boss‑specific phase transition logic
}
}
这减少了重复并将公共功能集中管理。
多态
多态允许单个函数根据实现它的对象表现出不同的行为。
武器示例
public abstract class Weapon : MonoBehaviour
{
public abstract void Fire();
}
public class Pistol : Weapon
{
public override void Fire()
{
// Shoot a single raycast
}
}
public class Shotgun : Weapon
{
public override void Fire()
{
// Shoot five raycasts in a cone
}
}
public class GrenadeLauncher : Weapon
{
public override void Fire()
{
// Spawn a physics‑based projectile
}
}
Inventory 脚本可以调用 currentWeapon.Fire(); 而无需知道它具体是哪种武器。
抽象
抽象专注于仅暴露对象的核心特性。在游戏开发中,我们常常使用抽象类或接口来定义对象的 做什么,而不指定它是 如何 实现的。
可交互接口
public interface IInteractable
{
void Interact();
}
任何实现了 IInteractable 的对象——无论是宝箱、门还是 NPC——都可以使用相同的玩家代码进行交互:
void TryInteract(IInteractable interactable)
{
interactable.Interact();
}
OOP Pillars in Game Development
| Pillar | Game Dev Use Case | Benefit |
|---|---|---|
| 封装 | 管理玩家生命值/属性 | 防止错误和“意大利面条代码”。 |
| 继承 | 创建敌人类型 | 减少代码重复(DRY)。 |
| 多态 | 不同武器/技能行为 | 实现模块化、可交换的系统。 |
| 抽象 | 与世界对象交互 | 简化玩家控制器的逻辑。 |
结论
面向对象编程(OOP)不仅仅是一套规则;它是一种组织游戏世界混沌的方式。通过掌握这四大支柱,你将从“编写脚本”转变为“构建系统”,使你的游戏更易于调试、扩展,并且——最重要的是——更容易完成。
你的看法是什么?你更倾向于在游戏中使用纯粹的 OOP,还是正在转向实体组件系统(ECS)?