
오늘도 회의 때 정했던 기능들을 구현했다.
쿠키런에 아이템 중 거대화 할 수 있는 아이템이 있다.
그런 느낌을 주려고 쿠키의 스프라이트를 늘려주는 느낌으로 구현했다.
IEnumerator GiantCoroutine(float maxScale, float giantPeriod,
float giantDuration, float resetPeriod)
{
// 처음 크기 저장
Vector3 startScale = transform.localScale;
// 다 커졌을때 크기
Vector3 endScale = new Vector3(maxScale, maxScale, 1f);
// 점점 커질수 있게 만들려고 time 선언 후 giantPeriod 보다 작을때 반복
float time = 0f;
while(time < giantPeriod)
{
transform.localScale = Vector3.Lerp(startScale, endScale, 0.5f);
// time 갱신
time += Time.deltaTime;
yield return null;
}
-------------- 아래도 비슷한데 줄어들게 해줌------------------
}
코루틴을 사용하여 일정 시간동안 커졌다가 다시 줄어들게 구현하였다.
발생한 문제
lerp를 사용해서 자연스럽게 커지는 모습을 기대하며 작성을 하였는데,
내가 생각했던대로 안되고 엄청 빨리 커졌다....ㄷㄷ
해결
lerp의 보간 비율 설정을 다음과 같이 해줘서 보간 비율이 변하도록 해주었다.
transform.localScale = Vector3.Lerp(startScale, endScale, time / giantPeriod);

자연스럽게 커질 수 있게 됬다 ㅠㅜ
거대화 아이템과 부스터 아이템은 먹었을때 무적효과도 주지만 장애물도 파괴가 가능해야된다.
그래서 그 부분을 한번 해보고 싶어서 한번 구현해보았다.
우선 맵이 기본적으로 타일맵 기반이기 때문에 생각보다 오랜시간이 걸렸다...
// ClosestPoint를 사용해서 가장 가까운 충돌체의 지점을 저장
Vector3 hitPosition = collision.ClosestPoint(transform.position);
// 월드의 셀 위치로 타일의 포시션을 저장(Vector3Int를 사용해야 나중에 setTile 가능)
Vector3Int tilePosition = obstacle.WorldToCell(hitPosition);
obstacle.SetTile(tilePosition, null);
ClosestPoint는 가장 가까운 충돌체의 지점을 저장해주는데 이걸 이용하여
충돌한 타일맵의 위치를 저장해주었고, 해당 위치에 있는 타일맵을
SetTile을 통해 제거해주었다.
발생한 문제
바닥에 설치된 장애물만 파괴되고, 공중에 있거나 y값이 더 높은 녀석들은 파괴가 안됬다.
아무래도 ClosestPoint로 받아온 위치가 정확하지 않은 점이 문제가 된 것 같다.
SetTile을 사용하기 위해선 Vector3Int를 사용해야되는데, 이러면 소수점이 날아가서
정확한 위치가 아니게 된다. 이 점에서 시간을 많이 쓴 것 같다.
해결
완벽한 해결법은 아닌 것 같긴한데 일단 이렇게 해보았다.
if (!obstacle.HasTile(tilePosition))
{
tilePosition.x += 1;
tilePosition.y += 1;
}
if (!obstacle.HasTile(tilePosition))
{
tilePosition.y += 1;
}
우선 받아온 위치를 위의 코드와 같이 보정을 해주었다.
아무래도 쿠키런의 게임 방식이 x축의 +방향으로 진행 되다보니까
보정도 +방향 쪽으로만 해주었다. y축으로는 한번 더 보정 해주었다.
계속 테스트를 해보니까 현재 사용하는 스프라이트를 조금 수정하면 어느정도 해결될 것 같았다.
그래서 스프라이트의 pivot을 수정해서 충돌 지점이 받아온 좌표와 대충 맞을 수 있게 했다.

어느정도 문제가 해결 된 것 같다.....
장애물이 파괴 되었을때 너무 밋밋해보여서 이펙트를 추가해보기로 했다.
부스터 사용 시 일반 피격 시 무적과 같은 효과가 나왔는데 그 점도 수정했다.
장애물 파괴 이펙트는 파티클시스템을 이용하여 손쉽게 만들수 있었다.
인스펙터에서 연결해둔 파티클 프리팹을 충돌 위치에 생성 시키고 0.6초 뒤에 파괴해주었다.
// 파티클 이펙트 추가 (충돌 위치에 생성)
GameObject effect = Instantiate(breakEffectPrefab, hitPosition, Quaternion.identity);
Destroy(effect, 0.6f);
부스터 이펙트는 스프라이트의 색상을 무지개색으로 바꿔주어서 시각적으로 확 띄이게 해줬다.
while (boostTime < t * 0.6f)
{
float hue = (boostTime / t) % 1f;
// HSV -> RGB 변환
Color rainbowColor = Color.HSVToRGB(hue, 1f, 1f);
_spriteRenderer.color = rainbowColor;
// 0.1초마다 색상 변경
yield return new WaitForSeconds(0.1f);
boostTime += 0.1f;
}
_spriteRenderer.color = new Color(1, 1, 1, 0.25f);
yield return new WaitForSeconds(t * 0.4f);
isHit = false;
_spriteRenderer.color = new Color(1, 1, 1, 1);
부스터 지속시간 동안은 색을 계속 바꿔줘서 무지개색으로 만들어주었고,
지속시간이 끝난 뒤 잠깐의 시간 동안 무적 시간을 남겨주었고, 이 부분은
일반 피격 시 무적 효과와 똑같이 만들어줬다.

기능에 대한 부분은 이제는 다 끝난 것 같다.
내일부터는 자잘한 버그 수정과, 지금까지 한 것들을 하나로 합치는게 주된 업무일 것 같다.
오류가 엄청날거 같아서 벌써 두렵다 ㅎ