본문 바로가기
유니티 공부/Unity

Unity - Strategy Pattern(전략 패턴)을 사용해 씬에 따라 플레이어의 조작 방식을 달라지게 만들어보자

by 코딩하는 돼징 2025. 5. 7.
반응형

메인씬, 다른씬들 이렇게 게임이 구조로 되어있었는데 다른씬으로 갈 경우 플레이어의 행동을 다르게 씬들에 맞춰 바꾸고 싶었다. 그래서 찾아 보던 중 state패턴 이라는 것을 알게되었고 이를 사용해 구현하면 된다는 것을 알게되었다.


Strategy Patten이란?

객체의 행동을 캡슐화해서 런타임에 동적으로 변경할 수 있게 하는 패턴이다. 즉 플레이어의 행동을 코드 한 덩어리로 묶고 언제든지 원하는 행동으로 바꿀 수 있다.


구현해보자

IPlayerInputStrategy	// 플레이어 행동을 위한 전략 인터페이스
DefaultMoveStrategy, MiniGameStrategy	// 각각의 씬에 맞는 전략 구현 클래스
PlayerController	// 실제 입력을 처리할 때 현재 전략을 사용
GameManager	// 씬 전환 시 어떤 전략을 사용할지 결정

01 Strategy 인터페이스 정의

플레이어의 입력 방식을 이 인터페이스에 따른다.

public interface IPlayerState
{
    void HandleUpdate(PlayerController player);
    void HandleFixedUpdate(PlayerController player);
}

02 Strategy 구현체

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEngine.RuleTile.TilingRuleOutput;

public class DefaultMoveStrategy : IPlayerInputStrategy
{
    public void HandleUpdate(PlayerController player)
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            player.StartJump();
        }
    }

    public void HandleFixedUpdate(PlayerController player)
    {
        player.Move(); 
    }
}

같이 키를 사용하지만 동작이 다르다. Strategy를 바꾸게 되면 플레이어의 조작이 바뀌게 된다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MiniGameStrategy : IPlayerInputStrategy
{
    public void HandleUpdate(PlayerController player)
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            player.ForMiniGameJump();
        }
    }

    public void HandleFixedUpdate(PlayerController player)
    {
        
    }
}

03 Player행동들 설정

public class PlayerController : MonoBehaviour
{
    private IPlayerInputStrategy inputStrategy;

    public void SetStrategy(IPlayerInputStrategy strategy)
    {
        inputStrategy = strategy;
    }

    void Update()
    {
        inputStrategy?.HandleUpdate(this);
    }

    void FixedUpdate()
    {
        inputStrategy?.HandleFixedUpdate(this);
    }

    public void StartJump()
    public void Move() 
    public void ForMiniGameJump()
}

04 게임매니저에서 관리

Unity씬 전환 이벤트를 이용해 씬에 따라 Strategy를 자동으로 교체한다.

public class GameManager : BaseManager<GameManager>
{
    public static GameManager Instance;
    [SerializeField] private PlayerController player;

    private IPlayerInputStrategy defaultStrategy = new DefaultMoveStrategy();
    private IPlayerInputStrategy miniGameStrategy = new MiniGameStrategy();

    private void Start()
    {
        SetDefaultMode();
        SceneManager.sceneLoaded += OnSceneLoaded;
    }
    private void Awake()
    {
        if (Instance != this && Instance != null)
        {
            Destroy(gameObject);
            return;
        }
        else
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
    }
    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        if (scene.name == "...")
        {
            player.SetStrategy(miniGameStrategy);
        }
        else if (scene.name == "...")
        {
            player.SetStrategy(defaultStrategy);
        }
    }
    public void SetDefaultMode()
    {
        player.SetStrategy(defaultStrategy);
    }
    
    public void SetMiniGameMode()
    {
        player.SetStrategy(miniGameStrategy);
    }
}

 

반응형

댓글