Esempio n. 1
0
        // Update is called once per frame
        void Update()
        {
            // 存放动作时间减少
            if (!myPhysicsScript.freeze && storedMoveTime > 0)
            {
                storedMoveTime -= Time.deltaTime;
            }
            if (storedMoveTime < 0)
            {
                storedMoveTime = 0;
                storedMove     = null;
            }
            // 执行存放动作
            if ((currentMove == null || currentMove.cancelable) && storedMove != null && !myPhysicsScript.freeze)
            {
                if (currentMove != null)
                {
                    KillCurrentMove();
                }
                //if (System.Array.IndexOf(storedMove.possibleStates, currentState) != -1) currentMove = storedMove;
                storedMove = null;
                return;
            }

            foreach (AnimationState animState in character.GetComponent <Animation>())
            {
                if (character.GetComponent <Animation>().IsPlaying(animState.name))
                {
                    Debug.Log("IsPlaying: " + animState.name);
                }
            }

            // 执行存放动作
            if ((currentMove == null || currentMove.cancelable) && storedMove != null && !myPhysicsScript.freeze)
            {
                if (currentMove != null)
                {
                    KillCurrentMove();
                }
                if (System.Array.IndexOf(storedMove.possibleStates, currentState) != -1)
                {
                    currentMove = storedMove;
                }
                storedMove = null;
                return;
            }
            // 执行默认idle动作
            if (!myPhysicsScript.freeze && myPhysicsScript.isGrounded() && isAxisRested() && !character.GetComponent <Animation>().IsPlaying("idle"))
            {
                Debug.Log(character.GetComponent <Animation>().GetClipCount());

                bool playIdle = true;
                foreach (AnimationState animState in character.GetComponent <Animation>())
                {
                    if (animState.name != "idle" &&
                        animState.name != "moveForward" &&
                        animState.name != "moveBack" &&
                        animState.name != "run" &&
                        animState.name != "crouching" &&
                        animState.name != "blockingLowPose" &&
                        character.GetComponent <Animation>().IsPlaying(animState.name))
                    {
                        playIdle = false;
                    }
                }
                if (playIdle)
                {
                    myMoveSetScript.playBasicMove(myMoveSetScript.basicMoves.idle);
                    currentState = PossibleStates.Stand;
                    //if (GlobalScript.prefs.blockOptions.blockType == BlockType.AutoBlock) potentialBlock = true;
                }
            }

            bool hasAxisKeyDown = false;

            foreach (InputReferences inputRef in inputReferences)
            {
                // 清空方向键 按下时间heldDown
                if (inputRef.inputType != InputType.Button && inputRef.heldDown > 0 && Input.GetAxisRaw(inputRef.inputButtonName) == 0)
                {
                    if (inputRef.heldDown >= myInfo.chargeTiming)
                    {
                        storedMove = myMoveSetScript.getMove(new ButtonPress[] { inputRef.engineRelatedButton }, inputRef.heldDown, currentMove, true);
                    }
                    inputRef.heldDown = 0;
                    if (inputRef.inputType == InputType.Left)
                    {
                        leftHeldTime = 0;
                    }
                    else if (inputRef.inputType == InputType.Right)
                    {
                        rightHeldTime = 0;
                    }
                    else if (inputRef.inputType == InputType.Up)
                    {
                        upHeldTime = 0;
                    }
                    else if (inputRef.inputType == InputType.Down)
                    {
                        downHeldTime = 0;
                    }

                    if ((currentMove == null || currentMove.cancelable) && storedMove != null)
                    {
                        currentMove = storedMove;
                        storedMove  = null;
                        return;
                    }
                    else if (storedMove != null)
                    {
                        storedMoveTime = UFE.config.storedExecutionDelay;
                        return;
                    }
                }

                if (Input.GetButtonUp(inputRef.inputButtonName))
                {
                    if (inputRef.heldDown >= myInfo.chargeTiming)
                    {
                        storedMove = myMoveSetScript.getMove(new ButtonPress[] { inputRef.engineRelatedButton }, inputRef.heldDown, currentMove, true);
                    }
                    inputRef.heldDown = 0;
                    if ((currentMove == null || currentMove.cancelable) && storedMove != null)
                    {
                        currentMove = storedMove;
                        storedMove  = null;
                        return;
                    }
                    else if (storedMove != null)
                    {
                        storedMoveTime = UFE.config.storedExecutionDelay;
                        return;
                    }
                }

                // 方向键按下
                if (inputRef.inputType != InputType.Button && Input.GetAxisRaw(inputRef.inputButtonName) != 0)
                {
                    hasAxisKeyDown = true;
                    bool axisPressed = false;
                    moveDirection = Vector2.zero;


                    if (inputRef.inputType == InputType.Left)
                    {
                        inputRef.engineRelatedButton = ButtonPress.Left;
                        moveDirection.x = -1;
                        leftHeldTime    = inputRef.heldDown;
                    }
                    else if (inputRef.inputType == InputType.Right)
                    {
                        inputRef.engineRelatedButton = ButtonPress.Right;
                        moveDirection.x = 1;
                        rightHeldTime   = inputRef.heldDown;
                    }
                    else if (inputRef.inputType == InputType.Up)
                    {
                        inputRef.engineRelatedButton = ButtonPress.Up;
                        moveDirection.y = 1;
                        upHeldTime      = inputRef.heldDown;
                    }
                    else if (inputRef.inputType == InputType.Down)
                    {
                        inputRef.engineRelatedButton = ButtonPress.Down;
                        moveDirection.y = -1;
                        downHeldTime    = inputRef.heldDown;
                    }

                    if (inputRef.heldDown == 0)
                    {
                        axisPressed = true;
                    }
                    inputRef.heldDown += Time.deltaTime;

                    // 第一次(或执行动作之后)按下方向键
                    if (axisPressed)
                    {
                        storedMove = myMoveSetScript.getMove(new ButtonPress[] { inputRef.engineRelatedButton }, 0, currentMove, false);
                        if ((currentMove == null || currentMove.cancelable) && storedMove != null)
                        {
                            currentMove = storedMove;
                            storedMove  = null;
                            return;
                        }
                        else if (storedMove != null)
                        {
                            storedMoveTime = UFE.config.storedExecutionDelay;
                            return;
                        }
                    }
                }// END 方向键

                // 按钮判断
                if (inputRef.inputType == InputType.Button && !UFE.config.lockInputs)
                {
                    if (Input.GetButton(inputRef.inputButtonName))
                    {
                        // 多个按钮同时按下
                    }

                    // 单个按钮按下时可能执行的动作
                    if (Input.GetButtonDown(inputRef.inputButtonName))
                    {
                        storedMove = myMoveSetScript.getMove(new ButtonPress[] { inputRef.engineRelatedButton }, 0, currentMove, false);
                        if ((currentMove == null || currentMove.cancelable) && storedMove != null)
                        {
                            currentMove = storedMove;
                            storedMove  = null;
                            return;
                        }
                        else if (storedMove != null)
                        {
                            storedMoveTime = UFE.config.storedExecutionDelay;
                            return;
                        }
                        // 跳跃键按下
                        if (inputRef.engineRelatedButton == ButtonPress.Jump)
                        {
                            if (currentMove == null)
                            {
                                if (myPhysicsScript.isGrounded())
                                {
                                    myPhysicsScript.jump();
                                }
                                if (inputRef.heldDown == 0)
                                {
                                    if (!myPhysicsScript.isGrounded() && myInfo.physics.multiJumps > 1)
                                    {
                                        myPhysicsScript.jump();
                                    }
                                }
                            }
                        }
                    }
                    // 执行只有当按钮弹起才执行的动作
                    if (Input.GetButtonUp(inputRef.inputButtonName))
                    {
                        storedMove = myMoveSetScript.getMove(new ButtonPress[] { inputRef.engineRelatedButton }, 0, currentMove, true);
                        if ((currentMove == null || currentMove.cancelable) && storedMove != null)
                        {
                            currentMove = storedMove;
                            storedMove  = null;
                        }
                        else if (storedMove != null)
                        {
                            storedMoveTime = UFE.config.storedExecutionDelay;
                            return;
                        }
                    }
                }
            }// END 按键列表循环


            SetMovementForce();

            if (!hasAxisKeyDown)
            {
                //readyToRun = PreRunDirection.None;
                isRun = false;
            }
        }
