Пример #1
0
    /// <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);
    }
Пример #2
0
    /// <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);
    }