/// <summary> /// 终点按照随机的偏移分布. /// </summary> private static ErrorCode distributeByRandomOffset(ArrayList result, DistributionComputeParam param) { string[] args = param.distributionArgument.Split('|'); if (args.Length != 2) { return(ErrorCode.ConfigError); } uint count = System.Convert.ToUInt32(args[0]); float maxOffset = System.Convert.ToSingle(args[1]); // 起点到目标点射线的垂直方向. float radian = Utility.Vector3ToRadian(param.targetPosition - param.startPosition) + Mathf.PI / 2f; BulletDistributionResultDef distribution = new BulletDistributionResultDef() { Delay = 0, StartPosition = param.startPosition }; for (uint i = 0; i < count; ++i) { float random = UnityEngine.Random.value * 2 - 1f; // [-1, 1]. random *= maxOffset; // [-maxOffset, maxOffset]. distribution.TargetPosition = Utility.MoveVector3Towards(param.targetPosition, radian, random); result.Add(distribution); } return(ErrorCode.Succeeded); }
/// <summary> /// 按角度偏移子弹. /// </summary> private static ErrorCode distributeByAngle(ArrayList result, DistributionComputeParam param) { uint[] args = Utility.SplitToUnsigned(param.distributionArgument); if (args.Length != 2) { return(ErrorCode.ConfigError); } uint count = args[0]; float radian = args[1] * Mathf.Deg2Rad; BulletDistributionResultDef distribution = new BulletDistributionResultDef() { StartPosition = param.startPosition, TargetPosition = Utility.RotateVectorByRadian(param.targetPosition, (count - 1) * radian / 2f, param.startPosition), Delay = 0 }; // 从中间位置开始, 顺时针方向最后一个子弹的分布. result.Add(distribution); // 逆时针旋转radian弧度, 计算剩余的子弹的目标点. for (uint i = 1; i < count; ++i) { distribution.TargetPosition = Utility.RotateVectorByRadian(distribution.TargetPosition, -radian, param.startPosition); result.Add(distribution); } return(ErrorCode.Succeeded); }
/// <summary> /// 按照对每颗子弹的数据指定, 计算子弹的起点和终点. /// </summary> private static ErrorCode distributeByData(ArrayList result, DistributionComputeParam param) { uint[] array = Utility.SplitToUnsigned(param.distributionArgument); foreach (uint id in array) { Vector3 start = param.startPosition, end = param.targetPosition; BulletDistributionTableItem distribution = DataManager.BulletDistributionTable[id] as BulletDistributionTableItem; if (distribution == null) { return(ErrorCode.ConfigError); } // 按角度, 将起点到终点的射线旋转指定角度. end = Utility.RotateVectorByRadian(end, distribution.angle * Mathf.Deg2Rad, start); float flyDirection = Utility.Vector3ToRadian(end - start); // 起点右偏移. start = Utility.MoveVector3Towards(start, flyDirection + Mathf.PI / 2f, distribution.startOffsetRight); flyDirection = Utility.Vector3ToRadian(end - start); // 起点前偏移. start = Utility.MoveVector3Towards(start, flyDirection, distribution.startOffsetForward); flyDirection = Utility.Vector3ToRadian(end - start); // 终点右偏移. end = Utility.MoveVector3Towards(end, flyDirection + Mathf.PI / 2f, distribution.endOffsetRight); flyDirection = Utility.Vector3ToRadian(end - start); // 终点向前偏移. end = Utility.MoveVector3Towards(end, flyDirection, distribution.endOffsetForward); result.Add(new BulletDistributionResultDef() { Delay = distribution.delay, StartPosition = start, TargetPosition = end }); } return(ErrorCode.Succeeded); }
/// <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); }