Unity/기록

상호작용 기능 구현

우대비 2024. 6. 22. 00:33
반응형

 

NPC와 상호작용하는 기능을 구현하였습니다.

 

NPC Manager

 

 

JustKnight/Assets/Scripts/NPC/NpcManager.cs at main · znlsnel/JustKnight

2D Unity Project. Contribute to znlsnel/JustKnight development by creating an account on GitHub.

github.com

NPC와 캐릭터가 근접해지면 상호작용을 관리하는 script에 상호작용 Action을 저장하게 하였습니다.

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.GetComponent<PlayerController>() == null)
            return;

    InputManager.instance._interactionHandler.AddIAction(gameObject, () => 
    {
        UIHandler.instance._dialogueSystem.OpenNPCDialogue(_npcName, 1);
   //Debug.Log("NPC와의 상호작용 시작!");
        InputManager.instance._interactionHandler.RegisterCancelAction(() =>
        { 
            UIHandler.instance._dialogueSystem.CloseNPCDialogue(); 
            //Debug.Log("취소 Action 등록 ! ");
        });
   });
	//Debug.Log("NPC 상호작용 목록에 등록");
}

TriggerEnter2D에 플레이어가 들어오면 Interaction목록에 함수를 Action으로 넣습니다.

그와 동시에 CancelAction을 넣어주고 있는데

상호작용키를 이용하여 상점이나 대화창을 열때 다시 한번 상호작용키를 누르면

다른 NPC와 상호작용을 하는 것이 아니라 현재 진행중인 것이 종료되게 하기 위함입니다.

 

private void OnTriggerExit2D(Collider2D collision)
{
    if (collision.gameObject.GetComponent<PlayerController>() == null)
        return;

    InputManager.instance._interactionHandler.Remove(gameObject);
    //Debug.Log("NPC 상호작용 목록에 등록 해제");

}

플레이어가 Collision에 나가게 되면 상호작용 목록에 해당 NPC의 Action을 제거합니다.

 

Interaction Handler

 

JustKnight/Assets/Scripts/Player/InteractionHandler.cs at main · znlsnel/JustKnight

2D Unity Project. Contribute to znlsnel/JustKnight development by creating an account on GitHub.

github.com

 

Dictionary<GameObject, Action> _interactions = new Dictionary<GameObject, Action>(10);
Action _onCancel;

public void ExcuteInteraction()
{
    if (_onCancel != null)
    {
        _onCancel.Invoke();
        _onCancel = null;
        return;
    }

    if (_interactions.Count == 0)
    {
        Debug.Log("상호작용할 NPC가 주변에 없습니다."); 
        return;
    }

    Vector3 playerPos = GameManager.instance.GetPlayer().transform.position;
    float curDist = 100000.0f;
    Action ac = null;

    foreach (var action in _interactions)
    {
        float dist = (action.Key.gameObject.transform.position - playerPos).magnitude;
        if (curDist > dist)
        {
            curDist = dist;
            ac = action.Value;
        }
    }

    ac?.Invoke(); 
}

상호작용 키를 누르면 실행되는 함수 입니다

현재 취소대기중인 UI가 있다면 (상점, 대화창) 상호작용 하는 것이 아닌 취소를 합니다.

이후 상호작용이 가능한 오브젝트들을 순회하여 가장 가까운 오브젝트를 선택하여 상호작용합니다.

 

 

반응형
LIST

'Unity > 기록' 카테고리의 다른 글

NPC 대화, 퀘스트 시스템  (2) 2024.09.02
NPC 대화창 구현  (0) 2024.06.22
인벤토리 기능  (0) 2024.06.13
Item System 구현  (0) 2024.06.08
Unity Shader Hp Bar  (0) 2024.05.14