/// <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); }