繁体   English   中英

WaitForSeconds 立即触发

[英]WaitForSeconds firing immediately

我正在尝试设置一个破折号能力来更新玩家速度,等待一段时间( dashTime ),然后将canDash设置为 false 一段时间( dashCooldown )。

然而, waitForSeconds似乎没有工作,因为canDash bool 在切换回 true 之前只保持 false 的一瞬间。

PlayerAbilities.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerAbilities : MonoBehaviour
{
    // Scripts & Data
    [SerializeField] PlayerController s_PC;
    internal PlayerData pd = new PlayerData();

    private void Awake() {
        pd.canDash = true;
    }

    // Dash
    internal IEnumerator Dash()
    {
        pd.CanDash = false;
        Debug.Log("dash, dash baby");
        // Perform dash and update canDash
        s_PC.rb2d.velocity = s_PC.s_PlayerMovement.moveInput * pd.dashSpeed;
        yield return new WaitForSeconds(pd.dashTime); // Wait set time for dash to happen
        s_PC.UpdateState(PlayerController.State.Normal); // Change state back to normal

        // Cooldown dash
        yield return new WaitForSeconds(pd.dashCooldown); // Cooldown dash

        pd.CanDash = true;
    }
}

播放器控制器.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Scripts & Data
    [SerializeField] internal PlayerAbilities s_PlayerAbilities;
    [SerializeField] internal PlayerInput s_PlayerInput;
    internal PlayerData pd = new PlayerData();

    // Update is called once per frame
    private void FixedUpdate()
    {
        // Check if user has control of player
        if (pd.canControlPlayer)
        {
            // Update player state
            switch (playerState)
            {
                case State.Normal:
                    s_PlayerMovement.Move();
                    break;
                case State.Dash:
                    StartCoroutine(s_PlayerAbilities.Dash());
                    break;
                case State.DodgeRoll:
                    StartCoroutine(s_PlayerAbilities.DodgeRoll());
                    break;
            }
        }
    }
}

玩家数据.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[Serializable]
public class PlayerData
{
    // Dash
    internal float dashSpeed = 50f;
    internal float dashTime = 0.2f;
    internal float dashCooldown = 5f;
    internal bool canDash = true;
    
    internal bool CanDash {
        get { return canDash; }
        set { canDash = value; }
    }
}

播放器输入.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerInput : MonoBehaviour
{
    // Scripts & Data
    [SerializeField] PlayerController s_PC;
    internal PlayerData pd = new PlayerData();

    // Input Actions
    internal PlayerInputActions playerInputActions;

    private void Awake() {
        // Define new player input
        playerInputActions = new PlayerInputActions();
    }

    private void Update()
    {
        // Check if player state is normal
        if (s_PC.playerState == PlayerController.State.Normal)
        {
            // Check for button presses
            if (playerInputActions.Movement.DodgeRoll.triggered)
                s_PC.UpdateState(PlayerController.State.DodgeRoll);
        }

    }
}

代码太复杂了,你只是在某个地方犯了无数简单的错误之一

按照正常调试。

首先改变这个

yield return new WaitForSeconds(pd.dashCooldown); 

对此

Debug.Log("test with number");
yield return new WaitForSeconds(20f);
Debug.Log("tested with number"); 

和 go 从那里。

顺便说一句, FixedUpdate()完全错误。 出于某种原因,您每帧都调用 Dash (和其他人)。 这似乎完全错误。 你会按键按下时调用这种东西。

还:

你可能已经遭受了这个 Gotchya:

https://stackoverflow.com/a/35166004/294884

由于所有奇怪的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM