공중 보스의 이동은 처음에 position 자체를 이동시키는 방식으로 진행했다.
자연스러운 움직임을 위해서 Lerp로 이동 값을 조정해줬지만 원하는 움직임이 나오지 않았다.
그래서 보스의 강체에 힘을 가해서 움직이는 방식으로 변경하였다.
이동 방식을 바꾸니 정지 거리를 임의로 하드코딩해야했던 부분도 제거할 수 있었고, 연출에서도 자연스러움을 얻을 수 있었다.
protected override void Look()
{
// 타겟 방향 계산
Vector3 targetDirection = (boss.Target.transform.position - boss.transform.position).normalized;
Quaternion lookRotation = Quaternion.LookRotation(targetDirection);
// 쿼터니언의 오일러 각도를 제한해준다.
Vector3 euler = lookRotation.eulerAngles;
euler.x = Mathf.Min(euler.x, 40f);
// 나온 오일러 각도를 다시 방향으로
lookRotation = Quaternion.Euler(euler);
boss.transform.rotation = Quaternion.RotateTowards(boss.transform.rotation, lookRotation, 30 * Time.deltaTime);
}
목표물을 따라갈 때에는 AddForce
메서드를 사용하여 정지 위치 (타겟의x, 보스의y, 타겟의z)로 향한다.
정지 위치가 되면 힘을 가하지 않아 자연스럽게 정지한다.
정지 위치와 가까워질 수록 가하는 힘이 적어지도록 하였다.
protected override void Move()
{
// 이동 방향 벡터 계산
Vector3 moveDirection = (StopPoint - boss.transform.position).normalized;
float distanceToStopPoint = Vector3.Distance(boss.transform.position, StopPoint);
float forceMagnitude = distanceToStopPoint / boss.Data.moveSpeed;
forceMagnitude = Mathf.Clamp(forceMagnitude, 4, 10);
// Rigidbody에 힘을 가해 이동
boss.GetComponent<Rigidbody>().AddForce(moveDirection * forceMagnitude);
}
가하는 힘이 적어지게 하는 부분이 아직 많이 부족하다.. 연구 필요
위에서 말한 것 처럼 정지 위치를 지나가면 Move 메서드를 호출하지 않음으로 움직임을 멈추게 한다.