Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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();
            }
        }
Ejemplo n.º 5
0
        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);
        }