Unity 2D C# 重新加载进度条无法正常工作
Unity2D C# Reloading progress bar not working propertly
所以我正在制作一款自上而下的坦克射击游戏,我想制作一个比以前更好的装填系统。所以我想到我需要一些进度条之王。我知道怎么做,所以我开始做。问题是它不能正常工作。正如我在上面的 .gif 中所示,第二次拍摄时进度条不会下降。因为我是unity的新手,所以我还不是很了解。所以我来到这里,也许有人可以提供帮助。
编辑:
我刚刚发现了另一个问题,也许是我遇到这个问题的答案。我的脚本第二次尝试重新加载时,我的 "needTimer" bool 为 false,因此当它为 false 时进度条不会下降。新的问题是为什么它变成假而不是真的?
我的重新加载脚本:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class Reload : MonoBehaviour {
public float ammo;
public Image progress;
public bool alreadyReloading;
public bool needTimer;
void Start () {
alreadyReloading = false;
}
IEnumerator needtimertime(){
yield return new WaitForSeconds (6.5f);
needTimer = false;
}
IEnumerator uztaisyt(){
Debug.Log ("REEELOUUUDING!");
yield return new WaitForSeconds(6.5f);
ammo += 1;
alreadyReloading = false;
}
void Update () {
if (needTimer == true) {
timer ("");
}
if (ammo < 5) {
if(alreadyReloading == false){
needTimer = true;
StartCoroutine(uztaisyt());
alreadyReloading = true;
}
}
if (progress.fillAmount <= 0) {
progress.fillAmount = 1.0f;
}
}
void timer(string tipas){
progress.fillAmount -= Time.deltaTime / 6.5f;
StartCoroutine (needtimertime ());
}
}
当您在第一次拍摄后(在动画中)将 uztaisyt() 作为协程启动时,needTimer 设置为true 并且在 next Update() 调用中,needtimertime() 协程将启动。由于 uztaisyt() 和 needtimertime() 都有相同的 6.5 秒等待时间,因此它们 而不是 return 在同一帧更新,因为 needtimertime() 将始终在 uztaisyt() 之后的下一帧开始。并且,由于无法保证 Update() 调用之间的时间间隔,(参见 Time and Frame Managment),此间隔可能超过预期并且 needtimertime () 在 uztaisyt() 之后的帧中 return 可能会在第二次触发后调用 false。
确保 needtimertime() 始终在调用 uztaisyt()[= 后立即启动(如果尚未 运行) 31=](并在同一帧更新中调用),您可以尝试对重新加载脚本进行以下更新,(基本上更改了 Update() 方法并设置了 when/how _isTimerRunning)。
public class Reload : MonoBehaviour {
public float ammo;
public Image progress;
private bool _alreadyReloading;
private bool _isTimerRunning;
void Start () {
_alreadyReloading = false;
_isTimerRunning = false;
}
IEnumerator needtimertime(){
yield return new WaitForSeconds (6.5f);
_needTimer = false;
}
IEnumerator uztaisyt(){
Debug.Log ("REEELOUUUDING!");
yield return new WaitForSeconds(6.5f);
ammo += 1;
_alreadyReloading = false;
}
void Update () {
if (ammo < 5) {
if(_alreadyReloading == false){
StartCoroutine(uztaisyt());
_alreadyReloading = true;
//this will check for and start the progress bar timer in the same udate call
//so both coroutines finish on the same frame update
if(!_isTimerRunning){
_isTimerRunning = true;
timer ("");
}
}
}
if (progress.fillAmount <= 0) {
progress.fillAmount = 1.0f;
}
}
void timer(string tipas){
progress.fillAmount -= Time.deltaTime / 6.5f;
StartCoroutine (needtimertime ());
}
}
我发现了我的问题并解决了它。
问题是 needTimer 变得错误了。所以我找到了它并删除了它。
我的新密码:
using UnityEngine;
使用UnityEngine.UI;
使用 System.Collections;
public class 重新加载:MonoBehaviour {
public float ammo;
public Image progress;
public bool alreadyReloading;
public bool needTimer;
void Start () {
alreadyReloading = false;
needTimer = false;
}
IEnumerator uztaisyt(){
Debug.Log ("REEELOUUUDING!");
yield return new WaitForSeconds(6.5f);
ammo += 1;
alreadyReloading = false;
}
void Update () {
if (ammo < 5.0f) {
if(alreadyReloading == false){
progress.fillAmount = 1.0f;
needTimer = true;
StartCoroutine(uztaisyt());
alreadyReloading = true;
}
if (needTimer == true) {
timer ("");
}
}
}
void timer(string tipas){
progress.fillAmount -= Time.deltaTime / 6.5f;
}
}
所以我正在制作一款自上而下的坦克射击游戏,我想制作一个比以前更好的装填系统。所以我想到我需要一些进度条之王。我知道怎么做,所以我开始做。问题是它不能正常工作。正如我在上面的 .gif 中所示,第二次拍摄时进度条不会下降。因为我是unity的新手,所以我还不是很了解。所以我来到这里,也许有人可以提供帮助。
编辑: 我刚刚发现了另一个问题,也许是我遇到这个问题的答案。我的脚本第二次尝试重新加载时,我的 "needTimer" bool 为 false,因此当它为 false 时进度条不会下降。新的问题是为什么它变成假而不是真的? 我的重新加载脚本:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class Reload : MonoBehaviour {
public float ammo;
public Image progress;
public bool alreadyReloading;
public bool needTimer;
void Start () {
alreadyReloading = false;
}
IEnumerator needtimertime(){
yield return new WaitForSeconds (6.5f);
needTimer = false;
}
IEnumerator uztaisyt(){
Debug.Log ("REEELOUUUDING!");
yield return new WaitForSeconds(6.5f);
ammo += 1;
alreadyReloading = false;
}
void Update () {
if (needTimer == true) {
timer ("");
}
if (ammo < 5) {
if(alreadyReloading == false){
needTimer = true;
StartCoroutine(uztaisyt());
alreadyReloading = true;
}
}
if (progress.fillAmount <= 0) {
progress.fillAmount = 1.0f;
}
}
void timer(string tipas){
progress.fillAmount -= Time.deltaTime / 6.5f;
StartCoroutine (needtimertime ());
}
}
当您在第一次拍摄后(在动画中)将 uztaisyt() 作为协程启动时,needTimer 设置为true 并且在 next Update() 调用中,needtimertime() 协程将启动。由于 uztaisyt() 和 needtimertime() 都有相同的 6.5 秒等待时间,因此它们 而不是 return 在同一帧更新,因为 needtimertime() 将始终在 uztaisyt() 之后的下一帧开始。并且,由于无法保证 Update() 调用之间的时间间隔,(参见 Time and Frame Managment),此间隔可能超过预期并且 needtimertime () 在 uztaisyt() 之后的帧中 return 可能会在第二次触发后调用 false。
确保 needtimertime() 始终在调用 uztaisyt()[= 后立即启动(如果尚未 运行) 31=](并在同一帧更新中调用),您可以尝试对重新加载脚本进行以下更新,(基本上更改了 Update() 方法并设置了 when/how _isTimerRunning)。
public class Reload : MonoBehaviour {
public float ammo;
public Image progress;
private bool _alreadyReloading;
private bool _isTimerRunning;
void Start () {
_alreadyReloading = false;
_isTimerRunning = false;
}
IEnumerator needtimertime(){
yield return new WaitForSeconds (6.5f);
_needTimer = false;
}
IEnumerator uztaisyt(){
Debug.Log ("REEELOUUUDING!");
yield return new WaitForSeconds(6.5f);
ammo += 1;
_alreadyReloading = false;
}
void Update () {
if (ammo < 5) {
if(_alreadyReloading == false){
StartCoroutine(uztaisyt());
_alreadyReloading = true;
//this will check for and start the progress bar timer in the same udate call
//so both coroutines finish on the same frame update
if(!_isTimerRunning){
_isTimerRunning = true;
timer ("");
}
}
}
if (progress.fillAmount <= 0) {
progress.fillAmount = 1.0f;
}
}
void timer(string tipas){
progress.fillAmount -= Time.deltaTime / 6.5f;
StartCoroutine (needtimertime ());
}
}
我发现了我的问题并解决了它。 问题是 needTimer 变得错误了。所以我找到了它并删除了它。
我的新密码:
using UnityEngine;
使用UnityEngine.UI; 使用 System.Collections;
public class 重新加载:MonoBehaviour {
public float ammo;
public Image progress;
public bool alreadyReloading;
public bool needTimer;
void Start () {
alreadyReloading = false;
needTimer = false;
}
IEnumerator uztaisyt(){
Debug.Log ("REEELOUUUDING!");
yield return new WaitForSeconds(6.5f);
ammo += 1;
alreadyReloading = false;
}
void Update () {
if (ammo < 5.0f) {
if(alreadyReloading == false){
progress.fillAmount = 1.0f;
needTimer = true;
StartCoroutine(uztaisyt());
alreadyReloading = true;
}
if (needTimer == true) {
timer ("");
}
}
}
void timer(string tipas){
progress.fillAmount -= Time.deltaTime / 6.5f;
}
}