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);
}
}