我有两个需要触发的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也永远不会触发。
答案 0 :(得分:0)
好吧,您在那里有一个if
-else if
块,因此一次只能执行两个块中的一个。
正如所说的,Start
仅被称为一次,因此应该如何达到另一个障碍?
您想要做的是CancelInvoke
和InvokeRepeating
每次值都会发生变化。我实际上会为此使用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);
}
}