내가 구현했던 기능 개선 위주로 진행했다.
트러블 슈팅
1. 적의 이동
_dir = new Vector3(_enemyController.Target.transform.position.x - transform.position.x, 0, _enemyController.Target.transform.position.z - transform.position.z).normalized;
if (_enemyController.IsGrounded())
{
_enemyController.NavMeshAgent.SetDestination(_enemyController.Target.transform.position);
}
else
{
_enemyController.Rigidbody.velocity = _dir * _enemyController.EnemySO.RunSpeed * Time.deltaTime;
}
transform.LookAt(transform.position + _dir);
위 코드처럼 Rigidbody의 velocity를 사용해서 코루틴을 통해 적의 이동을 구현하는 방식이다. walkSpeed와 runSpeed를 설정했는데 씬이 달라지면 속도 자체가 많이 차이나는 버그를 발견했다.
_dir = new Vector3(_enemyController.Target.transform.position.x - transform.position.x, 0, _enemyController.Target.transform.position.z - transform.position.z).normalized;
if (_enemyController.IsGrounded())
{
_enemyController.NavMeshAgent.SetDestination(_enemyController.Target.transform.position);
}
else
{
_enemyController.Rigidbody.AddForce(_dir * _enemyController.EnemySO.RunSpeed * Time.deltaTime, ForceMode.VelocityChange);
}
transform.LookAt(transform.position + _dir);
위와 같이 Rigidbody의 AddForce를 사용해서 버그 수정했다. 정확한 이유는 모르지만 velocity의 경우 다른 Rigdbody의 영향을 많이 받는다고 한다. 그에 비해 AddForce는 단순히 힘을 받아서 움직이는 방식이기 때문에 상관이 없다고해서 이렇게 수정을 했다. ForceMode의 경우 VelocityChange로 했는데 오브젝트의 질량에 관계없이 직접적으로 속도 변화를 주기 때문에 적의 이동에 맞다고 생각해서 사용했다.
https://kkln2486.tistory.com/266
AddForce
AddForce 물체에 힘을 가하는 기능을 제공 ForceMode를 통해 힘을 가하는 방법을 선택 가능 ForceMode ForceMode.Force : 역학적인 개념의 힘을 리지드 바디에 주는 모드. 주로 바람이나 자기력처럼 연속적으
kkln2486.tistory.com
2. 배 이동 시, 적의 이동
배가 출발하면 동료의 이동이 빨라지는 버그가 생겼다. 아마도 동료가 배의 자식으로 들어가 있지 않아서 배의 이동과 함께 따라가지 않아서 생긴 버그인 것 같다.
하지만 동료를 배의 자식으로 넣었지만 비슷하게 동작했다. 아마도 배의 rigidbody와 여러가지 물리 작용이 복합적으로 작동하는 것 같다.
private void Update()
{
if (IsFix) transform.localPosition = ShipLocalPosition;
}
private void OnTriggerStay(Collider other)
{
if (transform.CompareTag("Partner"))
{
if (other.CompareTag("ShipArea") && GameManager.I.PlayerManager.Player.GetComponent<PlayerController>().CanShipControll
&& !IsFix)
{
transform.parent = other.transform;
ShipLocalPosition = transform.localPosition;
IsFix = true;
}
}
}
여러가지 물리 작용 때문에 배가 이동할 때는 동료가 idle 상태를 유지하는 것으로 바꿨다. 오히려 배가 움직이고 있는데 그 위를 자연스럽게 걸어다니는 것 자체가 부자연스러울 것 같다는 생각도 했다. Player가 배를 운전하는 순간, 동료를 배의 자식 오브젝트로 이동하고 그 로컬 포지션을 저장했다가 Update에서 계속 로컬포지션으로 고정하도록 구현했다. 그리고 반대로 backspace 키를 누르면 운전을 멈추고 다시 원래대로 idle 상태와 walk 상태를 반복하도록 설정했다.
해결 완료!!
3. 경사에서 적의 이동
Player를 쫒아오는 적의 지형이 경사가 있다면 Player 방향으로 공중에서 다가오는 버그 발견. Nav Mesh 이동의 경우는 괜찮았고 사용하지 않을 때 이와 같은 버그가 생겼다. 이동을 Velocity에서 AddForce로 바꿔서 수정완료!
4. NavMesh 적 이동 시, Player와 충돌하면 힘을 받아서 이동속도가 바뀜
적이 Player와 충돌하게되면 적이 뒤로 밀리면서 속도가 느려진다. 그리고 총 공격도 먹지 않는다.
Is Kinematic은 외부에서 가해지는 물리적 힘에 반응하지 않는 오브젝트라는 의미이다. 이렇게 Is Kinematic 체크로 Player와 충돌할 때는 충격을 받지 않고 공격을 통해서만 넉백이 일어나도록 했다.
생각보다 쉽게 해결하나 싶었지만 Is Kinematic 체크로 인해 NavMesh 이동을 하지 않을때 AddForce도 적용되지 않았고, 적이 데미지를 받는 Hit상태에서의 AddForce도 적용되지 않았다.
if (_enemyController.IsGrounded())
{
_enemyController.Rigidbody.isKinematic = true;
}
else
{
_enemyController.Rigidbody.isKinematic = false;
}
if (!_enemyController) _enemyController = enemyController;
_enemyController.Rigidbody.isKinematic = false;
_dir = new Vector3(_enemyController.Target.transform.position.x - transform.position.x, 0,
_enemyController.Target.transform.position.z - transform.position.z).normalized;
transform.LookAt(transform.position + _dir);
Debug.Log("Hit 상태 시작");
적이 Idle 상태에서 시작 할 때, NavMesh인지 판단하여 isKinematic을 설정해주고, 넉백을 적용하는 Hit상태에는 isKinematic를 false로 해주었다. 해결완료!
회고
오늘은 새로운 추가 기능보다는 기존에 있던 기능들의 버그를 수정했다. 전체적으로 많이 어렵지는 않았지만 시간은 생각보다 오래걸렸다. 다음주에는 한 싸이클의 게임을 개발 완료하고 보완하는 시간을 가지도록 하겠다.
'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글
Unity_2기 13주차 (230130) (1) | 2024.01.30 |
---|---|
Unity_2기 13주차 (230129) (0) | 2024.01.29 |
Unity_2기 12주차 (230125) (2) | 2024.01.25 |
Unity_2기 12주차 (230124) (1) | 2024.01.24 |
Unity_2기 12주차 (230123) (1) | 2024.01.23 |