Post

Unity Project - Arkanoid24, Features

Feature : Player (Paddle)

  • Unity Input System을 활용하여 플레이어(Paddle) 구현
  • Behavior => SendMessage 방식으로 해당 메서드가 있는지 찾아 실행시키는 방식으로 진행
  • 각자에 의존성을 낮추기 위해서 기능별로 SRP원칙을 지키며 모듈화 진행
ScriptDescription
PaddleEventController.cs플레이어 Movement, Fire 등을 이벤트로 발행해 제어하는 코드
PaddleInputController.cs플레이어 입력(Keyboard, Mouse)을 받는 코드
PaddleMovement.cs플레이어 이동(Device : Mouse, Movement)을 하는 메서드
PaddleFire.cs플레이어가 공을 발사(초기상태)를 제어하기 위한 코드

🎮Player Movement

  • 플레이어 이동을 마우스 포지션으로만 처리
    • 이 부분에서 살짝 문제가 있었는데, 마우스 포지션을 따라가게 만드니까,
      플레이어가 제어 되지 않을 정도로 너무 빠른 문제가 발생.
    • 기존 코드는 transform을 직접 제어해서 물리 연산에도 오차가 발생

transform을 직접적으로 건드려 포지션을 변경해주던 부분을 물리 연산으로 변경
Rigidbody2D => velocity에 direction값과 speed 값을 곱해주어 마우스를 따라가게 처리
_rbody.velocity = direction * movementSpeed 같은 형태

1
2
3
4
5
6
7
8
9
10
11
12
13
private void FixedUpdate()
{
	ApplyMovement();
}

private void ApplyMovement()
{
	float distancePaddleToMove = _movementAxis.x - transform.position.x;
	
	float moveSpeed = distancePaddleToMove * _movementSpeed;

	_rbody.velocity = new Vector2(moveSpeed, 0);
}

Event Manager

  • Remove => PaddleEventController.cs
  • Add => EventManager.cs
  • 기존 패들 이벤트 컨트롤러에 존재하던 발행하는 이벤트들을 중앙 관리를 위해 이벤트 매니저 생성
  • 이벤트 매니저는 통합적으로 모든 이벤트를 관리하고 퍼블리시(발행) 해주는 역할을 함
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
32
33
34
35
36
37
38
  
using System;  
using UnityEngine;  
  
public class EventManager  
{  
    #region Event Actions  
  
    /* Paddle */  
    public event Action<Vector2> OnMoveEvent;  
    public event Action OnFireEvent;  
  
    /* Ball */  
    public event Action OnBallLaunch;  
  
    #endregion  
  
  
    #region Publish Paddle    
    public void PublishMoveEvent(Vector2 axis)  
    {  
        OnMoveEvent?.Invoke(axis);  
    }  
  
    public void PublishFireEvent()  
    {  
        OnFireEvent?.Invoke();  
    }  
    #endregion  
  
  
    #region Publish Ball    
    public void PublishBallLaunch()  
    {  
        OnBallLaunch?.Invoke();  
    }  
    #endregion  
}
  • 구독과 발행을 중앙 집중적으로 관리하기 때문에 사용성에 유리함. (어디서든 접근)
  • 하지만 이벤트 특성상 코드가 복잡해지는 경향이 있는데 이 부분을 항상 유의해야함.
  • 현재는 작은 규모의 이벤트만을 관리해서 따로 생성해도 문제 없지만,
    추 후 다른 프로젝트나 현재 프로젝트 범위가 커지면 이벤트 매니저는 사용을 지양해야함
  • 이벤트 중앙 관리는 의존성을 최소화 할 수 있지만, 코드의 복잡성을 증가시킨다.
This post is licensed under CC BY 4.0 by the author.