일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Unity
- 유니티 3D
- 유니티
- 1인 게임 개발
- 게임 개발
- 정처기 필기
- 토이 프로젝트
- Unity #Unity2D #Portal
- 게임제작
- 게임
- 유니티3d
- 3회차
- 퐁
- unity3d
- 자바스크립트 게임
- 합격
- 1인 개발
- 프로그래머스 #최소힙 #우선순위 큐
- 1인 게임
- 게임 제작
- FPS
- 정처기
- Unity2D
- 정보처리기사
- 필기
- portal
- Vampire Survivors
- 자바스크립트
- Pong
- 1인 게임 제작
- Today
- Total
Coding Feature.
[Unity 3D] 3D 퐁 만들기 #4 마우스 커서 관련 처리, 공 랜덤화 구현(쿼터니언) 본문
[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를 새로 만들어서 화면의 정중앙에 놓은 뒤에 그 부분에서 스폰 되도록 설정했습니다.
다음은 사운드 매니저를 구현해보도록 하겠습니다!