포톤 퓨전에서 투사체 구현하기
나는 오늘 플레이어가 총을 쏘면 날라가는 총알을 구현하는 것에 모든 시간을 쏟아부었다.
내가 오늘 배우고 작성했던 것들에 대해 정리를 해보겠다.
우선 실제로 날라가서 데미지를 입히는 총알과
내가 총을 쏴서 시각적으로 총알이 날라가는 이펙트를 따로 구현해준다.
아니 그냥 한번에 하지 왜 따로 해?
실제로 날라가는 데미지는 서버로 보내주고, 총알 이펙트는 각 클라이언트가 처리하게끔 하기때문에
반응속도가 빠르고 네트워크 부하가 적다.
대신 단점은 실제로 총알이 날라가서 맞는 게 아니고, 총알은 이미 맞고, 연출만 따로 보여주는 것이기 때문에
이질감이 들 수 있다.
그럼 어떻게 구현이 흘러가는지 알아보자.
1. 총을 쏘는 순간 서버에서 Raycast로 피격 판정을 수행한다.
2. 총을 쏘는 이펙트 메서드에서 날아가는 비동기 투사체 객체를 생성한다.
3. 이 투사체는 targetPosition까지 직선 이동하면서 Trail/Particle 효과만 보여준다.
예시
public void FireProjectile(Vector3 origin, Vector3 direction, Vector3 hitPoint)
{
var projectile = projectilePool.Get(); // 풀링된 오브젝트
projectile.transform.position = origin;
projectile.Init(hitPoint); // hitPoint까지 이동 후 파괴
}
보다 쉬운 이해를 위해 내가 오늘 작성한 더미 투사체 스크립트를 보여주면서 설명 해 보겠다.
우선 변수들을 선언해준다.
그 다음 총알이 날아가야 할 목표 지점을 정해준다.
그리고 히트 이펙트를 꺼둔 채 시작을 한다.
시작 위치를 저장하고, 목표 위치가 없다면 앞으로 직진 후 전체 이동시간을 계산한다.
그 다음 현재 총알이 얼마나 이동했는지 계산하고, 목표 지점에 도착하면 총알 외형 오브젝트를 숨기고
히트 이펙트를 보여준다. 그리고 일정 시간이 지나면 파괴시킨다.
전체 흐름을 쉽게 보자면
[총알 생성]
↓
목표 위치가 있으면 → 그리로 날아감
없으면 → 앞쪽으로 _maxDistance만큼 직진
↓
지속 시간 동안 Lerp로 이동
↓
목표 위치 도착
↓
[히트이펙트 보여줄지 확인]
↓
보이면 보여주고, 일정 시간 후 삭제
없으면 바로 삭제
오늘은 이렇게 더미프로젝타일. 즉 총알 외형만 구현을 했고, 내일은 실제로 총알이 벽이나
플레이어에게 닿으면 히트하는 것 까지 구현을 해보겠다.