What are your feelings

  • Happy
  • 常规
  • Sad

Unity OOP 开发模式

Unity OOP 开发模式

unity oop 开发模式核心:

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 ModeScreen 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 显示分数。

索引