1. 组件化结构(Component-Based Architecture)
-
核心思想:“一切皆 GameObject,一切行为由组件驱动”。
-
每个游戏对象(
GameObject
)由多个Component
组合构成,如Transform
,Rigidbody
,Collider
, 自定义MonoBehaviour
。 -
行为通过继承
MonoBehaviour
编写类来添加。
2. 封装(Encapsulation)
-
每个类负责自身行为和数据,如一个
Player
类管理生命值、移动逻辑等。 -
使用私有字段 + 公共方法进行数据控制和访问。
3. 继承(Inheritance)
-
用于扩展行为,例如:
public class Character : MonoBehaviour { ... }
public class Enemy : Character { ... }
public class Player : Character { ... }
4. 多态(Polymorphism)
-
利用虚函数(
virtual
/override
)或接口(interface
)定义通用行为。 -
示例:多个单位都实现了
IDamageable
接口,实现不同的受击效果。
5. 面向对象设计模式
-
使用常见模式如:
-
单例模式(如
GameManager
) -
工厂模式(生成敌人/道具)
-
状态机模式(角色状态切换)
-
观察者模式(UI响应事件)
-
6. 职责分离
-
每个脚本职责单一,例如:
-
PlayerMovement
处理移动 -
PlayerHealth
处理生命 -
InventoryManager
处理背包系统
-
总结:Unity 的 OOP 开发模式是以 GameObject 为中心,通过组合组件的方式来实现游戏对象的行为,结合传统 OOP 的封装、继承、多态和设计模式,使得逻辑结构清晰、易于复用与扩展。
Unity OOP 模式下的简单射击游戏示例项目结构:
以下为一个 Unity OOP 模式下的简单射击游戏示例项目结构,包含角色控制、武器系统、射击逻辑等模块,配套完整注释说明每个类用途与结构:
一、项目结构总览
/Scripts
├── Characters
│ ├── Player.cs
│ ├── Enemy.cs
│ └── CharacterBase.cs
├── Weapons
│ ├── WeaponBase.cs
│ ├── Rifle.cs
│ └── Bullet.cs
├── Interfaces
│ └── IDamageable.cs
├── Managers
│ └── GameManager.cs
└── Utilities
└── ObjectPool.cs
二、类实现与注释说明
1. 接口:IDamageable.cs
// 可被伤害的对象接口,所有角色、物体若能被攻击需实现本接口
public interface IDamageable
{
void TakeDamage(float amount);
}
2. 角色基类:CharacterBase.cs
using UnityEngine;
// 所有角色的共通行为,如生命值控制
public abstract class CharacterBase : MonoBehaviour, IDamageable
{
[SerializeField] protected float maxHealth = 100f;
protected float currentHealth;
protected virtual void Start()
{
currentHealth = maxHealth;
}
public virtual void TakeDamage(float amount)
{
currentHealth -= amount;
Debug.Log($"{gameObject.name} 受到了 {amount} 点伤害");
if (currentHealth <= 0)
{
Die();
}
}
protected virtual void Die()
{
Debug.Log($"{gameObject.name} 已死亡");
Destroy(gameObject);
}
}
3. 玩家:Player.cs
using UnityEngine;
// 玩家角色控制脚本,负责移动、射击、武器管理
public class Player : CharacterBase
{
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private WeaponBase equippedWeapon;
private void Update()
{
HandleMovement();
HandleShooting();
}
private void HandleMovement()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, 0, v).normalized;
transform.Translate(dir * moveSpeed * Time.deltaTime, Space.World);
}
private void HandleShooting()
{
if (Input.GetButtonDown("Fire1"))
{
equippedWeapon?.Fire();
}
}
}
4. 敌人:Enemy.cs
using UnityEngine;
// 简单敌人类,继承自角色基类
public class Enemy : CharacterBase
{
// 可添加 AI 行为、巡逻、追击逻辑等
}
5. 武器基类:WeaponBase.cs
using UnityEngine;
// 武器抽象类,提供 Fire 接口
public abstract class WeaponBase : MonoBehaviour
{
public abstract void Fire();
}
6. 步枪类:Rifle.cs
using UnityEngine;
// 步枪类,继承 WeaponBase,实现具体的射击行为
public class Rifle : WeaponBase
{
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private Transform firePoint;
public override void Fire()
{
Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
Debug.Log("步枪开火");
}
}
7. 子弹类:Bullet.cs
using UnityEngine;
// 子弹飞行与命中处理
public class Bullet : MonoBehaviour
{
public float speed = 20f;
public float damage = 25f;
public float lifetime = 2f;
private void Start()
{
Destroy(gameObject, lifetime);
}
private void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
private void OnTriggerEnter(Collider other)
{
if (other.TryGetComponent(out IDamageable target))
{
target.TakeDamage(damage);
}
Destroy(gameObject);
}
}
8. 游戏管理器(可选):GameManager.cs
using UnityEngine;
// 管理游戏状态、UI、敌人生成等全局逻辑
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private void Awake()
{
if (Instance == null) Instance = this;
else Destroy(gameObject);
}
}
三、OOP 特征总结
特性 | 实例 |
---|---|
封装 | CharacterBase 封装生命值逻辑 |
继承 | Player , Enemy 继承 CharacterBase |
多态 | IDamageable 接口用于通用伤害调用;WeaponBase 多种实现方式 |
模块职责分离 | 控制、战斗、管理、数据分离,每个类职责单一 |
以下为一个 Unity OOP 模式下的简单射击游戏示例项目结构,包含角色控制、武器系统、射击逻辑等模块,配套完整注释说明每个类用途与结构:
一、项目结构总览
/Scripts
├── Characters
│ ├── Player.cs
│ ├── Enemy.cs
│ └── CharacterBase.cs
├── Weapons
│ ├── WeaponBase.cs
│ ├── Rifle.cs
│ └── Bullet.cs
├── Interfaces
│ └── IDamageable.cs
├── Managers
│ └── GameManager.cs
└── Utilities
└── ObjectPool.cs
二、类实现与注释说明
1. 接口:IDamageable.cs
// 可被伤害的对象接口,所有角色、物体若能被攻击需实现本接口
public interface IDamageable
{
void TakeDamage(float amount);
}
2. 角色基类:CharacterBase.cs
using UnityEngine;
// 所有角色的共通行为,如生命值控制
public abstract class CharacterBase : MonoBehaviour, IDamageable
{
[SerializeField] protected float maxHealth = 100f;
protected float currentHealth;
protected virtual void Start()
{
currentHealth = maxHealth;
}
public virtual void TakeDamage(float amount)
{
currentHealth -= amount;
Debug.Log($"{gameObject.name} 受到了 {amount} 点伤害");
if (currentHealth <= 0)
{
Die();
}
}
protected virtual void Die()
{
Debug.Log($"{gameObject.name} 已死亡");
Destroy(gameObject);
}
}
3. 玩家:Player.cs
using UnityEngine;
// 玩家角色控制脚本,负责移动、射击、武器管理
public class Player : CharacterBase
{
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private WeaponBase equippedWeapon;
private void Update()
{
HandleMovement();
HandleShooting();
}
private void HandleMovement()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, 0, v).normalized;
transform.Translate(dir * moveSpeed * Time.deltaTime, Space.World);
}
private void HandleShooting()
{
if (Input.GetButtonDown("Fire1"))
{
equippedWeapon?.Fire();
}
}
}
4. 敌人:Enemy.cs
using UnityEngine;
// 简单敌人类,继承自角色基类
public class Enemy : CharacterBase
{
// 可添加 AI 行为、巡逻、追击逻辑等
}
5. 武器基类:WeaponBase.cs
using UnityEngine;
// 武器抽象类,提供 Fire 接口
public abstract class WeaponBase : MonoBehaviour
{
public abstract void Fire();
}
6. 步枪类:Rifle.cs
using UnityEngine;
// 步枪类,继承 WeaponBase,实现具体的射击行为
public class Rifle : WeaponBase
{
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private Transform firePoint;
public override void Fire()
{
Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
Debug.Log("步枪开火");
}
}
7. 子弹类:Bullet.cs
using UnityEngine;
// 子弹飞行与命中处理
public class Bullet : MonoBehaviour
{
public float speed = 20f;
public float damage = 25f;
public float lifetime = 2f;
private void Start()
{
Destroy(gameObject, lifetime);
}
private void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
private void OnTriggerEnter(Collider other)
{
if (other.TryGetComponent(out IDamageable target))
{
target.TakeDamage(damage);
}
Destroy(gameObject);
}
}
8. 游戏管理器(可选):GameManager.cs
using UnityEngine;
// 管理游戏状态、UI、敌人生成等全局逻辑
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private void Awake()
{
if (Instance == null) Instance = this;
else Destroy(gameObject);
}
}
三、OOP 特征总结
特性 | 实例 |
---|---|
封装 | CharacterBase 封装生命值逻辑 |
继承 | Player , Enemy 继承 CharacterBase |
多态 | IDamageable 接口用于通用伤害调用;WeaponBase 多种实现方式 |
模块职责分离 | 控制、战斗、管理、数据分离,每个类职责单一 |
是否需要配套场景搭建或 UI 部分的代码?
场景搭建和 UI部分代码示例:
以下是一个简单的场景搭建和 UI部分代码示例,包括玩家控制、敌人生成和游戏状态显示的 UI。这个例子涵盖了 Unity 场景中的 GameObject 设置和 UI 脚本实现。
一、场景搭建
1. 游戏对象设置
在 Unity 中创建以下对象:
(1) Player(玩家)
-
创建一个空 GameObject,命名为
Player
。 -
给该 GameObject 添加一个
Player.cs
脚本(在之前的代码中),以及一个CharacterController
组件用于移动。
(2) Weapon(武器)
-
创建一个子物体
Rifle
,添加Rifle.cs
脚本,并把武器模型绑定到此物体。 -
使武器的
FirePoint
(射击点)指向武器的前方。
(3) Enemy(敌人)
-
创建一个敌人模型,并给它添加
Enemy.cs
脚本。 -
可以使用
Enemy
类的 AI,或者简单的在场景中放置一些敌人 GameObject。
(4) Bullet(子弹)
-
子弹是一个 Prefab,需要预先设置,使用
Bullet.cs
控制其飞行和碰撞。
(5) UI:Health Bar(血条)
-
创建一个 Canvas。
-
添加一个
Slider
作为玩家血量条。 -
将玩家的生命值与 UI 绑定,动态更新血量显示。
二、UI 实现
1. GameUI.cs
– UI 显示(血量、分数等)
using UnityEngine;
using UnityEngine.UI;
public class GameUI : MonoBehaviour
{
[Header("UI Elements")]
public Slider healthSlider; // 玩家血条
public Text scoreText; // 分数显示
private Player player;
private void Start()
{
player = FindObjectOfType<Player>();
}
private void Update()
{
UpdateHealthUI();
UpdateScoreUI();
}
// 更新玩家血条
private void UpdateHealthUI()
{
if (player != null)
{
healthSlider.value = player.CurrentHealth / player.MaxHealth;
}
}
// 更新分数(示例分数逻辑,实际可以根据需要修改)
private void UpdateScoreUI()
{
int score = 0; // 假设有某个方式计算分数
scoreText.text = "Score: " + score;
}
}
2. HealthBar.cs
– 玩家血条控制(简化示例)
using UnityEngine;
using UnityEngine.UI;
public class HealthBar : MonoBehaviour
{
public Slider healthSlider;
public void SetHealth(float health, float maxHealth)
{
healthSlider.value = health / maxHealth;
}
}
三、敌人生成与玩家血量更新
1. GameManager.cs
– 游戏管理器(生成敌人、控制游戏流程)
using UnityEngine;
public class GameManager : MonoBehaviour
{
[Header("Enemy Settings")]
public GameObject enemyPrefab;
public Transform enemySpawnPoint;
public float spawnInterval = 3f;
private void Start()
{
InvokeRepeating("SpawnEnemy", 0f, spawnInterval); // 定时生成敌人
}
private void SpawnEnemy()
{
Instantiate(enemyPrefab, enemySpawnPoint.position, enemySpawnPoint.rotation);
}
}
2. Enemy.cs
– 敌人行为(基础的敌人AI逻辑)
using UnityEngine;
public class Enemy : CharacterBase
{
[SerializeField] private float moveSpeed = 2f;
private void Update()
{
MoveTowardsPlayer();
}
private void MoveTowardsPlayer()
{
GameObject player = GameObject.FindWithTag("Player");
if (player != null)
{
Vector3 direction = (player.transform.position - transform.position).normalized;
transform.Translate(direction * moveSpeed * Time.deltaTime);
}
}
}
四、UI 设置
1. Canvas 设置
-
创建一个 Canvas,并设置其
Render Mode
为Screen Space - Overlay
。 -
在 Canvas 中创建一个 Slider 作为血条,并设置如下:
-
Min Value 为 0,Max Value 为 1(血条满格时是 1,空时是 0)。
-
使用
GameUI.cs
脚本控制血条的更新。
-
2. Text 设置
-
在 Canvas 中创建一个 Text 元素,用于显示分数,绑定
scoreText
字段。
五、场景逻辑总结
-
玩家角色:负责移动和射击。通过
Player.cs
实现,用户输入控制角色运动、射击,并且射击时会实例化子弹。 -
敌人生成:通过
GameManager.cs
定时生成敌人,并且每个敌人会朝玩家移动。敌人使用Enemy.cs
实现。 -
UI 显示:使用
GameUI.cs
来更新玩家的血量和分数,血量通过玩家的Health
更新,分数则可以根据击杀敌人等方式来计算。 -
UI 控件:使用 Slider 显示玩家血量,Text 显示分数。