提升你的代码:面向对象编程 (OOP) 是游戏开发的支柱

发布: (2025年12月27日 GMT+8 03:35)
5 min read
原文: Dev.to

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

PillarGame Dev Use CaseBenefit
封装管理玩家生命值/属性防止错误和“意大利面条代码”。
继承创建敌人类型减少代码重复(DRY)。
多态不同武器/技能行为实现模块化、可交换的系统。
抽象与世界对象交互简化玩家控制器的逻辑。

结论

面向对象编程(OOP)不仅仅是一套规则;它是一种组织游戏世界混沌的方式。通过掌握这四大支柱,你将从“编写脚本”转变为“构建系统”,使你的游戏更易于调试、扩展,并且——最重要的是——更容易完成。

你的看法是什么?你更倾向于在游戏中使用纯粹的 OOP,还是正在转向实体组件系统(ECS)?

Back to Blog

相关文章

阅读更多 »

SOLID 再探 — 后模式视角

为什么原则不如背后的力量重要:SOLID 不是一份检查清单,而是对更深层力量的历史压缩。这是系列的第 5 部分。

Unity 迷你足球

1. Maydon poli Plane - 层级 → 右键单击 → 3D Object → Plane - 检查器设置:- Name: Ground - Position: X = 0, Y = 0, Z = 0 - Scale: X = 2, Y = 1, …