public class W_02_Bow : WeaponDefault
{
public override int Attack(int attackMove)
{`enter code here`
StartCoroutine(ChargeAttack(attackMove));
return attackMove;
}
private IEnumerator ChargeAttack(int attackMove)
{
float chargeTime = 0f;
while (chargeTime <= 5f && Input.GetMouseButton(0))
{
Debug.Log("Charging...");
chargeTime = Time.deltaTime;
yield return null;
}
if (chargeTime >= 5f)
Debug.Log("Charged!");
chargeTime = 0;
yield return new WaitUntil(() => Input.GetMouseButtonUp(0));
attackMove = attackMove % 3 1;
}
}
撰寫此代碼是為了實作充電攻擊。
但是我不知道如何使函式在協程完成之前不回傳回傳值。
在代碼結構中,函式必須回傳一個 int 型別。
我也使用了抽象,這是我試圖實施充電攻擊的唯一腳本。
下面是觸發 Attack 的代碼,Attack 下的所有動作在 Attack 回傳值之前都不能執行。
public void Attack()
{
if (Input.GetMouseButton(0) && isLand)
{
if (IsCanAct((int)weaponType 5) && !isAttack)
{
isAttack = true;
playerNowStamina -= (int)weaponType 5;
playerAnim.SetInteger(_triggerNum, (int)AnimState.Attack);
attackMove = weapons[(int)weaponState].GetComponent<WeaponDefault>().Attack(attackMove);
playerAnim.SetInteger(_action, attackMove);
playerAnim.SetTrigger(_trigger, () =>
{
isAttack = false;
Variables.Instance?.WeaponVfx?[0]?.gameObject.SetActive(false);
}, (float)weaponType * 0.2f 0.6f
);
}
}
}
uj5u.com熱心網友回復:
我認為你可以使用Action來實作你想要的,這是 action 的定義:
封裝具有單個引數且不回傳值的方法。
基本上,您將一個函式傳遞給您的協程并在協程完成時呼叫它。
首先,使 Attack 回傳型別為 void 并定義一個 Action 型別的輸入。將一個動作傳遞給您的協程,并在協程結束時使用 attackMove 呼叫它。(我添加了 StartOfAttack 和 EndOfAttack 方法來演示。將它們替換為呼叫 Attack 的方法和想要結果的方法)
public void StartOfAttack()
{
Attack(0, EndOfAttack);
}
public void EndOfAttack(int attackMove)
{
print(attackMove);
}
public void Attack(int attackMove, Action<int> callback)
{
StartCoroutine(ChargeAttack(attackMove, callback));
}
private IEnumerator ChargeAttack(int attackMove, Action<int> callback)
{
float chargeTime = 0f;
while (chargeTime <= 5f && Input.GetMouseButton(0))
{
Debug.Log("Charging...");
chargeTime = Time.deltaTime;
yield return null;
}
if (chargeTime >= 5f)
Debug.Log("Charged!");
chargeTime = 0;
yield return new WaitUntil(() => Input.GetMouseButtonUp(0));
attackMove = attackMove % 3 1;
callback.Invoke(attackMove);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/515716.html
標籤:C#unity3d
上一篇:不可為空的欄位必須包含非空值