
Where Am I?오늘은 3일 동안 구현한 기능들을 점검하는데 중점을 뒀다. 여러 버그들이 있었고 하나하나 수정하여 지금까지 구현한 기능에는 버그가 없도록 만들 수 있었다. 추가로 오늘 구현한 것들을 나열하자면 수류탄 폭발 데미지 기능, 미니맵 오브젝트 연동, 화살 리필 기능 등이 있다.
이번 포스트에서 소개할 코드는 LineRenderer를 활용한 궤적 기능이다.
Trajectorypublic class Trajectory : MonoBehaviour
{
// 궤적을 그리기 위한 LineRenderer
private LineRenderer _renderer;
private Camera _camera;
private void Awake()
{
Init();
}
public void UpdateTrajectory(GameObject curArrow, float arrowSpeed)
{
// 궤적을 그리는데 사용될 정점 개수
int pointCount = 30;
// 정점 간의 시간차
float deltaTime = 0.1f;
Vector3[] trajectorys = new Vector3[pointCount];
// 궤적의 시작점
Vector3 startPos = transform.position;
// 무기 방향 → 카메라 방향
transform.rotation = Quaternion.Euler
(_camera.transform.eulerAngles.x, _camera.transform.eulerAngles.y, 0);
// 발사체 방향 = 무기 방향
curArrow.transform.rotation = transform.rotation;
float speed = arrowSpeed;
// 궤적 및 발사체 시작 속도
Vector3 startVel = transform.forward * speed;
// 궤적 발사체 운동 동기화, 계산
for (int i = 0; i < pointCount; i++)
{
trajectorys[i] = CalculatePoint(startPos, startVel, deltaTime * i);
}
//
_renderer.positionCount = pointCount;
// 렌더러로 계산된 궤적 표시
_renderer.SetPositions(trajectorys);
}
private Vector3 CalculatePoint(Vector3 startPos, Vector3 startVel, float time)
{
// 포물선 운동 방정식 반환
Vector3 gravity = Physics.gravity;
return startPos + startVel * time + 0.5f * gravity * time * time;
}
private void Init()
{
_renderer = GetComponent<LineRenderer>();
_camera = transform.parent.GetComponentInChildren<Camera>();
}
}