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