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