반응형
메인씬, 다른씬들 이렇게 게임이 구조로 되어있었는데 다른씬으로 갈 경우 플레이어의 행동을 다르게 씬들에 맞춰 바꾸고 싶었다. 그래서 찾아 보던 중 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);
}
}
반응형
'유니티 공부 > Unity' 카테고리의 다른 글
Unity - 제네릭이 꼭 좋은 건 아니였다. (0) | 2025.05.12 |
---|---|
Unity - FSM(Finite State Machine)을 사용해서 몬스터 AI를 만들어보자 (0) | 2025.05.09 |
Unity - MissingReferenceException 에러 해결 방법(+) Dontdestroyonload) (0) | 2025.05.02 |
Unity - 상속 구조에서 호출 누락 조심! (0) | 2025.05.01 |
Unity - 코루틴 중복 사용 막는법 (0) | 2025.05.01 |
댓글