示例#1
0
    public override bool Init(ObjectInitParam param)
    {
        if (!base.Init(param))
        {
            return(false);
        }

        mBulletParam = (BulletInitParam)param;

        if ((mBulletResource = DataManager.BulletTable[mBulletParam.resID] as BulletTableItem) == null)
        {
            SkillUtilities.ResourceNotFound("bullet", mBulletParam.resID);
            return(false);
        }

        mCreateDelay = mBulletParam.createDelay;

        mFirerAttr = mBulletParam.firerAttr;

        FlySpeed = mBulletResource.flySpeed;

        StartPosition  = mBulletParam.startPosition;
        TargetPosition = mBulletParam.targetPosition;

        Vector3 dir3d = TargetPosition - StartPosition;

        dir3d.y = 0;

        if (dir3d == Vector3.zero)
        {
            // 起始点与终点位置重叠, 取开火者当前朝向.
            BattleUnit firer       = mFirerAttr.CheckedAttackerObject();
            float      alternative = (firer != null) ? firer.GetDirection() : mFirerAttr.AttackerDirection;
            dir3d = Utility.RadianToVector3(alternative);
        }

        FlyDirection = Quaternion.LookRotation(dir3d);
        SetRotation(FlyDirection);

        AccelerateDelay = mBulletResource.accelerateDelay;

        mFlyTargetSelection = new TargetSelectionTableItem()
        {
            resID     = -1,
            desc      = "bullet hit",
            leagueSel = mBulletResource.leagueSelection,
            //maxTargetCount = mBulletResource.flyThroughCount - (uint)mHitted.Count,
            shape      = ShapeType.ShapeType_Rect,
            RectLength = mBulletResource.radiusOnCollide * 2
        };

        SetPosition(StartPosition);

        return(true);
    }
示例#2
0
    /// <summary>
    /// 确定目标点的位置, 检查子弹初始位置和目标点之间的阻挡.
    /// </summary>
    private void verifyRange(BulletInitParam param)
    {
        //如果存在高/低阻挡, 那么截断至最远点.
        if (mFlyController.FlyStraight)
        {
            Vector3 targetPosition = Vector3.zero;
            if (Scene.TestLineBlock(StartPosition, TargetPosition, true, CheckLowBlockOnFlying, out targetPosition))
            {
                targetPosition.y = TargetPosition.y;
                TargetPosition   = targetPosition;
            }
        }

        LeftRange = TotalRange = Utility.Distance2D(TargetPosition, StartPosition);
    }
示例#3
0
    /// <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);
    }