TIL 25.02.26 - 팀 과제_4

강진규·2025년 2월 26일

Today I Learned

목록 보기
21/34
post-thumbnail

오늘도 회의 때 정했던 기능들을 구현했다.

  • 거대화 아이템 추가
  • 거대화, 부스터 아이템 먹으면 장애물 파괴 가능
  • 아이템 이펙트 추가

[ 거대화 아이템 추가 ]

쿠키런에 아이템 중 거대화 할 수 있는 아이템이 있다.
그런 느낌을 주려고 쿠키의 스프라이트를 늘려주는 느낌으로 구현했다.

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);

부스터 지속시간 동안은 색을 계속 바꿔줘서 무지개색으로 만들어주었고,
지속시간이 끝난 뒤 잠깐의 시간 동안 무적 시간을 남겨주었고, 이 부분은
일반 피격 시 무적 효과와 똑같이 만들어줬다.


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

0개의 댓글