TIL

[멋쟁이사자처럼 부트캠프 TIL 회고] 유니티 게임개발 3기 31일차 디자인패턴 PlayerController, InputManager

HYttt 2025. 1. 6. 20:16

키 입력으로 플레이어 교체

  • custom tag로 플레이어 구분
  • PlayerController의 AddObserver에서 key추가
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CustomTag : MonoBehaviour
{
    public string tag;

    // Start is called before the first frame update
    void Start()
    {
        if (!string.IsNullOrEmpty(tag))
            PlayercController.Instance.AddObserver(tag, gameObject);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayercController : Singleton<PlayercController>
{
    private Dictionary<string, GameObject> players = new();

    private Dictionary<GameObject, IRecevieInput> inputs = new();
    private GameObject currentPlayer;

    IEnumerator Start()
    {
        yield return new WaitForSeconds(3.0f);
        ChangePlayer("Number_1");
    }
    
    public void AddObserver(string key, GameObject obj)
    {
        players.Add(key, obj);
    }

    public void AddInputObserver(GameObject obj, IRecevieInput input)
    {
        inputs[obj] = input;
    }

    private bool ChangePlayer(string key)
    {
        if (players.TryGetValue(key, out var player))
        {
            currentPlayer = player;
            return true;
        }
        
        return false;
    }
    
    public void OnTriggered(string action, bool triggerValue)
    {
        if (triggerValue && ChangePlayer(action))
            return;
        
        if (!currentPlayer)
            return;

        if (ContainsInput())
        {
            inputs[currentPlayer].OnTriggered(action, triggerValue);
        }
    }
    
    public void OnReadValue(string action, Vector2 value)
    {
        if (!currentPlayer)
            return;
        
        if (ContainsInput())
        {
            inputs[currentPlayer].OnReadValue(action, value);
        }
    }

    private bool ContainsInput()
    {
        return inputs.ContainsKey(currentPlayer) && inputs[currentPlayer] != null;
    }
}

InputManager로 입력관리

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

public class MyInputManager : Singleton<MyInputManager>
{
    private InputAction moveAction;
    private InputAction jumpAction;
    
    private InputAction number_1;
    private InputAction number_2;
    
    void Start()
    {
        PlayerInput playerInput = GetComponent<PlayerInput>();
        number_1 = playerInput.actions["Number_1"];
        number_2 = playerInput.actions["Number_2"];
        
        jumpAction = playerInput.actions["Jump"];
        moveAction = playerInput.actions["Move"];
    }
    
    void Update()
    {
        var playercController = PlayercController.Instance;
        
        playercController.OnReadValue("Move", moveAction.ReadValue<Vector2>());
        playercController.OnTriggered("Jump", jumpAction.triggered);
        playercController.OnTriggered("Number_1", number_1.triggered);
        playercController.OnTriggered("Number_2", number_2.triggered);
    }
}