請原諒凌亂的代碼,所有這些都寫得很倉促,因為我時間緊迫
public class EnemyShoot : MonoBehaviour
{
[SerializeField] Transform player;
public float speed = 100f;
public float angle;
public Quaternion rotation;
bool allowforfire;
[SerializeField] float bulletSpeed, firerate;
private void Update()
{
Vector2 direction = player.position - transform.position;
angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
rotation = Quaternion.AngleAxis(angle, Vector3.forward);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, speed * Time.deltaTime);
if(player.position.x < transform.parent.position.x)
{
transform.localPosition = new Vector2(-0.155f, 0f);
}
else
{
transform.localPosition = new Vector2(0.155f, 0f);
}
}
public IEnumerator Shoot(GameObject bullet)
{
Debug.Log("reached shoot");
yield return new WaitForSeconds(firerate);
var clone = Instantiate(bullet, transform);
var bulletRb = clone.GetComponent<Rigidbody2D>();
bulletRb.velocity = transform.right * bulletSpeed;
Debug.Log("reached fire");
clone.transform.position = new Vector3(clone.transform.position.x, clone.transform.position.y, -1f);
}
}
所以我有這個 IEnumerator,我需要在另一個腳本中呼叫它,所以我包含了腳本中的所有內容。問題是,即使我在統一中得到零錯誤,而且在呼叫時它甚至沒有運行,因為無論我將 debug.log 放在方法中的哪個位置,它都永遠不會到達統一的控制臺(是的,它處于除錯模式)
這是它呼叫的腳本的重要部分:
public int robohealth = 4;
public float speed = 0.2f;
public float minMoveDist = 3f;
public SpriteRenderer roboSprite;
Vector3 oldPos;
public Animator roboAnim;
[SerializeField] Transform target;
public GameObject roboBullet;
public EnemyShoot shootScript;
private void Update()
{
if (target != null)
{
float trueSpeed;
float PositionDelta = Vector2.Distance(transform.position, target.position);
if(PositionDelta < minMoveDist)
{
trueSpeed = 0f;
}
else
{
trueSpeed = speed * Time.deltaTime;
}
transform.position = Vector2.MoveTowards(transform.position, target.position, trueSpeed);
if (oldPos != transform.position)
{
roboAnim.SetBool("ShouldWalk", true);
}
else
{
roboAnim.SetBool("ShouldWalk", false);
//not working ):
shootScript.Shoot(roboBullet);
}
oldPos = transform.position;
}
roboSprite.flipX = transform.position.x > target.position.x;
}
有人知道我哪里出錯了嗎?
uj5u.com熱心網友回復:
要呼叫 a public IEnumerator,不能只將其作為方法呼叫,必須啟動協程
StartCoroutine(Shoot(roboBullet));
有關協程的更多資訊,請參閱此
uj5u.com熱心網友回復:
您的方法Shoot 并沒有真正回傳一個集合,而是一個集合上的迭代器。這就是我們所說的延遲執行。因此,只有在呼叫該迭代器時才會執行代碼Next,這通常是通過使用 some foreach-loop 來實作的。想象一下下面的代碼:
IEnumerable<int> MyMethod()
{
yield return 3;
yield return 5;
yield return 7;
}
現在您正在嘗試呼叫該方法:
var result = MyMethod();
由于該方法被延遲執行(這就是yield-keyword 的用途),因此上述賦值不會回傳所有三個數字,而只是回傳它們的迭代器。除非你像這樣執行迭代器,否則你不能用它做太多事情:
foreach(var number in result)
Console.WriteLine(number);
在您的情況下,我看不出為什么您的方法甚至應該回傳任何東西,因為您沒有以任何方式使用迭代器。所以我建議讓你的方法 avoid并改變這一行
yield return new WaitForSeconds(firerate);
到
WaitForSeconds(firerate);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/471722.html
