我有兩個腳本可以做大部分相同的事情,即呼叫協程,然后慢慢恢復耐力。事情在第二個腳本中,當另一個每秒增加5個時,它會立即將耐力填充到最大值
這沒有任何意義,因為我基本上從第一個腳本部分復制了第二個腳本部分,而第一個腳本完美運行。我不知道為什么
https://pastebin.com/pE1vjisj
有我所有的代碼,但重要的是:
(Not working)
void StopSprinting()
{
isSprinting = false;
moveSpeed = 5;
CallStam();
}
async void CallStam()
{
await Task.Delay(2500);
player.SetStamBool();
}
(Works perfectly)
void Melee()
{
Vector2 attackDetectionPosition = attackDetection.position;
Vector2 attackDirection = attackDetectionPosition movementDirection;
Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackDirection, attackRange, enemyLayers);
foreach (Collider2D enemy in hitEnemies)
{
Debug.Log("We hit " enemy.name);
}
if (player.CurrentStamina > 10)
{
player.CurrentStamina -= 10;
//Deal Damage
player.StamRegen = false;
CallStam();
}
else if (player.CurrentStamina > 0)
{
//Deal half damage
player.StamRegen = false;
CallStam();
}
}
async void CallStam()
{
await Task.Delay(2500);
player.SetStamBool();
}
public void SetStamBool()
{
StamRegen = true;
StartCoroutine(RegenerateStamina());
}
IEnumerator RegenerateStamina()
{
while (StamRegen == true && CurrentStamina < MaxStamina)
{
yield return new WaitForSeconds(1);
CurrentStamina = 5;
}
if (CurrentStamina > MaxStamina)
{
int subtractionAmount = CurrentStamina - MaxStamina;
CurrentStamina -= subtractionAmount;
}
}
抱歉,如果我有一段時間沒有回復
uj5u.com熱心網友回復:
首先:這些都不一樣!在你設定的一頂帽子里作業
player.StamRegen = false;
在另一個中,您忘記了這一點,因此另一個例程可能仍在同時運行。
一般來說,您最終可能會遇到多個并行運行例程!
無論哪種方式,您混入異步呼叫都不好!我寧愿明確地中斷任何正在運行的協程,并簡單地將初始延遲放入例程本身!
在播放器中有
// holds the currently running routine
private Coroutine _currentStaminaRegenaration;
public void RegenerateStamina(float initialDelay)
{
// if there is already a routine running stop it
if(_currentStaminaRegenaration != null)
{
StopCoroutine(_currentStaminaRegenaration);
}
_currentStaminaRegenaration = StartCoroutine(RegenerateStaminaRoutine(initialDelay));
}
IEnumerator RegenerateStaminaRoutine(float initialDelay)
{
// before starting the regeneration first run your initial delay
yield return new WaitForSeconds(initialDelay);
while (CurrentStamina < MaxStamina)
{
yield return new WaitForSeconds(1);
CurrentStamina = 5;
}
// Instead of your complex check and subtraction simply use
CurrentStamina = Mathf.Min(CurrentStamina, MaxStamina);
// never sure if this is needed but just in case reset
_currentStaminaRegenaration = null;
}
現在到處都是
player.StamRegen = false;
CallStam();
你需要做的就是打電話
player.RegenerateStamina(2.5f);
如果2.5f秒在任何地方都是相同的延遲,那么您也可以將其直接編碼到協程本身中,那么您甚至不需要將其作為引數傳遞。
uj5u.com熱心網友回復:
您的問題很可能是該StopSprinting函式被一遍又一遍地呼叫,這使得WaitForSeconds冗余。你需要找到一種只觸發一次協程函式的方法,這是我的建議:
public void SetStamBool()
{
if(!StamRegen){
StamRegen = true;
StartCoroutine(RegenerateStamina());
}
}
Running 顯然應該設定StamRegen為 false 以使此邏輯起作用。
附帶說明一下,您應該知道可以單獨使用布林值作為條件。所以和自己StamRegen == true是一樣StamRegen的。此外,請為所有變數保持相同的大小寫約定,不要將它們與函式名稱或類混合,因此StamRegen應該使用 camelCasestamRegen來匹配您所遵循的變數大小寫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/432335.html
上一篇:每次sceneLoaded完成時,統一SceneManager.sceneLoadedcallBack相互疊加?
下一篇:試圖在碰撞時更改變數
