[Unity] Project. Personal_4

Lingtea_luv·2025년 5월 31일

Project

목록 보기
20/38
post-thumbnail

Where Am I?


오늘은 3일 동안 구현한 기능들을 점검하는데 중점을 뒀다. 여러 버그들이 있었고 하나하나 수정하여 지금까지 구현한 기능에는 버그가 없도록 만들 수 있었다. 추가로 오늘 구현한 것들을 나열하자면 수류탄 폭발 데미지 기능, 미니맵 오브젝트 연동, 화살 리필 기능 등이 있다.

이번 포스트에서 소개할 코드는 LineRenderer를 활용한 궤적 기능이다.

Trajectory

public 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>();
    }
}
profile
뚠뚠뚠뚠

0개의 댓글