/// <summary> /// 根据投掷物的创建参数, 创建投掷物. /// <para>按如下步骤处理子弹的分布:</para> /// <para>1 根据子弹的类型, 调整子弹方向, 并将个别类型的子弹的目标点缩放到子弹射程的最远点.</para> /// <para>2 依次应用分布参数.</para> /// 3 根据上述结果, 创建子弹. /// </summary> private static ErrorCode createProjectiles(ProjectileCreateParam param) { // 获取子弹分布. ArrayList distributionContainer = new ArrayList(); // 处理子弹的飞行方向. param.TargetPosition = BulletAdjuster.AdjustBulletDirection(param.BulletRes, param.User, param.StartPosition, param.TargetPosition); // 调整个别类型的子弹的终点, 到子弹的最大射程. param.TargetPosition = BulletAdjuster.AdjustBulletTargetPosition(param.BulletRes, param.StartPosition, param.TargetPosition); // 根据子弹的分布, 调整子弹的起始/终点位置, 以及延迟等. ErrorCode err = computeBulletDistribution(distributionContainer, param); if (err != ErrorCode.Succeeded) { return(err); } // 产生子弹. foreach (BulletDistributionResultDef distribution in distributionContainer) { BulletInitParam initParam = new BulletInitParam() { resID = (uint)param.BulletRes.resID, startPosition = distribution.StartPosition, targetPosition = distribution.TargetPosition, firerAttr = new AttackerAttr(param.User, param.SkillResID), createDelay = distribution.Delay, }; Bullet bullet = BulletFactory.Instance.Allocate(param.BulletRes.type); if (bullet != null && bullet.Init(initParam)) { SceneManager.Instance.GetCurScene().AddSprte(bullet); } } return(err); }
/// <summary> /// 计算子弹的分布. /// </summary> private static ErrorCode computeBulletDistribution(ArrayList result, ProjectileCreateParam param) { DistributeHandler handler = null; switch (param.DistributionType) { case BulletDistributionType.ByAngle: handler = distributeByAngle; break; case BulletDistributionType.ByRandomOffset: handler = distributeByRandomOffset; break; case BulletDistributionType.ByData: handler = distributeByData; break; default: break; } DistributionComputeParam computeParam = new DistributionComputeParam() { distributionArgument = param.DistributionArgument, startPosition = param.StartPosition, targetPosition = param.TargetPosition }; ErrorCode err = ErrorCode.ConfigError; if (handler != null) { err = handler(result, computeParam); } ErrorHandler.Parse(err, "failed to compute bullet distribution"); return(err); }
/// <summary> /// 创建投掷物. /// </summary> public static ErrorCode createProjectiles(BattleUnit user, uint skillResID, uint projResID, Vector3 targetPosition) { ProjectileSettingsTableItem projSettings = DataManager.ProjectileSettingsTable[projResID] as ProjectileSettingsTableItem; for (uint i = 0; i < ProjectileSettingsTableItem.ProjectileCount; ++i) { ProjectileItem item = projSettings.items[i]; if (item.bulletResID == uint.MaxValue) { break; } BulletTableItem bulletRes = DataManager.BulletTable[item.bulletResID] as BulletTableItem; // 枪口特效. if (item.bindpointEffect != uint.MaxValue) { SkillClientBehaviour.AddEffect2Object(user, item.bindpointEffect, item.initBindpoint); } ProjectileCreateParam param = new ProjectileCreateParam() { User = user, StartPosition = user.GetBonePositionByName(item.initBindpoint), TargetPosition = targetPosition, DistributionType = item.distributionType, DistributionArgument = item.distributionArgument, BulletRes = bulletRes, SkillResID = skillResID }; createProjectiles(param); } return(ErrorCode.Succeeded); }