원점에서 시작하지 않는 벡터의 크기를 구하는 방법을 알아보자
왜냐하면 캐릭터가 이동할 때 마다 투사체의 시작 위치가 변하기 때문에 그에 맞춰서 투사체의 이동거리를 계산해야 된다.


V2의 시작 좌표는 (1, 2) 끝 좌표는 (4, 6) 이다.
끝 좌표에서 시작 좌표를 빼고 루트를 씌워서 크기를 구하면 5가 나온다.

마찬가지로 V1의 크기도 5가 나오는데, 원점에서 시작하지 않는 V2의 크기를 구하기 위해서 x축 방향으로 -1 감소시키고 y축 방향으로 -2 감소시켜서 원점부터 시작하는 벡터를 만들고 크기를 구한다는 것을 알수 있다.

즉, 원점에서 시작하지 않는 벡터의 크기를 구하기 위해서는
"벡터의 시작 좌표" - "벡터의 끝 좌표" 이후 각 x, y, z .. 값을 제곱시킨 이후 루트를 씌워서 크기를 구하면 된다.
이를 코드로 나타내면 다음과 같다.
public void Fire(Vector3 dir, Vector3 playerPos)
{
direction = dir;
isFire = true;
startPos = new Vector3(playerPos.x, 0.5f, playerPos.z);
transform.position = new Vector3(playerPos.x, 0.5f, playerPos.z);
}
void Update()
{
if (isFire)
{
transform.position += direction * speed * Time.deltaTime;
Vector3 bulletMoveRange = transform.position - startPos;
if (Mathf.Abs(bulletMoveRange.magnitude) >= range)
Destroy(gameObject);
}
}
플레이어가 투사체를 최초로 날리면 투사체가 이동하는 방향(direction)과 투사체의 최초의 위치를 저장한다.
그리고 Update()에서 매 프레임마다 이동하는 투사체의 위치에서 투사체의 최초의 위치를 빼서 투사체의 사정거리안에 있으면 투사체를 계속해서 이동시키고 사정거리를 벗어나면 투사체를 제거한다.
여기서 절댓값 "Abs" 함수를 사용한 이유는 크기를 계산하기 때문에 음수가 발생해도 문제없이 처리하기 위함이다.
'게임개발 > 유니티 엔진' 카테고리의 다른 글
애니메이션 평타 캔슬 or 모션 캔슬 (0) | 2024.05.04 |
---|---|
3D 게임 오브젝트 클릭 or 터치시 UI 띄우기 (0) | 2024.04.24 |
모바일 가상 조이스틱 구현 (0) | 2024.04.20 |
몬스터 반경 내의 플레이어 감지 (0) | 2024.04.03 |
GameObject.AddComponent("스크립트") start 메서드 실행 문제점 (0) | 2024.03.26 |