protected override ErrorCode doStart(ActionInitParam param) { ErrorCode err = base.doStart(param); if (err != ErrorCode.Succeeded) { return(err); } ActionDisplacementInitParam displacementInit = param as ActionDisplacementInitParam; mDisplacementResource = displacementInit.displacementResource; if (mDisplacementResource.leagueSelectionOnExecute != LeagueSelection.None && mDisplacementResource.skillEffect2OthersOnExecute != uint.MaxValue) { mTargetSelectionOnExecute = new TargetSelectionTableItem() { resID = -1, desc = "displacement hit", leagueSel = mDisplacementResource.leagueSelectionOnExecute, maxTargetCount = uint.MaxValue, shape = ShapeType.ShapeType_Rect, RectLength = mDisplacementResource.radiusOnCollide * 2 } } ; return(ErrorCode.Succeeded); }
/// <summary> /// 开始位移. /// </summary> /// <param name="actionCenter">动作控制器</param> /// <param name="attackerAttr">发起这次位移的单位的属性(如果是突进, 那么是角色本身; 如果是击退, 为发起击退技能的单位)</param> /// <param name="displacementRes"></param> /// <returns></returns> public static ErrorCode StartDisplace(BattleUnitActionCenter actionCenter, AttackerAttr attackerAttr, uint displacementResID) { SkillDisplacementTableItem displacementRes = DataManager.DisplacementTable[displacementResID] as SkillDisplacementTableItem; if (displacementRes == null) { SkillUtilities.ResourceNotFound("displacement", displacementResID); return(ErrorCode.ConfigError); } // 免疫控制(有害的位移, 都视为控制). if (!actionCenter.Owner.CanBeStuned() && displacementRes.harmful) { return(ErrorCode.AddEffectFailedSkillEffectImmunity); } if ((actionCenter.GetActionByType(ActionTypeDef.ActionTypeDisplacement) as ActionDisplacement) != null) { return(ErrorCode.MaxStackCount); } Vector3 ownerPosition = actionCenter.Owner.GetPosition(); Vector3 targetPosition = ownerPosition; float distance = displacementRes.distance; if (distance < 0) { return(ErrorCode.ConfigError); } Vector3 displaceDirection = Vector3.zero; // 确定方向. switch (displacementRes.displacementType) { case SkillDisplacementType.Rush: displaceDirection = Utility.RadianToVector3(actionCenter.Owner.GetDirection()); break; case SkillDisplacementType.Beatback: displaceDirection = Utility.RadianToVector3(attackerAttr.EffectStartDirection); break; default: return(ErrorCode.ConfigError); } displaceDirection.y = 0; // 速度为负, 取反方向. if (displacementRes.speed < 0f) { displaceDirection = Vector3.zero - displaceDirection; } // beatback时, 特殊处理距离与朝向. if (displacementRes.displacementType == SkillDisplacementType.Beatback) { // 击退, 且速度为负时, 表示牵引向目标点. if (displacementRes.speed < 0f) { float magnitude = displaceDirection.magnitude; // 牵引的位置不会超过目标点的位置, 且与目标点的位置至少为0.5f. if (magnitude < distance) { distance = Mathf.Max(0f, magnitude - 0.5f); } } else // 击退时, 面朝起始点方向(后仰). { actionCenter.Owner.SetDirection(Utility.Vector3ToRadian(displaceDirection) + Mathf.PI); } } displaceDirection.Normalize(); displaceDirection *= distance; targetPosition += displaceDirection; BaseScene scn = SceneManager.Instance.GetCurScene(); if (scn == null) { return(ErrorCode.LogicError); } targetPosition = scn.FarthestWalkable(ownerPosition, targetPosition); ActionDisplacementInitParam param = new ActionDisplacementInitParam(); param.targetPosition = targetPosition; param.displacementResource = displacementRes; param.mAttackerAttr = attackerAttr; return(actionCenter.StartAction(param)); }