오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 64일차(최종프로젝트 15일차 내가 구현한 것을 정리해보자. 발표 자료 준비)

2024. 2. 1. 01:07스파르타코딩클럽 게임개발

반응형

 

시간 조작과 물리 퍼즐 구현

1. ReplayRecorder: 시간 역행 구현

  • 기능: 객체의 움직임을 기록하고 역재생시켜 시간을 되돌리는 효과 제공.
  • 주요 메소드:
    • StartRecording() / StopRecording(): 녹화 시작 및 중지.
    • StartReversePlayback() / StopPlaybackAndClearFrames(): 역재생 시작 및 중지.

구현 방법

  • 사용 컴포넌트: Rigidbody, Renderer.
  • 데이터 저장: Stack<FrameData> 활용.
  • 코루틴 활용: 주기적인 프레임 기록 및 재생.

학습 포인트

  • 스택 사용: 역순 재생에 적합한 LIFO 특성 활용.
  • 코루틴 활용: 비동기적 프레임 처리.
  • 보간 기법: Vector3.LerpQuaternion.Lerp 사용.

2. Brack 스크립트: 물체 파괴 및 복구

기능

  • 파괴 및 복구: 오브젝트 파괴나 복구 시 자연스러운 전환 효과.
  • 속성: 파괴될 때 생성될 프리팹, 파괴 시 적용될 힘 설정.

사용 예

  • 적용: DestroyedObjectStart 부분에 적용.
  • 메소드: Destroing()Restroring().

3. 다양한 반응형 오브젝트 구현

3-1. GravityAttractor: 중력장 구현

  • 기능: 특정 위치에서 중력과 같은 힘 발생, 주변 Rigidbody 끌어당김.
  • 구현 방식: Physics.OverlapSphere 사용, 중력 힘 계산 및 적용.

3-2. AccelerationZone: 가속 구역 구현

  • 가속 제공: 트리거 구역 내에서 객체에 지속적 가속 제공.
  • 가속 계산: 객체의 이동 방향 및 가속도 기반 힘 적용.

3-3. PlayerViewGravity: 플레이어 중심 중력 조절

  • 기능: 플레이어 시점 방향에 따라 중력 조절.
  • 구현: 화살표 키 입력에 따른 중력 방향 변경 및 적용.

3-4. ReflectiveJump: 반사 점프 구현

  • 반사 점프: 객체 충돌 시 반사각 계산 및 점프 힘 적용.
  • 접촉 계산: 충돌 정보를 기반으로 반사 벡터 계산.

3-5. ContinuousAccelerationZone: 연속 가속 구역

  • 연속 가속: 구역 내에서 객체에 지속적으로 가속 적용.
  • 속도 조절: Mathf.MoveTowards 활용하여 점진적 속도 증가.

디자인 패턴 활용

이 프로젝트에서 사용된 주요 디자인 패턴들을 정리했다.

1. Observer 패턴

  • 목적: 객체 간 결합도 감소 및 유지보수성 향상.
  • 적용: 객체 상태 변경 시 다른 객체에게 알림.

구현

  • ReplayRecorder 클래스: 상태 변경 감지 및 알림 발송.
  • DestroyedObject 클래스: 상속받은 ReplayRecorder에서 상태 변경 이벤트 처리.
  • ParentObject 클래스: 자식 객체의 상태 변경 알림 수신 및 처리.

예제 코드

public delegate void StateChangeHandler(DestroyedObject sender, bool isDone, bool isClick);
public event StateChangeHandler OnStateChange;

// ...

OnStateChange?.Invoke(this, newIsDone, newIsClick);

2.상속 (Inheritance)

  • 목적: 코드 재사용 및 확장성 향상.
  • 적용: 공통 기능을 가진 베이스 클래스 정의 후 확장.

구현

  • ReplayRecorder 클래스: 기본 기능 제공.
  • DestroyedObject 클래스: ReplayRecorder 상속 및 기능 확장.

예제 코드

public class DestroyedObject : ReplayRecorder
{
    // 상속받은 메소드 확장
    public override void Recording(bool newIsDone, bool newIsClick)
    {
        // ...
    }
}

3. 코루틴 (Coroutine)

  • 목적: 비동기 작업 관리 및 효율적인 프레임 처리.
  • 적용: 게임 오브젝트의 비동기적 동작 구현.

구현

  • ReplayRecorder 클래스: 프레임 기록 및 역재생 관리.

예제 코드

private IEnumerator PlaybackCoroutine()
{
    // ...
}

4.멘토 패턴 (Memento Pattern)

개요

  • 목적: 객체의 상태를 저장하고 이전 상태로 복원.
  • 적용: 객체의 상태 변화 추적 및 이전 상태로의 복원.

구현

  • FrameData 구조체: 객체의 상태 저장.
  • ReplayRecorder 클래스: 객체 상태(멘토)를 Stack에 저장 및 복원.

예제 코드

public struct FrameData
{
    public Vector3 position;
    public Quaternion rotation;
    public Vector3 scale;
    public Color color;
}

protected Stack<FrameData> recordedFrames = new Stack<FrameData>();

디자인 패턴 종합 정리

이 프로젝트에서 사용된 주요 디자인 패턴들을 재정리합니다.

1. Observer 패턴

  • 적용: 객체 간 결합도 감소 및 유지보수성 향상.
  • 구현: 객체 상태 변경 시 다른 객체에게 알림.

2. 상속 (Inheritance)

  • 적용: 코드 재사용 및 확장성 향상.
  • 구현: 베이스 클래스 정의 후 상속을 통한 기능 확장.

3. 코루틴 (Coroutine)

  • 적용: 비동기 작업 관리 및 효율적인 프레임 처리.
  • 구현: 게임 오브젝트의 비동기적 동작 관리.

4. 멘토 패턴 (Memento Pattern)

  • 적용: 객체 상태 저장 및 복원.
  • 구현: 객체의 상태(멘토)를 Stack에 저장 및 복원.

결론

이 프로젝트는 Observer 패턴, 상속, 코루틴 및 멘토 패턴을 통해 게임의 유연성, 재사용성 및 유지보수성을 향상시켰습니다. Observer 패턴은 객체 간의 결합도를 낮추고, 상속은 코드 재사용을 용이하게 하며, 코루틴은 비동기적인 작업을 효율적으로 관리할 수 있게 합니다. 멘토 패턴은 객체의 상태를 저장하고 복원하는 데 중요한 역할을 하여, 복잡한 상태 관리를 가능하게 합니다. 이러한 패턴들의 적용은 게임 개발의 복잡성을 관리하고, 더 나은 코드 품질을 달성하는 데 중요한 역할을 합니다.

반응형