Esempio n. 2
0
        public void applyForces(MoveInfo move)
        {
            if (xForce != 0)
            {
                transform.Translate(xForce * Time.deltaTime, 0, 0);
            }
            if (zForce != 0)
            {
                transform.Translate(0, 0, zForce * Time.deltaTime);
            }
            if (faceDirection > 0)
            {
                character.transform.localScale = new Vector3(1, 1, 1f);
            }
            else if (faceDirection < 0)
            {
                character.transform.localScale = new Vector3(1, 1, -1f);
            }

            if (move == null || (move != null && !move.ignoreGravity))
            {
                if ((yForce < 0 && !isGrounded()) || yForce > 0)
                {
                    yForce -= appliedGravity * Time.deltaTime;
                    transform.Translate(faceDirection * myControlsScript.myInfo.physics.jumpForwardSpeed * Time.deltaTime, yForce * Time.deltaTime, 0);
                }
                else if (yForce < 0 && isGrounded())
                {
                    currentAirJumps = 0;
                    yForce          = 0;
                }
            }

            if (isGrounded())
            {
                if (verticalTotalForce != 0)
                {
                    if (bounceTimes < UFE.config.bounceOptions.maximumBounces && myControlsScript.stunned &&
                        UFE.config.bounceOptions.bounceForce != Sizes.None &&
                        yForce <= -UFE.config.bounceOptions.minimumBounceForce)
                    {
                        if (!UFE.config.bounceOptions.bounceHitBoxes)
                        {
                            myHitBoxesScript.hideHitBoxes();
                        }
                        if (UFE.config.bounceOptions.bounceForce == Sizes.Small)
                        {
                            addForce(new Vector2(0, -yForce / 2.4f), 1);
                        }
                        else if (UFE.config.bounceOptions.bounceForce == Sizes.Medium)
                        {
                            addForce(new Vector2(0, -yForce / 1.8f), 1);
                        }
                        else if (UFE.config.bounceOptions.bounceForce == Sizes.High)
                        {
                            addForce(new Vector2(0, -yForce / 1.2f), 1);
                        }
                        bounceTimes++;
                        if (!isBouncing)
                        {
                            myControlsScript.stunTime += airTime + UFE.config.knockDownOptions.knockedOutTime;
                            myMoveSetScript.playBasicMove(myMoveSetScript.basicMoves.bounce);
                            if (UFE.config.bounceOptions.bouncePrefab != null)
                            {
                                GameObject pTemp = (GameObject)Instantiate(UFE.config.bounceOptions.bouncePrefab);
                                pTemp.transform.parent        = transform;
                                pTemp.transform.localPosition = Vector3.zero;
                                Destroy(pTemp, 3);
                            }
                            isBouncing = true;
                        }
                        return;
                    }

                    verticalTotalForce            = 0;
                    airTime                       = 0;
                    myMoveSetScript.totalAirMoves = 0;
                    BasicMoveInfo airAnimation = null;
                    if (myControlsScript.stunned)
                    {
                        myControlsScript.stunTime = UFE.config.knockDownOptions.knockedOutTime + UFE.config.knockDownOptions.getUpTime;
                        airAnimation = myMoveSetScript.basicMoves.fallDown;
                        myControlsScript.currentState = PossibleStates.FallDown;
                        if (!UFE.config.knockDownOptions.knockedOutHitBoxes)
                        {
                            myHitBoxesScript.hideHitBoxes();
                        }
                    }
                    else
                    {
                        if ((myControlsScript.currentMove != null && myControlsScript.currentMove.cancelMoveWheLanding) ||
                            myControlsScript.currentMove == null)
                        {
                            airAnimation = myMoveSetScript.basicMoves.landing;
                            myControlsScript.KillCurrentMove();
                        }
                        if (myControlsScript.isRun)
                        {
                            myControlsScript.currentState = PossibleStates.Run;
                        }
                        else
                        {
                            myControlsScript.currentState = PossibleStates.Stand;
                        }
                    }
                    isBouncing  = false;
                    bounceTimes = 0;
                    if (airAnimation != null && !character.GetComponent <Animation>().IsPlaying(airAnimation.name))
                    {
                        myMoveSetScript.playBasicMove(airAnimation);
                    }
                }

                if (!myControlsScript.stunned && move == null)
                {
                    if (xForce == walkSpeed || xForce == -walkSpeed || zForce == walkSpeed || zForce == -walkSpeed)
                    {
                        myMoveSetScript.playBasicMove(myMoveSetScript.basicMoves.moveForward);
                    }
                    else if (xForce == runSpeed || xForce == -runSpeed || zForce == runSpeed || zForce == -runSpeed)
                    {
                        myMoveSetScript.playBasicMove(myMoveSetScript.basicMoves.run);
                    }
                }
            }
            else if (yForce > 0 || !isGrounded())
            {
                if (move != null && myControlsScript.currentState == PossibleStates.Stand)
                {
                    myControlsScript.currentState = PossibleStates.Jump;
                }
                if (move == null && yForce / verticalTotalForce > 0 && yForce / verticalTotalForce <= 1)
                {
                    if (isBouncing)
                    {
                        return;
                    }
                    BasicMoveInfo airAnimation = myControlsScript.stunned ?
                                                 myMoveSetScript.basicMoves.getHitAir : myMoveSetScript.basicMoves.jumping;

                    if (xForce == 0)
                    {
                        myControlsScript.currentState = PossibleStates.Jump;
                    }
                    else
                    {
                        if (xForce > 0)
                        {
                            myControlsScript.currentState = PossibleStates.Jump;
                        }

                        if (xForce < 0)
                        {
                            myControlsScript.currentState = PossibleStates.Jump;
                        }
                    }

                    if (!character.GetComponent <Animation>().IsPlaying(airAnimation.name))
                    {
                        //character.animation[airAnimation].speed = character.animation[airAnimation].length * (appliedGravity/verticalTotalForce);
                        character.GetComponent <Animation>()[airAnimation.name].speed = character.GetComponent <Animation>()[airAnimation.name].length / airTime;
                        myMoveSetScript.playBasicMove(airAnimation);
                    }
                }
                else if (move == null && yForce / verticalTotalForce <= 0)
                {
                    BasicMoveInfo airAnimation;
                    if (isBouncing)
                    {
                        airAnimation = myMoveSetScript.basicMoves.fallingFromBounce;
                    }
                    else
                    {
                        airAnimation = myControlsScript.stunned ?
                                       myMoveSetScript.basicMoves.getHitAir : myMoveSetScript.basicMoves.falling;
                    }

                    if (!character.GetComponent <Animation>().IsPlaying(airAnimation.name))
                    {
                        //character.animation[airAnimation].speed = character.animation[airAnimation].length * (appliedGravity/verticalTotalForce);
                        //character.animation.CrossFade(airAnimation, GlobalScript.getCurrentMoveSet(myControlsScript.myInfo).interpolationSpeed);
                        character.GetComponent <Animation>()[airAnimation.name].speed = character.GetComponent <Animation>()[airAnimation.name].length / airTime;
                        myMoveSetScript.playBasicMove(airAnimation);
                    }
                }
            }
            // if (xForce == 0 && yForce == 0 && zForce == 0)
            faceDirection = 0;
        }