내일배움캠프/Unity TeamProject
Unity 2D 팀 프로젝트 - 2
danpat77
2025. 2. 25. 21:14
Untiy 2D 팀 프로젝트 궁수의 전설 래퍼런스 작품 만들기 - 2
오늘로 팀 프로젝트가 3일차가 진행이 되었다. 오늘 오전에 화살이 벽에 닿았을 때 튕기는 기능을 구현을 하려고 했지만 알고리즘을 짜는 것에 생각보다 시간이 많이 흘러 가버렸다.
알고리즘을 짤때 여러 가지 자료를 찾았는데 처음 찾은 내용은 출발지점의 각도와 벽에 부딪혔을때 각도가 같다는 사실을 이용하여 atan2를 사용해 출발 지점 각도를 구하고 180도에 구한 각도를 빼서 반사각을 구하는 방식이 있었다.
두번째 방법으로는 유니티 자체의 기능인 Vector2.Reflect를 사용하여 백터값을 사용하여 반사기능을 구현하는 방식이다..
그래서 각도를 구하는 방식보다 백터를 이용하는 방식이 좀더 코딩하는데 좋을 것 같아 두번째 방식으로 화살이 벽에 튕기는 기능을 구현을 하였다.
private void OnTriggerEnter2D(Collider2D collision)
{
if (bounceNum > 0 && levelCollisionLayer.value == (levelCollisionLayer.value | (1 << collision.gameObject.layer)))
{
Vector2 normal = ((Vector2)transform.position - collision.ClosestPoint(transform.position)).normalized;
direction = Vector2.Reflect(direction, normal);
_rigidbody.velocity = direction * rangeWeaponHandler.Speed;
bounceNum--;
}
else
{
if (levelCollisionLayer.value == (levelCollisionLayer.value | (1 << collision.gameObject.layer)))
{
DestroyProjectile(collision.ClosestPoint(transform.position) - direction * .2f, fxOnDestroy);
}
else if (rangeWeaponHandler.target.value == (rangeWeaponHandler.target.value | (1 << collision.gameObject.layer)))
{
DestroyProjectile(collision.ClosestPoint(transform.position), fxOnDestroy);
}
}
}
bounceNum은 벽에 튕길 횟수를 정해주는 정수값으로 벽에 한번 튕길때 마다 1씩 감소하여 bounceNum이 0이되면 더이상 벽에 튕기지 않게 만들었다. 만약 계속해서 튕기는 것을 원하면 조건문에서 bounceNum에 대한 조건을 지우면 화살은 무한으로 튕기게된다.