Unity_2기 내일배움캠프 TIL

Unity_2기 14주차 (230206)

잼잼재미 2024. 2. 6. 17:32

오늘은 적 배 수정과 배 위에서 총을 쏠 때 맞지 않는 버그를 수정했다.

 

 

트러블 슈팅


1. 적이 배 위에서 총이 맞지 않는 버그

 

적 배위에 있는 적을 향해 총을 쏘면 적이 맞지 않는다. 반대로 적이 쏜 총도 Player가 맞지 않는다.

 

 

 

 private void OnTriggerStay(Collider other)
{
    if(transform.CompareTag("Enemy"))
    {
        if (other.CompareTag("EnemyShipArea") && transform.parent.gameObject.GetComponent<Follow_Player>().IsMove && !IsFix)
        {
            ShipLocalPosition = transform.localPosition;
            IsFix = true;
        }
    }
}

 

적이 배가 움직일 때 Position을 고정할 수 있도록 BoxCollider를 IsTrigger로 설정했다. 반대로 Player도 배 위에서 Position을 고정할 수 있도록 BoxCollider가 설정되어있다. 아마도 총을 쏠 때, RaycastHit이 방어막처럼 적을 인식해서 데미지를 적용하기 전에 BoxCollider를 인식하기 때문이라고 생각했다. 테스트를 해보니 맞았다. IsTrigger이라면 당연히 충돌하지 않을 거라고 생각했었는데 RaycastHit의 경우는 달랐다.

 

 

private void Update()
{
    if(transform.CompareTag("Enemy"))
    {
        if (IsShip() && transform.parent.gameObject.GetComponent<Follow_Player>().IsMove && !IsFix)
        {
            Debug.Log("Enemy 위치고정");
            ShipLocalPosition = transform.localPosition;
            IsFix = true;
        }
    }
}

public bool IsShip()
{
    Ray[] rays = new Ray[4]
    {
        new Ray(transform.position + (transform.forward * 0.3f) + (Vector3.up * 0.3f), Vector3.down),
        new Ray(transform.position + (-transform.forward * 0.3f) + (Vector3.up * 0.3f), Vector3.down),
        new Ray(transform.position + (transform.right * 0.3f) + (Vector3.up * 0.3f), Vector3.down),
        new Ray(transform.position + (-transform.right * 0.3f) + (Vector3.up * 0.3f), Vector3.down),
    };

    for (int i = 0; i < rays.Length; i++)
    {
        if (Physics.Raycast(rays[i], 0.5f, EnemySO.ShipLayerMask))
        {
            return true;
        }
    }

    return false;
}

 

 

콜라이더를 삭제하고 Ray로 배 위인지 판별하는 함수를 추가했다. 

 

 

 

해결 완료!

 

 

2. 튜토리얼 창/설정 창 활성화 시, 마우스에 방향에 따라 카메라 회전

 

튜토리얼 창이나 설정 창이 활성화 시, TimeScale이 0이 되도록 설정했다. 하지만 마우스의 이동에 따른 카메라 회전은 멈추지 않았다.

 

 

void Update()
{
    if (_isPause == true && Input.GetMouseButtonDown(0))
    {
        GameManager.I.SoundManager.StartSFX("TutorialInActive");
        foreach (GameObject tutorial in _tutorials)
        {
            tutorial.SetActive(false);
        }
        Time.timeScale = 1f;
        GameManager.I.PlayerManager.Player.GetComponent<PlayerController>().IsUI = false;
        _isPause = false;
        GameManager.I.PlayerManager.Player.GetComponent<PlayerController>().CanLook = true;
    }
}

public void TutorialActive(int num)
{
    GameManager.I.PlayerManager.Player.GetComponent<PlayerController>().CanLook = false;
    _tutorials[num].SetActive(true);
    GameManager.I.SoundManager.StartSFX("TutorialActive");
    GameManager.I.PlayerManager.Player.GetComponent<PlayerController>().IsUI = true;
    Time.timeScale = 0f;
    _isPause = true;
    IsTutorialActive[num] = true;
}

 

PlayerController 스크립트에 마우스의 이동에 따른 카메라 회전 함수에 CanLook bool 값을 추가했다. 그리고 튜토리얼 창이나 설정 창이 활성화 되면 false로 바꿔서 함수를 실행하지 못하도록 했다.

 

 

 

해결 완료!

 

 

회고 


오늘은 Enemy의 AI 기능 수정 작업을 위해 적 배 작업을 먼저 시작했다. 적의 배 위의 움직임을 구현하기 전에 배의 콜라이더 설정이 필요했다. 배의 자체적인 convex로는 섬세한 콜라이더 설정이 불가능해서 GameObject를 직접 하나씩 생성해서 설정했다. 사실 프로그래머로서의 작업이라기 보다는 단순 반복 작업이었다. 그렇게 작업을 하던 중, 적 배 위에 있는 적이 총에 맞지 않는 버그를 발견해서 바로 수정을 했다. Ray는 IsTrigger 콜라이더를 당연히 감지하지 못한다고 생각했는데 생각과는 달리 감지를 하였고, 그래서 적을 감지할 수 없었고, 데미지 또한 받지 않은 것이다. 내일은 게임을 종료해도 Player의 정보와 위치 등 저장할 수 있는 저장 기능을 구현할 것이다!

'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글

Unity_2기 14주차 (230208)  (0) 2024.02.08
Unity_2기 14주차 (230207)  (0) 2024.02.07
Unity_2기 14주차 (230205)  (0) 2024.02.05
Unity_2기 13주차 (230202)  (0) 2024.02.02
Unity_2기 13주차 (230201)  (0) 2024.02.02