오늘도 많은것들을 수정 구현했다..
기능을 구현하는것 자체는 이제 점점 어렵지 않게 느껴진다. 다만 아직 어렵게 느껴지는건 개발을 편하게 하기 위해(또는 프로젝트를 최적화 하기 위해) 만드는 enum, Scriptable Object, ObjectPoolManager 등을 구현한 함수에 적용시키는것.
어렵더라도 여러가지를 적용해보면서 시야가 넓어진게 느껴진다. 앞으론 이런 최적화용 스크립트들을 더 적극 반영해야겠다.
배운것
코루틴(Coroutine)
기존에 적 패턴을 만들때 Update에서 사용을 해서 프레임별로 계속 공격을 할수 있는지 몇발을 쏴야하는지를 체크시켰는데,
리팩토링 과정에서 팀원(사실상 팀장)님에게 아주유용한 키워드를 배웠다. 그것이 코루틴이다.
private void FireArc(int fireamount) // 호를 그리면서 사격
{
isCooldown = true;
num = 0;
projectileSpeed = 2f;
GameObject bullet = ObjectPoolManager.Instance.GetObject(ObjectType.EnemyProjectile);
Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
bullet.transform.position = transform.position;
bullet.transform.rotation = Quaternion.identity;
Vector2 dirVec = new Vector2(Mathf.Cos(Mathf.PI * 5 * num / fireamount), -1);
rb.velocity = dirVec.normalized * projectileSpeed;
num++;
if (num < fireamount)
Invoke("FireArc", 5f);
else
{
Reloading();
projectileSpeed = 5f;
}
}
기존에 이렇게 메소드를 만들고 리로딩 함수로 사격을 멈추면서 업데이트에서 이 메소드를 호출해 사용했으나, 이렇게 반복하고 멈추는 과정을 전부 코루틴으로 대체할수있었다.
private IEnumerator CoFireArc()
{
while (true)
{
while (num < 50)
{
Vector2 dirVec = new Vector2(Mathf.Cos(Mathf.PI * 5 * num / 50), -1);
SpawnBullet(ObjectType.Enemy, enemyProjectile, Vector3.zero, dirVec);
num++;
yield return YieldCache.WaitForSeconds(0.1f); // 각 발사 사이에 딜레이
}
yield return YieldCache.WaitForSeconds(5f);
num = 0;
}
}