Chapter 10-3. 생존킷 : 마우스 커서 감추기

Date:     Updated:

카테고리:

태그:

인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click

생존 킷 : 마우스 커서 감추기

  • 평소 게임 땐 마우스 커서를 비활성화 한다. 커서와 크로스헤어와 같이 있으면 헷갈리니까..
  • 컴퓨터 모니터 화면 이미지 평소엔 비활성화
    • E키 누르면 컴퓨터 켜짐 👉 이때만 마우스 커서 활성화
      • 👉 📜ActionController 에서 감지해야 함
    • ESC키 누르면 컴퓨터 꺼짐 👉 마우스 커서 다시 비활성화
      • 컴퓨터 자체에서 ESC키 입력 감지

📜ComputerKit

    [SerializeField] private GameObject go_BaseUI;  // 모니터 화면 배경 이미지UI
    public bool isPowerOn = false; // 전원 켜진 상태인지. 중복 켜기 방지.

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked; 
        Cursor.visible = false; 

        theInventory = FindObjectOfType<Inventory>();
        theAudio = GetComponent<AudioSource>();
    }

    void Update()
    {
        if (isPowerOn)
            if (Input.GetKeyDown(KeyCode.Escape))
                PowerOff();
    }

    public void PowerOn() // 📜ActionController 에서 호출
    {
        Cursor.lockState = CursorLockMode.None;
        Cursor.visible = true; 

        isPowerOn = true;
        go_BaseUI.SetActive(true);
    }

    private void PowerOff()
    {
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;

        theToolTip.HideToolTip();
        isPowerOn = false;
        go_BaseUI.SetActive(false);
    }
  • 게임이 시작되면(컴퓨터 오브젝트가 활성화 되면)
    • 게임 전체에서 마우스 커서를 잠그고 보이지 않게 한다. 즉, 이 게임에선 윈도우 마우스 커서가 보이지 않게 할 것이다. 클릭이 필요하고 이럴 때만 윈도우 마우스 커서를 활성화 할 것이다!
      // Cursor.lockState = CursorLockMode.Confined; 👉 마우스 커서가 게임의 창 밖으로 이탈되지 않도록 함.
      // Cursor.lockState = CursorLockMode.Locked; 👉 마우스 커서 정상 상태. 게임 중에 마우스 커서가 보임.
      Cursor.lockState = CursorLockMode.Locked; // 👉 마우스 커서를 게임 중앙 좌표에 고정시키고 잠궈버린다. 렌더링도 하지 않게 한다.
      Cursor.visible = false; // 마우스 커서를 단순히 렌더링 하지 않는다. CursorLockMode.Locked 에서도 렌더링 안하게 해주지만  보통 같이 쓴다고 한다.
      
  • 마우스 커서 활성화 👉 컴퓨터 가까이에 가서 컴퓨터를 바라보고 E키를 눌러 컴퓨터를 켰을 때만
    • PowerOn()
      • 컴퓨터 활성화 (마우스 커서 활성화, 모니터 이미지 활성화)
      • 📜ActionController 에서 호출 할 것이다.
        • 메인 카메라의 Raycast 와 충돌하면 액션 텍스트도 띄울것이고 그 때 E키를 누르면 컴퓨터가 켜지도록
    • PowerOff()
      • 컴퓨터 비활성화 (마우스 커서 비활성화, 툴팁 비활성화, 모니터 이미지 비활성화)
        • 📜ComputerKit 내의 Update 문에서 ESC키를 감지하고 입력 되면 이 함수 호출

image

플레이어가 모니터를 바라볼 때 액션 텍스트를 띄워야 하기 때문에 모니터 부분에 Box Collider 를 추가했다. 메인 카메라의 Raycast 를 맞을 수 있도록 하기 위해서.

image

컴퓨터의 태그와 레이어를 “Computer”로.

image

go_BaseUI에 모니터 이미지 할당.


📜ActionController

    private bool lookComputer = false; // 컴퓨터를 바라볼 시 true
    [SerializeField] private ComputerKit theComputer; // 📜ComputerKit.cs

    void Update()
    {
        CheckAction();
        TryAction();
    }

    private void CheckAction()
    {
        if (Physics.Raycast(transform.position, transform.forward, out hitInfo, range, layerMask))
        {
            if (hitInfo.transform.tag == "Item")
                ItemInfoAppear();
            else if (hitInfo.transform.tag == "Weak_Animal")
                MeatInfoAppear();
            else if (hitInfo.transform.tag == "Fire")
                FireInfoAppear();
            else if (hitInfo.transform.tag == "Computer")
                ComputerInfoAppear();
            else
                InfoDisappear();
        }
        else
            InfoDisappear();
    }

    private void TryAction()
    {
        if(Input.GetKeyDown(KeyCode.E))
        {
            CheckAction();
            CanPickUp();
            CanMeat();
            CanDropFire();
            CanComputerPowerOn();
        }
    }

    private void ComputerInfoAppear()
    {
        if (!hitInfo.transform.GetComponent<ComputerKit>().isPowerOn)
        {
            Reset();
            lookComputer = true;
            actionText.gameObject.SetActive(true);
            actionText.text = "컴퓨터 가동 " + "<color=yellow>" + "(E)" + "</color>";
        }
    }

    private void InfoDisappear()
    {
        pickupActivated = false;
        dissolveActivated = false;
        firedLookActivated = false;
        lookComputer = false;  // 추가 !
        actionText.gameObject.SetActive(false);
    }

    private void CanComputerPowerOn()
    {
        if (lookComputer)
        {
            if (hitInfo.transform != null)
            {
                if (!hitInfo.transform.GetComponent<ComputerKit>().isPowerOn)
                {
                    hitInfo.transform.GetComponent<ComputerKit>().PowerOn();
                    InfoDisappear();
                }
            }
        }
    }
  • CheckAction()
    • 메인카메라의 Raycast 가 부딪친 대상이 컴퓨터라면 컴퓨터의 액션 텍스트를 띄우기 위해 ComputerInfoAppear() 호출
  • ComputerInfoAppear()
    • 컴퓨터가 현재 가동중이 아니라면 컴퓨터의 액션 텍스트 띄우고 lookComputer는 true 값으로 변경
  • TryAction()
    • 매 프레임마다 E키가 들어왔나 감지한다. CanComputerPowerOn() 실행
  • CanComputerPowerOn()
    • lookComputer가 true 인 상태이고 컴퓨터가 가동중이 아니라면 컴퓨터 이미지를 활성화 하고 액션 텍스트는 비활성화 한다.
      • 📜ComputerKit의 PowerOn 함수 실행

image

  • layerMask에 “Computer”레이어를 추가하여 메인카메라의 Raycast를 컴퓨터가 받을 수 있도록 한다.
  • theComputer에 📜ComputerKit 가 붙어 있는 컴퓨터 오브젝트 할당


  • 📜Inventory 와 📜CraftManual도 창이 활성화 될 때 마우스 커서를 활성화 하였고, 창이 비활성화 되면 마우스 커서도 다시 비활성화 되게 코드를 추가해주었다.
    • 이 부분은 다음 포스트에서 게임매니저를 통해 모든 창들의 커서 활성화/비활성화를 일괄 관리할 것이다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 3 카테고리 내 다른 글 보러가기

댓글 남기기