unity面向组合开发一:面向对象(OOP)与面向组合(EC)

一、面向对象和类

面向对象(OOP)是一种编程范式,他把具体的事物抽象成对象,我们通过编写对应的类去实例化对象,类是对象的模板,类不是对象,类是对一类对象的抽象出来的模板。

想象这样一个场景:在unity开发中写一个角色控制器去控制角色,代码可能会这么写:

using UnityEngine;
public class PlayerController : MonoBehaviour
{
    public Transform transform;
    public float speed;
    
    void Awake()
    {
        transform = GetComponent<Transform>();
    }

    private void Update()
    {
        var movementX = Input.GetAxis("Horizontal");
        var movementZ = Input.GetAxis("Vertical");
        if (movementX != 0 || movementZ != 0)
            Move(new Vector3(movementX, 0, movementZ) * speed);
        if(Input.GetMouseButtonDown(0))
            Attack();
    }

    private void Move(Vector3 movement)
    {
        transform.position += movement;
    }

    private void Attack()
    {
        // 执行攻击逻辑
    }
}

 一般情况下会写一个角色控制器去控制角色的行为,像是移动,攻击等。

角色控制器一般会包括两个东西:角色行为和角色数据。

抽象到类就是方法和变量,如果后面我们需要角色跳跃,我们就在角色控制器加上跳跃代码。

二、面向组合(EC)

面向组合和面向对象最大的不同是:他们看待事物的颗粒度大小不同。面向对象关心"我"是谁,面向组合关心的是我能"做什么"。

在面向对象看来:我是一个角色,我能做的事情有移动,攻击,所以我的角色控制器里有移动方法,攻击方法。同时角色有一些自己的数据,相似速度,力量等,角色类里也会有对应的变量。

在面向组合看来:我关心我能做什么,他并没有"我"是谁的概念,我的角色能移动并不是因为我是角色,而是因为角色身上挂载着移动能力组件,所以角色可以移动。

像在unity中,想让一个物体可以发生碰撞,我们要为这个物体挂载碰撞体组件。同样在EC里如果我们希望这个物体拥有某种能力,我们就为其挂载对应的能力组件,我们并不关心这个物体是谁。

面向组合就像是搭积木,我们希望这个物体有什么能力,就为其添加对应的能力组件。

三、用EC设计武器系统

现在用EC设计一个武器系统,首先没有武器这个概念了,我们从剑,弓,盾这三大类武器去抽象他们拥有的能力。

对应剑,弓,盾这三者来说,他们都拥有运动这一能力。

剑和盾的移动是以角色为中心移心做类圆周旋转和短距离位移:挥剑和举盾。

弓的移动是以角色为起点做创建一个子弹,让子弹做长距离位移:拉弓射击。

他们虽然表现不同,但是本质上是模型(及其子物体)在做位移,旋转。

于是我们抽象出武器的第一个能力,武器运动能力。

对于弓来说,他的运动轨迹前半段是在做拉弓这一动作,后半段是以角色为起点,创建了一个子弹,让子弹做位移运动。

所以对应弓来说,他的运动轨迹有两段,第一段是弓的运动轨迹,第二段是生成物体,让其位移。

对应剑和盾来说,他们的运动轨迹只有一段。我们可以做一个编辑器页面,去配置各种武器的位移,武器执行运动能力时只需要去读他们对应的运动轨迹即可。

对应剑和弓来说,他们还有攻击能力,抽象出第二个能力:攻击能力。

对应盾来说,他有防御能力,抽象出第二个能力:抽象出第二个能力:防御能力。

现在武器系统的能力就抽象好了:武器运动能力,攻击能力,防御能力。

这样我们做一个弓我们只要为其挂载:武器运动能力,攻击能力就可以。如果我们想让这把弓可以一次发射多颗子弹,只有修改其武器运动能力下的运动轨迹数据即可。

那如果我像做一个可以远程攻击的盾,我们可以为盾添加:武器运动能力,攻击能力。同时修改其运动轨迹数据:让盾绕着玩家做圆周旋转运动,这样我们就做好一把可以像回旋镖一样可以远程攻击的盾,如果需要这把盾还保留防御能力,为其添加防御能力即可。

这样基于组合的武器系统就设计好了。

我们可以把这个组合武器的系统开发给玩家,让玩家设计自己独属的武器。

posted @ 2025-10-01 21:12  apssic  阅读(23)  评论(0)    收藏  举报