Unity)第二次invokerepeating不想触发

时间:2019-11-24 10:44:03

标签: c# unity3d

我有两个需要触发的invokeRepeating。我有两个布尔值,它们决定需要触发哪个invokeRepeating。 当两个布尔中的至少一个设置为true时,需要触发第一个invokeRepeating, 并且当两个布尔值都设置为false时,总是需要触发第二个invokeRepeating。

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

public class movingCharacter : MonoBehaviour {
public Rigidbody rb;
public float movingSpeed = 200;
public int maxSpeed = 3000;
public bool forwardBackMoving, sideMoving;
// Start is called before the first frame update
void Start()
{
    rb = GetComponent<Rigidbody>();
    forwardBackMoving = true;
    sideMoving = true;
    if ((forwardBackMoving == true || sideMoving == true)&&movingSpeed<maxSpeed)
    {
        InvokeRepeating("increaseSpeed", 5.0f, 5.0f);
    }
    else if(forwardBackMoving==false&&sideMoving==false)
    {
        CancelInvoke();
        InvokeRepeating("decreaseSpeed", 1.0f, 5.0f);
    }
}
public void keyUpEvent()
{
    if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.S))
    {
        forwardBackMoving = false;
    }else if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D))
    {
        sideMoving = false;
    }
}

public void increaseSpeed() {
    movingSpeed = movingSpeed * 1.1f;
    Debug.Log("Increased");
}
public void decreaseSpeed()
{
    movingSpeed = movingSpeed * 0.9f;
    Debug.Log("Decreased");
}
// Update is called once per 

public void FixedUpdate()
{
    if (Input.GetKeyDown(KeyCode.W))
    {
        rb.AddForce(transform.forward * movingSpeed);
        forwardBackMoving = true;
    }
    if (Input.GetKeyDown(KeyCode.A))
    {
        rb.AddForce(transform.right * -movingSpeed);
        sideMoving = true;
    }
    if (Input.GetKeyDown(KeyCode.S))
    {
        rb.AddForce(transform.forward * -movingSpeed);
         forwardBackMoving= true;
    }
    if (Input.GetKeyDown(KeyCode.D))
    {
        rb.AddForce(transform.right * movingSpeed);
        sideMoving = true;
    }
    keyUpEvent();
    Debug.Log(Time.deltaTime);
   /* if ((forwardBackMoving == true || sideMoving == true) && movingSpeed < maxSpeed)
    {
        //while(Time.fixedDeltaTime)
    }
    else if (forwardBackMoving == false && sideMoving == false)
    {

        //InvokeRepeating("decreaseSpeed", 1.0f, 5.0f);
    }*/
}

 }

在这段代码中,即使布尔值更改为false,第二个invokeRepeating也永远不会触发。

1 个答案:

答案 0 :(得分:0)

好吧,您在那里有一个if-else if块,因此一次只能执行两个块中的一个

正如所说的,Start仅被称为一次,因此应该如何达到另一个障碍?

您想要做的是CancelInvokeInvokeRepeating 每次值都会发生变化。我实际上会为此使用Properties

public class movingCharacter : MonoBehaviour 
{
    [Header("References")]
    public Rigidbody rb;

    [Header("Settings")]
    public float movingSpeed = 200;
    public int maxSpeed = 3000;

    [Header("Debug")]
    [SerializeField] private bool _forwardBackMoving;
    [SerializeField] private bool _sideMoving;

    // Now make properties. When setting a new value run your checks
    public bool forwardBackMoving
    {
        get => _forwardBackMoving;
        set
        {
            // do nothing if the value hasn't changed
            if(_forwardBackMoving == value) return;

            // otherwise apply the new value and run the check
            _forwardBackMoving = value; 
            CheckMovement();
        }
    }

    // The same fot he other flag
    public bool sideMoving
    {
        get => _sideMoving;
        set
        {
            // do nothing if the value hasn't changed
            if(_sideMoving == value) return;

            // otherwise apply the new value and run the check
            _sideMoving = value;
            CheckMovement();
        }
    }

    private void CheckMovement()
    {
        if ((forwardBackMoving || sideMoving) && movingSpeed < maxSpeed)
        {
            CancelInvoke();
            InvokeRepeating(nameof(increaseSpeed), 5.0f, 5.0f);
        }
        else if(!forwardBackMoving && !sideMoving)
        {
            CancelInvoke();
            InvokeRepeating(nameof(decreaseSpeed), 1.0f, 5.0f);
        }
    }

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        forwardBackMoving = true;
        sideMoving = true;
    }

    private void keyUpEvent()
    {
        if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.S))
        {
            forwardBackMoving = false;
        }
        else if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D))
        {
            sideMoving = false;
        }
    }

    private void increaseSpeed() 
    {
        movingSpeed = movingSpeed * 1.1f;
        Debug.Log("Increased");
    }

    private void decreaseSpeed()
    {
        movingSpeed = movingSpeed * 0.9f;
        Debug.Log("Decreased");
    }

    // You should get Input only in the Update method!
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            rb.AddForce(transform.forward * movingSpeed);
            forwardBackMoving = true;
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            rb.AddForce(transform.right * -movingSpeed);
            sideMoving = true;
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            rb.AddForce(transform.forward * -movingSpeed);
             forwardBackMoving= true;
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            rb.AddForce(transform.right * movingSpeed);
            sideMoving = true;
        }
        keyUpEvent();
        // Avoid Debug.Log on a per frame basis! It is quite expensive!
        Debug.Log(Time.deltaTime);
    }
}