240327 - 팀과제...21일차...

유시아·2024년 3월 27일
2

반갑다.
9일만에 돌아온 기가막힌 TIL
바로 시작하자

To do List


일단 2~3주차 투두리스트는 이정도 되겠다.
이중에서 거의완벽or 틀만 완성해두고 나중에 제대로 만들 부분들을 제외해서 이번에 쓸 내용은

게임종료와 상호작용이 되겠다.
사실 다 손보긴 해야함. 근데 일단 한 것부터 씀.

게임종료

게임종료구현은 간단하다.
매번 프로젝트 때마다 단골손님으로 쓰던 Exit함수를 응용한다.

public void GameExit()
{
    #if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
    #else
        Application.Quit();
    #endif
}

베리굿. 해결완. 근데 데이터관리를 하기 시작하면 또 코드를 수정해야겠지..눈물줄줄...

상호작용

제일 시간을 끌면서 고민을 했다가 어처구니없이 해결된 문제.
일단은 팀원이 만들어놓은 플레이어 상호작용 스크립트에 기생해서 해결한다.

 private GameObject curInteractGameobject; // 시아
 private IInteractable curInteractable; // 시아

 public interface IInteractable // 시아
 {
    string GetInteractPrompt();
     void OnInteract();
 }

 public TextMeshProUGUI promptText; // 상호작용 안내 텍스트 Meshpro

쓸 변수들을 선언해준다.
퍼즐 오브젝트들을 인식할 때 필요한 변수들과 상호작용 할 때 안내 텍스트를 위한 변수들.

private void SetPromptText() //시아
{
    if (this.gameObject.transform.GetChild(1).GetComponent<Animator>().GetBool("@GroundHave"))
    {
        promptText.gameObject.SetActive(false);

    }
    else
    promptText.gameObject.SetActive(true);
}

private void OffPromptText() //시아
{
    promptText.gameObject.SetActive(false);
}

public void OnInteractInput(InputAction.CallbackContext callbackContext)
{
    if (callbackContext.phase == InputActionPhase.Started && curInteractable != null)
    {
        curInteractable.OnInteract();
        curInteractGameobject = null;
        curInteractable = null;
        promptText.gameObject.SetActive(false);
    }
}

우선 SetPromptText함수는 안내 텍스트 출력을 위한 함수다
우선 플레이어의 행동에 조건을 보고, 안내 텍스트를 출력할 지 말지에 대해 판단하는건데,
플레이어의 상태가 물건을 들고 있을 때(@GroundHave), 텍스트 출력을 비활성화 한다.
그게 아니면(물건을 들고 있지 않거나, 퍼즐조각과 가까이 있을 때) 텍스트 출력을 활성화 한다.

if (item != null && hit.collider.gameObject.layer == 12)
{
    //Debug.DrawLine(rayStart, hit.point, Color.red);

    _object = hit.collider.gameObject;

    //여기다 상호작용 안내 텍스트 코드 넣기
    SetPromptText();

    Debug.Log("상호작용");
    
    return true;

}

퍼즐 오브젝트는 레이캐스트로 거리를 인식해서 잡을 수 있게 하셨길래 거기다 덧붙여서 퍼즐조각들에 레이어를 Interactable로 바꿨다. 그리고 그 레이어와 플레이어의 거리가 어느정도 됐을 때 안내텍스트가 나오는 함수를 불러오도록 한다.

public void DeleteCheak()
{
    if(!CastCylinderRays())
    {
        item = null;
        _object = null;
        puzzle = null;
        OffPromptText();
    }
}

default상태, 그러니까 플레이어가 아무것도 하지 않는(아이템 들고있지않음, 아이템이 가까이 있지 않음) 상태 일때는 OffPromptText()함수를 불러와 안내 텍스트를 꺼놓는다. 오로지 퍼즐조각이 가까이 있을 때만 나오도록.

그 결과!


Vㅔ리굿. 퍼펙트.

트러블 슈팅

해당 코드를 팀원들과 상의했다.
기본적으로 PlayerInteraction스크립트는 팀원들 모두가 공유해서 쓰는 스크립트라 이쪽에다 코드 붙이는걸 추천하지 않는다고 했다.
따라서 InteractionManager를 새로 생성해서 싱글톤으로 만들어 필요할 때마다 그냥 불러와서 쓰는 방식으로 바꾸는게 어떻냐는 이야기가 나왔다.
근데 이제 문제는
...
...
...
내가 매니저를 다룰 줄 모른다는 것.
...
...
...
대 위기.

다음 화에 계속...

profile
패션컴공탈출기

0개의 댓글