如何修复 IEnumerator WaitForSeconds 在 Unity C# 中不工作
How to fix IEnumerator WaitForSeconds not Working in Unity C#
我正在为我的 PlayerController 创建一个重新加载脚本。我正在遵循 Brackey 的指南:https://www.youtube.com/watch?v=kAx5g9V5bcM。他的方法使用 IEnumerators 和 WaitForSeconds 来增加重新加载时间。基本上,我在 yield 之前记录 "reloading",在 yield 之后记录 "reloaded"。但是,我同时得到 "reloading" 和 "reloaded"。
我试过增加重新加载时间,以防时间太短,但没有任何效果。
这是我的 class 的内部。我没有收到任何错误。
public float speed;
private Rigidbody2D rb;
private Vector2 moveVelocity;
public GameObject bullet;
public GameObject shootPoint;
//public float ammo = 6;
//[HideInInspector] public bool reloading = false;
//[SerializeField] private float reloadTime = 3;
//private float reloadState;
public int maxAmmo = 10;
private int currentAmmo;
public float reloadTime = 100f;
private bool isReloading = false;
public float health = 50f;
void Start()
{
rb = GetComponent<Rigidbody2D>();
health = 50;
currentAmmo = maxAmmo;
}
void Update()
{
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
moveVelocity = moveInput * speed;
if (isReloading) {
return;
}
if (currentAmmo <= 0) {
StartCoroutine(Reload());
return;
}
if (Input.GetButtonUp("Shoot")) {
Instantiate(bullet, shootPoint.transform.position, Quaternion.identity);
currentAmmo--;
}
}
void FixedUpdate()
{
rb.MovePosition(rb.position + moveVelocity * Time.fixedDeltaTime);
}
void OnTriggerEnter2D(Collider2D other) {
if(other.gameObject.tag == "Bullet") {
health--;
//Debug.Log("Player 1 Health: " + health);
Destroy(other.gameObject);
}
}
IEnumerator Reload()
{
Debug.Log("reloading");
isReloading = true;
yield return new WaitForSeconds(reloadTime);
currentAmmo = maxAmmo;
isReloading = false;
Debug.Log("reloaded");
}
正如我所说,我没有收到任何错误。我以为我一秒钟都不能开枪,但我能开枪,而且装弹不花一秒钟。
您已声明
public float reloadTime = 100f;
一个 public
字段被 Unity Inspector 自动序列化 ("stored")。
我的猜测是,一开始你是这样声明的
public float reloadTime;
因此 Unity Inspector 将其存储为默认值 0
。后来您尝试从脚本中增加该值。
以后在脚本中对初始值所做的任何更改都不会产生任何效果。 Unity Inspector 将始终用序列化的值覆盖该值。
从现在开始,为了更改您的值,您必须始终要么使用检查器进行设置,要么不序列化该字段(例如,将其设置为 private
),要么将其设置在 Awake
或 Start
方法再次覆盖 Inspector 值。
我正在为我的 PlayerController 创建一个重新加载脚本。我正在遵循 Brackey 的指南:https://www.youtube.com/watch?v=kAx5g9V5bcM。他的方法使用 IEnumerators 和 WaitForSeconds 来增加重新加载时间。基本上,我在 yield 之前记录 "reloading",在 yield 之后记录 "reloaded"。但是,我同时得到 "reloading" 和 "reloaded"。
我试过增加重新加载时间,以防时间太短,但没有任何效果。
这是我的 class 的内部。我没有收到任何错误。
public float speed;
private Rigidbody2D rb;
private Vector2 moveVelocity;
public GameObject bullet;
public GameObject shootPoint;
//public float ammo = 6;
//[HideInInspector] public bool reloading = false;
//[SerializeField] private float reloadTime = 3;
//private float reloadState;
public int maxAmmo = 10;
private int currentAmmo;
public float reloadTime = 100f;
private bool isReloading = false;
public float health = 50f;
void Start()
{
rb = GetComponent<Rigidbody2D>();
health = 50;
currentAmmo = maxAmmo;
}
void Update()
{
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
moveVelocity = moveInput * speed;
if (isReloading) {
return;
}
if (currentAmmo <= 0) {
StartCoroutine(Reload());
return;
}
if (Input.GetButtonUp("Shoot")) {
Instantiate(bullet, shootPoint.transform.position, Quaternion.identity);
currentAmmo--;
}
}
void FixedUpdate()
{
rb.MovePosition(rb.position + moveVelocity * Time.fixedDeltaTime);
}
void OnTriggerEnter2D(Collider2D other) {
if(other.gameObject.tag == "Bullet") {
health--;
//Debug.Log("Player 1 Health: " + health);
Destroy(other.gameObject);
}
}
IEnumerator Reload()
{
Debug.Log("reloading");
isReloading = true;
yield return new WaitForSeconds(reloadTime);
currentAmmo = maxAmmo;
isReloading = false;
Debug.Log("reloaded");
}
正如我所说,我没有收到任何错误。我以为我一秒钟都不能开枪,但我能开枪,而且装弹不花一秒钟。
您已声明
public float reloadTime = 100f;
一个 public
字段被 Unity Inspector 自动序列化 ("stored")。
我的猜测是,一开始你是这样声明的
public float reloadTime;
因此 Unity Inspector 将其存储为默认值 0
。后来您尝试从脚本中增加该值。
以后在脚本中对初始值所做的任何更改都不会产生任何效果。 Unity Inspector 将始终用序列化的值覆盖该值。
从现在开始,为了更改您的值,您必须始终要么使用检查器进行设置,要么不序列化该字段(例如,将其设置为 private
),要么将其设置在 Awake
或 Start
方法再次覆盖 Inspector 值。