Coding Feature.

[Unity 3D] 3D 퐁 만들기 #4 마우스 커서 관련 처리, 공 랜덤화 구현(쿼터니언) 본문

Toy Project/MICRO-PONG [Unity3D]

[Unity 3D] 3D 퐁 만들기 #4 마우스 커서 관련 처리, 공 랜덤화 구현(쿼터니언)

codingfeature 2024. 1. 19. 19:58

커서 관련 로직을 구현해보기로 했습니다.

 

사용자가 게임을 할 동안에는 커서를 감추고 게임 화면 밖으로 커서를 이동했을 때는 커서를 보이도록 구현해야 합니다.

 

이전에 구현했던 UI 매니저에 다음과 같이 코드를 작성했습니다.

 

    private void Update()
    {
        if (!screenRect.Contains(Input.mousePosition))
        {
            isCursorOutOfScreen = true;
            HandleCursorOutOfScreen(); 
        }
        else
        {
            isCursorOutOfScreen = false;
            HandleCursorOnScreen();
        }

    }
    ..    
    public void HideCursor()
    {
        Cursor.visible = false;
    }

    public void DisplayCursor()
    {
        Cursor.visible = true;
    }
    void HandleCursorOutOfScreen()
    {
        if(GameManager.Instance.gameState == GameManager.GameStates.GameState)
        {
            DisplayCursor();
        }
    }

    void HandleCursorOnScreen()
    {
        if (GameManager.Instance.gameState == GameManager.GameStates.GameState)
        {
            HideCursor();
        }
    }

 

 

게임 매니저에서 현재 게임 State(메인 메뉴, 게임, 게임 오버)를 확인하고 현재 게임 상태일 때, 마우스 커서가 화면 밖을 나가는 경우에는 마우스 커서를 다시 보이도록 로직을 구현했습니다. 그 반대도 같은 방식으로 구현합니다!

 

그리고 Input 매니저에서 위 내용을 반영합니다.

    void Update()
    {
        if(GameManager.Instance.gameState == GameManager.GameStates.GameState && !UIManager.Instance.isCursorOutOfScreen)
            DragPlayer();
    }

 

만약 게임 상태이고, UI 매니저를 통해 마우스 커서가 화면 밖을 나가지 않은 경우에만 Player 오브젝트를 움직일 수 있도록 구현했습니다.

 

 

그 다음 공이 움직이는 방향 벡터를 랜덤으로 만들어서 랜덤성을 부여해보도록 하겠습니다.

 

우선 공을 Vector3 (1, 1, 1)로 초기 벡터값을 설정하고,

1) 처음 시작할 때,

2) 공이 플레이어의 판에 부딪힐 때,

Z 축을 기준으로 0도~360도 사이의 어떤 랜덤 angle 만큼 회전시켜서 랜덤성을 추가해보겠습니다.

 

공 스크립트에 다음과 같은 함수를 추가했습니다.

    public void RotateBallVector(float angle)
    {
        Quaternion randomQuatZAxis = Quaternion.Euler(0, 0, angle); // z 축 기준 랜덤 회전 쿼터니언 생성.
        ballMovementVector = randomQuatZAxis * ballMovementVector; // 벡터 회전
    }

 

angle 값이 float 형식으로 주어질 때,

우선 angle을 z축으로 회전시키는 쿼터니언 값으로 변경하고(Quaternion.Euler 이용)

현재 움직이는 공의 방향 벡터의 앞에 곱해줌로써

벡터를 angle 값만큼 회전시키는 함수를 구현하였습니다.

 

이 코드는 다음과 같이 게임 매니저와 Player 스크립트에 사용됩니다.

 

// 게임 매니저
void InitializeSettings() // 게임 매니저 내 변수 값 false 또는 0으로 초기화.
    {
..
        m_ball.GetComponent<BallScript>().SetBallVector(initBallVector);
        m_ball.GetComponent<BallScript>().RotateBallVector(Random.Range(0f, 360f));
..
    }
   
   
...

// 플레이어 스크립트.

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ball")) // 플레이어가 공에 닿을 경우,
        {
            GameManager.Instance.score += 1;

            ball.GetComponent<BallScript>().AddBallSpeed(GameManager.Instance.ballSpeedIncrement);
            ball.GetComponent<BallScript>().RotateBallVector(Random.Range(0f, 360f));
            StartCoroutine(UIManager.Instance.ShowScore());
        }
    }

 

Random.Range에 0.0부터 360.0까지의 float angle을 넣어서 플레이어에 공이 닿는 경우 또는 게임이 시작될 때 랜덤하게 공이 튀도록 했습니다.

 

그리고 공이 처음 시작할 때는 Ball Spawn Point라는 game object를 새로 만들어서 화면의 정중앙에 놓은 뒤에 그 부분에서 스폰 되도록 설정했습니다.

 

 

 

다음은 사운드 매니저를 구현해보도록 하겠습니다!