Esempio n. 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);
    }
Esempio n. 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);
    }
Esempio n. 3
0
    /// <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);
    }
Esempio n. 4
0
    /// <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);
    }