오브젝트 풀 대상에 FloatingDamageUI를 추가 하는 작업을 진행했다.
처음에 여러 에러가 발생했었다.
스크립트가 Canvas 자식에 있는 Floating Text에 붙어있어서 ObjectPool의 대상이 되지 않았다.
Canvas에 스크립트를 붙이는 걸로 변경했다.
Invoke를 이용해 Release를 사용하고 있었는데, 이게 적용이 되고 있지 않았다.
private void Update()
{
if (_isReleased)
return;
transform.Translate(Vector2.up * _floatingSpeed * Time.deltaTime );
Alpha.a = Mathf.Lerp(Alpha.a, 0, Time.deltaTime * _alphaSpeed);
_txtDamage.color = Alpha;
if (Alpha.a <= 0.01)
{
ReleaseObject();
_isReleased = true;
}
}
Bool 형태의 isRelease 변수를 선언하고, 릴리즈 되었는지 판단하고
Update에서 투명도 알파값이 0.01보다 작아졌을 때 Release하도록 했다.
UIFloatingText를 Start에서 정의를 하고 그 뒤로 지정하지 않아서
가장 최신에 적용한 Damage로 값이 적용되고 있었다.
public void Initialize()
{
_txtDamage = GetComponentInChildren<TextMeshProUGUI>();
Alpha = _txtDamage.color;
Alpha.a = 1;
_txtDamage.text = damage.ToString();
}
public void SetDamage(long value)
{
_isReleased = false;
damage = value;
_txtDamage.text = damage.ToString();
}
Start()에 들어간 내용들을 Initialize()에 옮기고,
SetDamage()가 호출 될 때 데미지 값을 텍스트에 옮겨 적었다.
public void SetDamageFloating(Vector3 position, long Damage)
{
GameObject DamageHUD = Manager.ObjectPool.GetGo("Canvas_FloatingDamage");
DamageHUD.GetComponent<UIFloatingText>().Initialize();
DamageHUD.transform.position = gameObject.transform.position + position;
DamageHUD.GetComponent<UIFloatingText>().SetDamage(Damage);
}
FloatingTextUI를 Pool 할 때 Initialize또한 진행했다.
public void Initialize()
{
for (int i = 0; i < _poolStringArray.Length; i++)
{
IObjectPool<GameObject> pool = new ObjectPool<GameObject>(CreateProjectile, OnGetProjectile, OnReleaseProjectile, OnDestroyProjectile, maxSize: 20);
poolDict.Add(_poolStringArray[i], pool);
for (int j = 0; j < 50; j++)
{
objectName = _poolStringArray[i];
ObjectPoolable poolGo = CreateProjectile().GetComponent<ObjectPoolable>();
poolGo.Poolable.Release(poolGo.gameObject);
}
}
}
추가적으로 Initialize에 미리 오브젝트 풀 할 대상들을 생성해 두었다.
Enemy가 공격 하고 나서 다음 스테이지가 진행되면 공격을 하지 않는 오류가 발생한다.
하나를 추가할 때 마다 오류가 하나씩 나타나는데 에러 내용이 직접적이지 않고 다른 부분에서 계속 터지다 보니 이유를 알기가 쉽지 않아서 에러 고치는데만 꽤나 오래 걸린다.
Invoke가 잘 쓰여지지 않는 이유를 알게 되었다.
Start 대신에 Init()을 사용하는 이유를 알게 되었다.