我对Unity不太了解,而且我有一段时间没有做游戏开发了,所以让我给您这个问题的一般编程答案。我的回答基于我对实体组件系统的一般了解,其中实体是与N个许多组件相关联的数字,一个组件仅包含数据,并且系统对与之相关联的组件集进行操作同一实体。
您的问题空间是这样的:
- 整个游戏中有多种攻击敌人的方法。
- 每艘船,构筑物等可能有多种攻击方式(每种方式都以某种方式确定)
- 每次攻击可能都有其自己的粒子效果。
- 攻击必须考虑目标和用户身上存在的某些因素(例如,惯性或装甲)。
我将构建如下的解决方案:
- 攻击具有标识符-可以是字符串。
- 实体“知道”它可以使用攻击(基于攻击的标识符)。
- 当实体使用攻击时,会将相应的显示组件添加到场景中。
- 您具有一些了解攻击目标,攻击者和所使用攻击的逻辑-该逻辑应确定您造成的损失(并可以使用惯性或两个实体中的任何一个)。
重要的是,攻击与实体之间的接触点应尽可能薄-这将使您的代码可重复使用,并防止您不得不为使用同一类型攻击的每种不同类型的实体提供重复的代码。换句话说,这里有一些JavaScript伪代码可以帮助您了解。
// components
var bulletStrength = { strength: 50 };
var inertia = { inertia: 100 };
var target = { entityId: 0 };
var bullets = {};
var entity = entityManager.create([bulletStrength, inertia, target, bullets]);
var bulletSystem = function() {
this.update = function(deltaTime, entityId) {
var bulletStrength = this.getComponentForEntity('bulletStrength', entityId);
var targetComponent = this.getComponentForEntity('target', entityId);
// you may instead elect to have the target object contain properties for the target, rather than expose the entity id
var target = this.getComponentForEntity('inertia', targetComponent.entityId);
// do some calculations based on the target and the bullet strength to determine what damage to deal
target.health -= ....;
}
};
register(bulletSystem).for(entities.with(['bullets']));
抱歉,这个答案有点“麻烦”。我只有一个半小时的午餐休息时间,很难在不完全了解Unity的情况下提出一些建议:(