240329 - 팀과제 23일차

유시아·2024년 3월 29일
0
post-custom-banner

반갑다.
오늘은 별거 안했는데 별거 했다.
바로가자

InteractionManager

팀원이 지적해준 인터렉션 매니저.
처음에는 엥 내가 이걸 어케써..? 라고 생각했는데 공부하다보니까 별거 아니더라(훗)
요약하자면 그냥 "내가 쓸 함수들을 한 스크립트에 묶어서 필요한 부분에 1줄만 추가"뿐이다.

먼저 매니저를 만들고 필요한 변수들을 선언한다

public class InteractionManager2D : MonoBehaviour
{
    private GameObject curInteractGameobject;
    private IInteractable curInteractable;

    public TextMeshProUGUI promptText;
    public Player player;
   

다음 제일 중요한, 싱글톤화를 한다.
그래야 계속 불러서 쓸 수 있다.
씬 이동 했을때도 계속 불러올 수 있도록 파괴되지 않게 만든다.

public static InteractionManager2D instance = null;
 
void Awake()
{
    if (null == instance)
    {
        //InteractionManager2D.instance.SetPromptText();

        instance = this;

        DontDestroyOnLoad(this.gameObject);
    }
    else
    {
        Destroy(this.gameObject);
    }
}

그리고 대충 코드 짜기 전에 설계 해둔 것을 정리한다.

//디폴트상태 : 안내텍스트x

//public 플레이어 상호작용 함수

//if 플레이어가 퍼즐 가까이 가면

//      if 플레이어가 뭘 안가지고 있으면

//              플레이어가 물건 집도록 안내 텍스트 함수호출
//      elseif (가지고있다면)
//              물건 못집음 함수호출

사실 저 위의 설계는 이미 PlayerInteraction스크립트에 있긴 하다.
인스턴스를 어디에 넣을 지 잠깐 고민하느라 주석으로 정리했던 것 같다ㅋㅋ
아무튼 설계해놓은 주석대로 코드를 짠다.

public void SetPromptText() //시아
{
    if (player.haveItem != null)
    {
        promptText.gameObject.SetActive(false);

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

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

자 이제 매니저를 다 짰으니 PlayerInteraction에 적용시키자.
단 2줄만 넣으면 된다.

public void DeleteCheak()
{
    if(!CastCylinderRays())
    {
        item = null;
        _object = null;
        puzzle = null;
        InteractionManager2D.instance.OffPromptText(); << 이쪽에 하나
    }
}

...

public bool CastCylinderRays()
{
    for (int ii = 0; ii<7;ii++)
    {
        for (int i = 0; i < numberOfRays; i++)
        {
          
            float angle = ((i * 240f) / numberOfRays) - Angle;
            Vector3 direction = Quaternion.Euler(0, angle, 0) * transform.forward;

            Vector3 rayStart = transform.position + Vector3.up * (height*ii);
            RaycastHit hit;

            if (Physics.Raycast(rayStart, direction, out hit, radius))
            {
                if(_object == hit.collider.gameObject && item!=null) return true;

                item = hit.collider.GetComponent<Item>();

                if (hit.collider.gameObject.layer == 12)
                {
                    InteractionManager2D.instance.SetPromptText(); << 이쪽에 하나
                }

끝.
이렇게 ~어쩌고~매니저를 완벽하게 정복하게 되었다. 야호!!!!!!!!!!!!!
벌써 사운드 관리도 이렇게 할 생각에 가슴 떨림ㅋㅋ

에셋 관련

연출을 위한 에셋을 하나 다운받았는데, 제대로 작동되지가 않았다.
튜터님을 2명이나 붙잡고 총합 2시간 가량 고민했는데도 해결이 되지 않았다.
... 에셋 제작자(외국인,,,,,,,)에게 물어볼 수밖에 없었다.
보기만 해도 두려워지는 온갖 영어와 러시아어가 판치는 곳....덜덜덜덜덜
영어 울렁증이 있는 나로써는 마음 단단히 먹고 입장했다.

처음에는 우리 프로젝트의 버젼과 해당 에셋의 버젼이 달라서 생긴 현상이라 생각해서 메일을 넣었다. 그러나 에셋 버전이 달라도 쓸 수 있다 해서 어떻게든 적용시켜보자 전전긍긍 하다 혼자는 해결 불가능하다는 판단을 내렸고,,,,

결국 개발자와 디스코드로...영어로..ㅠㅠ..대화를 하면서 해결했다.

해결 결과, 우리가 쓰는 Urp에 해당 에셋의 urp 렌더러를 추가하면 되는 아주 간단한 문제였다ㄱ-


무서운 메인화면 만들기 성공. 후후.

Thanks to NullTale.

오늘 트러블 슈팅도 훌륭하게 적었다ㅎㅎ^^
(진짜 이렇게 적은거 아님;;)

그리고 간단히 내일 모레 할 일을 정리하며 오늘 하루를 마무리했다.

다음 화에 계속...

profile
패션컴공탈출기
post-custom-banner

0개의 댓글