所以我正在制作一个自上而下的坦克射击游戏,我想制作一个比以前更好的重装系统。所以我认为我需要一些进步之王。我知道如何制作它所以我开始这样做。问题是它没有正常工作。正如我在上面的.gif中所示,当您第二次拍摄时,进度条不会下降。因为我是团结的新手,所以我仍然不太了解一切。所以我来到这里,也许有人可以提供帮助。
编辑: 我刚发现另一个问题,也许是为什么我有这个问题的答案。我的脚本第二次尝试重新加载,我的#34; needTimer" bool是假的,因此进度条在它错误时不会下降。新的问题是为什么它变得虚假而不是真实? 我的重装脚本:
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 ());
}
}
答案 0 :(得分:0)
第一次拍摄(动画中)后,当您启动 uztaisyt()作为协程时, needTimer 设置为true并且在下一步 更新()调用, needtimertime()协程将启动。由于 uztaisyt()和 needtimertime()都有相同的6.5秒等待,因此不都会返回相同的帧更新,因为 needtimertime()将始终在 uztaisyt()之后的下一帧中启动。并且,由于无法保证 Update()调用之间的时间间隔(请参阅Time and Frame Managment),因此此间隔可能超出预期且 needtimertime()在第二次触发后调用 uztaisyt()后,可以在帧中返回false。
确保在调用 uztaisyt()后立即启动 needtimertime()(如果尚未运行)(并在同一帧更新中调用) ,您可以尝试以下更新到Reload脚本,(基本上更改为Update()方法以及何时设置/如何设置_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 ());
}
}
答案 1 :(得分:0)
我发现了我的问题并修复了它。 问题是 needTimer 变得虚假。所以我找到了并删除了它。
我的新代码:
using UnityEngine;
使用UnityEngine.UI; 使用System.Collections;
公共课重新加载: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;
}
}