
오늘은 어제 하던 것을 마저 마무리하고 새로운 작업을 했다.
DeadZone을 추가해서 쿠키가 떨어졌을때 낙사 판정을 해주었다.
private void OnCollisionEnter2D(Collision2D collision)
{
// 충돌한 객체에서 Cookie 컴포넌트 가져옴
Cookie cookie = collision.gameObject.GetComponent<Cookie>();
// null이 아니면 Dead 실행
if (cookie != null)
{
cookie.Hit(1000f);
Destroy(collision.gameObject);
}
}
OnCollisionEnter2D를 사용하여 DeadZone에 접촉하게 되면
해당 메서드를 실행시키게 구현해 두었다.
처음에는 DeadZone을 맵의 크기에 맞춰 길게 만들었다.
하지만 이 방식은 맵이 커지면 커질수록 DeadZone의 크기도 키워야됐다.
그래서 카메라에 DeadZone을 추가해주었다.
카메라는 쿠키를 따라 이동하기 때문에 맵이 아무리 커져도 이동에 맞춰
DeadZone이 항상 위치 할 수 있게 되었다.

어제까지의 작업에서는 카메라에 넣어놔서 배경과 전경이 고정되있었는데,
배경과 전경을 카메라 움직임에 따라 계속해서 생성되게 만들어줬다.
카메라에 Looper를 달아주었고 접촉 시 배경을 이동시켜주었다.
강의에서 사용했던 방법을 베이스로 조금 수정해서 사용하였다.
private void OnTriggerEnter2D(Collider2D collision)
{
// 충돌한 객체의 태그가 해당되면 동작
if (collision.CompareTag("BackGround") || collision.CompareTag("ForeGround"))
{
// 콜라이더의 가로 길이
float width = ((BoxCollider2D)collision).size.x;
// 충돌한 객체의 위치
Vector3 pos = collision.transform.position;
// 객체의 x를 width만큼 이동
pos.x += width;
collision.transform.position = pos;
return;
}
}
오브젝트 1개에 스프라이트를 연결하여 사용했고 하나만으로 구현을 시도했다.
하지만 이렇게 했을때 카메라와 쿠키의 이동에 따라 배경의 빈공간이 보여지게 됐다.
2개의 오브젝트에 스프라이트를 연결하여 사용하였고

콜라이더는 이런식으로 설정하여서 한 오브젝트 만큼만 이동하게 만들었다.

이렇게 되었을때 카메라의 이동에 따라 나오던 빈 배경이 2번째 오브젝트에
연결한 스프라이트로 인해 배경으로 잘보이게 되었고 위의 스크립트를 통해
배경이 계속해서 재성성 될 수 있었다.
원래는 카메라에 고정시켜 놓았기 때문에 멈춰있는 이미지라서 뭔가 이상했다.
그래서 이 부분을 이동하는 느낌으로 수정해주고 싶어서 시도해봤다.
// 카메라 위치
public Transform cameraTransform;
// 속도 ( 배경, 전경 이동 효과 )
public float speed = 0.2f;
// 이전 카메라 위치
private Vector3 prevCameraPosition;
void Start()
{
// 이전 카메라 위치 설정
prevCameraPosition = cameraTransform.position;
}
void LateUpdate()
{
// 설정한 속도에 따라 배경, 전경 이동
Vector3 movement = cameraTransform.position - prevCameraPosition;
transform.position += movement * speed;
prevCameraPosition = cameraTransform.position;
}
LateUpdate를 사용한 이유는 카메라의 위치 추적이 Update에서 진행이 되기 때문에
그것보다 늦게 실행되게 하려고 사용하였다.
위에서 발생했던 문제랑 같이 발생했다. 이동 효과는 잘 되는데 빈 배경이 보였다.
먼저 위의 부분을 해결하고 나니까 어느정도 해결을 되었는데, 살짝 버벅이는 느낌을 받았다.
왜 그럴까 생각하니 콜라이더를 설정해두었는데 그게 크기가 딱 맞지 않았다.
그래서 크기에 맞게 수정을 해주었고 결과적으로 버벅임도 해결되었다.
이건 다른 팀원인 상민님이 구현한 피격 후 무적 시간 판정에 조금 추가를 했다.
무적 판정이 되었을때 시각적으로 보여주는 느낌을 주고 싶어서 만들었다.
public IEnumerator Invincible(float t)//피격 시 일시 무적
{
isHit = true;
_spriteRenderer.color = new Color(1, 1, 1, 0.25f); // 알파값 변경 반투명
yield return new WaitForSeconds(t);
isHit = false;
_spriteRenderer.color = new Color(1, 1, 1, 1); // 알파값 다시 돌려줌
}
어떤 느낌으로 할까 고민하다가 가장 보편적인 반투명 해지는 느낌으로 하였다.
spriteRenderer의 알파 값을 바꿔서 무적시간 동안 반투명 해지게 만들었다.

무적 시간이 끝나면 원래대로 돌아온다.
내일은 도전 과제 기능을 어느 정도 마무리 하고 싶다.
일단 회피의 관련한 도전 과제만을 목표로 구현하고 있다.
그래도 생각보다 많이 진도를 나간 것 같아서 아주 좋다!