攻击需要不同的武器,提取出WeaponBase进行武器攻击
攻击拆分为两种状态:
1.没有目标,靠近敌人
2.有目标,进行攻击
对于武器,攻击框架:
1.获取武器的配置信息
2.获取配置中的攻击次数,进行遍历
3.先播放攻击动画,显示特效,进行攻击移动
4.等待配置中的被击时间,使用协程
5.根据配置中的攻击角度和攻击距离,寻找扇形范围内的目标,进行攻击算伤害,被击移动
6.等待配置中的攻击剩余时间,类似后摇
7.如果没有目标,自动停止连招,否则继续连招
protected virtual IEnumerator StartAutoAttack()
{
while (this._bAutoAttacking)
{
int count = this.weaponData.attackCount;
for (int i = 0; i < count; i++)
{
//抬手动作
this.DoPreAttack(i);
float hittedTime = this.weaponData.hittedTimes[i];
yield return CoroutineTaskManager.Get(hittedTime);
//计算伤害
this.DoFindTargets(i);
if (this.HasTarget())
{
this.DoRealAttack(i);
}
//恢复动作
float attackTime = this.weaponData.attackTimes[i];
yield return CoroutineTaskManager.Get(attackTime - hittedTime);
//没目标停止攻击
this.DoFindTargets(i);
if (!this.HasTarget())
{
this._bAutoAttacking = false;
this._entityBase.SetIdle();
yield break;
}
}
}
}
武器配置:
攻击、防御、暴击率、闪避率、攻击检测范围、攻击真实范围
攻击移动时间、攻击移动距离
攻击次数、每次攻击时间、攻击生成的道具、计算伤害的时间、攻击的角度
攻击要显示的特效、特效要显示的时间
攻击检测范围和真实范围:
检测范围是触发攻击的范围,比如有敌人是跳过去劈砍
在哪开始跳,是检测范围
在哪算伤害,是真实范围
攻击生成的道具:
弓箭兵,真实算伤害时,实例化出弓箭道具
通过碰撞检测,进行伤害计算
范围检测:
距离:
Vector3.Distance
角度:
通过获取自身的前向量,我指向敌人的向量。
配置的是角度120度,先求点积,通过Acos反向求得弧度,乘以Rad2Deg转为弧度
再乘以2,和配置度数比较
坑:两个向量指向同一方向,就会求不出,直接返回在范围内即可。
伤害计算:
攻击力-防御力
有可能格挡和暴击
根据不同的Id创建武器
不需要使用工厂进行判断,如果是1001,创建Weapon1001
直接通过反射创建,符合开闭原则
string typeName = "Weapon" + weaponId;
Type type = Type.GetType(typeName);
this._weaponBase = type.Assembly.CreateInstance(typeName) as WeaponBase;
this._weaponBase.Init(this._entityBase);
其他
特效:
都是美术直接做好的,直接显示即可,注意旋转
武器换装:
1.是直接挂在骨骼节点上的,删除原来的替换新的
2.在模型上就有一堆武器,需要哪个就显示哪个
网友评论