当前位置: 首页 > news >正文

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设计一个武器系统,首先没有武器这个概念了,我们从剑,弓,盾这三大类武器去抽象他们拥有的能力。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

http://www.hskmm.com/?act=detail&tid=22535

相关文章:

  • 两级页表
  • 复健。(10月,OI)
  • 实用指南:自动驾驶中的传感器技术55——USS(1)
  • 市场交易反心理特征之三:日内假反转
  • 实用指南:云服务器 + Jenkins 实现项目自动化部署与上线
  • Linux 中awk命令如何统计每行指定字符出现的次数
  • 常系数齐次微分方程
  • 变量
  • 具有快表的地址变换机构
  • 关于子集的枚举与高维前缀和
  • HyperWorks 14.0 轮毂仿真全流程详细教程
  • 原来的OJ怎么没了?
  • 【Linux】库的链接与加载 - 详解
  • CSP-S模拟26
  • 存在是必然的有机系统,好事多磨,心诚则灵
  • 2025 年陶土砖厂家权威推荐 TOP 品牌排行榜,劈开 / 红色 / 干挂 / 砌筑 / 仿古 / 透气 / 耐火 / 异型 / 装饰 / 外墙陶土砖产品厂家推荐
  • AGC015E Mr.Aoki Incubator
  • 2025 年臭氧发生器厂家 TOP 实力工厂推荐榜单排名,大中型 / 水处理 / 多功能臭氧发生器推荐这十家公司!
  • 2025 年采光瓦厂家 TOP 企业品牌推荐排行榜,详解数字化工厂与就近发货实力采光瓦推荐这十家公司!
  • 2025 年合成树脂瓦厂家 TOP 企业品牌推荐排行榜,防腐方案与定制能力全景对比合成树脂瓦公司推荐!
  • 2025 年人造草坪足球场厂家推荐 TOP10 品牌权威排行榜单,深度剖析人造草坪足球场行业优势公司
  • 2025 年望远镜厂家 TOP 企业品牌推荐排行榜,助你精准选购性价比高的望远镜推荐这十家公司!
  • Coze源码分析-资源库-删除数据库-后端源码-安全与错误处理 - 详解
  • 动手动脑实验性问题总结
  • 链表实现双端队列
  • FFmpeg和ZLMediaKit 实现本地视频推流
  • SQL 多表查询速查:JOIN、子查询一文全掌握 - 详解
  • 深入解析:数字和字节:Linux 中的内存如何工作?
  • AtCoder Beginner Contest 424 425 部分题解
  • 关于滚动数组