public static int GetActionIdx(this ActionGroup actionGroup, string actionID) { //actionID = NormalizeActionID(actionID); int idx = -1; for (int i = 0, max = actionGroup.ActionList.Count; i < max; i++) { ActData.Action action = actionGroup.ActionList[i]; idx++; if (action.Id == actionID) { return(idx); } } return(idx); }
AnimationState FetchAnimation(ActData.Action action, float speed) { if (action == null || action.AnimSlotList.Count == 0 || !mCachedAnimation) { return(null); } ActData.AnimSlot animSlot = action.AnimSlotList[UnityEngine.Random.Range(0, action.AnimSlotList.Count)]; AnimationState animState = mCachedAnimation[animSlot.Animation]; if (animState == null) { Debug.LogError(string.Format("Fail to change animation: {0}/{1}/{2}", UnitID, action.Id, animSlot.Animation)); return(null); } animState.normalizedTime = animSlot.Start * 0.01f; animState.speed = speed * (animSlot.End - animSlot.Start) * animState.length * 10.0f / (action.AnimTime); return(animState); }
public void PlayAnimation(ActData.Action action, float speed) { AnimationState animState = FetchAnimation(action, speed); if (animState == null) { return; } mCachedAnimationState = animState; mAnimSpeed = animState.speed; float fadeLength = action.BlendTime * 0.001f; if (fadeLength == 0) { mCachedAnimation.Play(animState.name); } else { mCachedAnimation.CrossFade(animState.name, fadeLength); } }
public void OnActionChanging(ActData.Action oldAction, ActData.Action newAction) { if (mOwner.Dead) { return; } bool doActionChoose = false; bool hasQueuedStatus = (mQueuedStatusIdx >= 0); if (newAction != null) { doActionChoose = checkStatusChange(newAction.ActionCache); } if (mActionChanging) { return; } if (!doActionChoose) { if (oldAction == null || newAction == null) { // 非正常状态,强制进行选择动作。 doActionChoose = true; mLoopCount = 0; } else if (oldAction.ActionCache == mCurrentActionID) { // 判断当前是否为AI选择的动作。 if (oldAction.DefaultLinkActionID == newAction.Id) { // 循环次数减1 mLoopCount--; if (newAction.Id == ActData.CommonAction.Idle || mLoopCount > 0) { doActionChoose = true; } } else { // 当前Action是被中断的,不需要重新选择。 mLoopCount = 0; } } else { // 非AI选择动作结束,属于被中断的动作流程。 // 继续执行到自循环动作 if (newAction.Id == ActData.CommonAction.Idle) { // 进入AI选择流程。 doActionChoose = true; mLoopCount = 0; } } } // for action choose. if (doActionChoose) { // 如果队列里面有安排好了的AI状态,现在进行切换。 if (hasQueuedStatus) { changeActionStatus(mQueuedStatusIdx); // 清楚队列标志位。 mQueuedStatusIdx = -1; } chooseAction(); } }
bool CheckHit(IActUnit self, IActUnit target) { // 转换offset到世界坐标系 ActionStatus targetActionStatus = target.ActStatus; ActData.Action targetAction = targetActionStatus.ActiveAction; float BoundOffsetX = targetAction.BoundingOffsetX; float BoundOffsetY = targetAction.BoundingOffsetY; float BoundOffsetZ = targetAction.BoundingOffsetZ; MathUtility.Rotate(ref BoundOffsetX, ref BoundOffsetZ, target.Orientation); Vector3 AttackeePos = target.Position + new Vector3( BoundOffsetX, BoundOffsetY, BoundOffsetZ) * 0.01f; bool hitSuccess = false; switch (mAttackDef.FramType) { case ActData.HitDefnitionFramType.CuboidType: case ActData.HitDefnitionFramType.SomatoType: // 四面体求交。 if (MathUtility.RectangleHitDefineCollision( mPos, mOrientation, mCubeHitDefSize, AttackeePos, target.Orientation, targetActionStatus.Bounding)) { hitSuccess = true; } break; case ActData.HitDefnitionFramType.CylinderType: // 圆柱求交 if (MathUtility.CylinderHitDefineCollision( mPos, mOrientation, mCylinderSize.x, mCylinderSize.y, AttackeePos, target.Orientation, targetActionStatus.Bounding)) { hitSuccess = true; } break; case ActData.HitDefnitionFramType.RingType: if (MathUtility.RingHitDefineCollision( mPos, mOrientation, mRingSize.x, mRingSize.y, mRingSize.z, AttackeePos, target.Orientation, targetActionStatus.Bounding)) { hitSuccess = true; } break; case ActData.HitDefnitionFramType.FanType: if (MathUtility.FanDefineCollision( mPos, mOrientation, mFanSize.x, mFanSize.y, mFanSize.z, mFanSize.w, AttackeePos, target.Orientation, targetActionStatus.Bounding)) { hitSuccess = true; } break; } if (hitSuccess) { return(ProcessHit(target)); } return(false); }