Chapter 12-5. 기타 : 수영하기 (호흡 시스템)

Date:     Updated:

카테고리:

태그:

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

🚀 수영

📜PlayerController

    [SerializeField] private float swimSpeed;
    [SerializeField] private float swimFastSpeed;
    [SerializeField] private float upSwimSpeed;
    private float applySpeed;
  • swimSpeed : 수영시 속도
  • swimSpeed : 수영시 Shift 키 눌렀을 때 속도
  • swimFastSpeed : 수영시 Space 키로 위로 떠오를 때 속도
    void Update()  
    {
        if (isActivated && GameManager.canPlayerMove)
        {
            WaterCheck();
            IsGround();
            TryJump();
            if (!GameManager.isWater) // 달리기는 수영 중이 아닐 때만
                TryRun();
            TryCrouch();
            Move();
            MoveCheck();
            CameraRotation();
            CharacterRotation();
        }
    }

    private void WaterCheck()
    {
        if(GameManager.isWater) // 물 속 일 때
        {
            if (Input.GetKeyDown(KeyCode.LeftShift)) // Shift 키 누르면 swimFastSpeed 속도로.
                applySpeed = swimFastSpeed;
            else // 아니라면 swimSpeed 속도로.
                applySpeed = swimSpeed;
        }
    }

    private void TryJump()
    {
        if (Input.GetKeyDown(KeyCode.Space) && isGround && !GameManager.isWater && theStatusController.GetCurrentSP() > 0) 
            Jump();
        else if (Input.GetKey(KeyCode.Space) && GameManager.isWater)
            UpSwim(); // 스페이스 키를 꾹 누르는 중이고 물 속이라면 
    }

    private void UpSwim()
    {
        myRigid.velocity = transform.up * upSwimSpeed;
    }

image


📜WeaponManager

    public IEnumerator WeaponInCoroutine() // 무기 집어넣기
    {
        isChangeWeapon = true;
        currentWeaponAnim.SetTrigger("Weapon_Out");

        yield return new WaitForSeconds(changeweaponDelayTime);

        currentWeapon.gameObject.SetActive(false);
    }

    public void WeaponOut() // 무기 꺼내기
    {
        isChangeWeapon = false;
        currentWeapon.gameObject.SetActive(true);
    }

물 속일 땐 무기 집어넣기 위해 만든 함수. 물 밖으로 나올 땐 자동으로 현재 무기 다시 꺼냄.


📜GameManager

    private WeaponManager theWeaponManager;
    private bool flag = false;

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

        theWeaponManager = FindObjectOfType<WeaponManager>();
    }

    void Update()
    {
        if (isOpenInventory || isOpenCraftManual || isOnComputer || isOpenArchemyTable)
        {
            Cursor.lockState = CursorLockMode.None;
            Cursor.visible = true;

            canPlayerMove = false;
        }
        else
        {
            Cursor.lockState = CursorLockMode.Locked;
            Cursor.visible = false;

            canPlayerMove = true;
        }

        if (isWater)
        {
            if (!flag)
            {
                StopAllCoroutines();
                StartCoroutine(theWeaponManager.WeaponInCoroutine());
                flag = true; // 1번만 실행되게 flag 사용
            }
        }
        else
        {
            if (flag)
            {
                theWeaponManager.WeaponOut();
                flag = false;
            }
        }
    }

게임 매니저에서 물 속일 경우 무기를 집어넣게(한번만), 물 밖일 경우 무기를 꺼내게 하기.


📜CrossHair

if (!GameManager.isWater)일 때만 여러 애니메이션들 재생


🚀 호흡 게이지

✈ 호흡 게이지 UI

image

image

image

Base_UI는 테두리가 되는 배경 이미지이다. Gauge는 가운데 진한 초록색 이미지인데 이미지 타입을 Filled로 하여 수평으로 게이지 값에 따라 채워지게끔 할 것이다. 슬라이더처럼! 평소엔 비활성화 해둔다. 수영할 때만 활성화 할 것이기 떄문이다.

📜Water

    [SerializeField] private float totalOxygen; // 100
    private float currentOxygen;
    private float temp;

    [SerializeField] private GameObject go_BaseUI;
    [SerializeField] private Text text_TotalOxygen;
    [SerializeField] private Text text_currentOxygen;
    [SerializeField] private Image image_gauge;
    void Start()
    {
        originColor = RenderSettings.fogColor;
        originFogDensity = RenderSettings.fogDensity;

        originDrag = thePlayer.GetComponent<Rigidbody>().drag;

        currentOxygen = totalOxygen; // 처음엔 100에서 출발. 여기서 점점 감소될 것.
        text_TotalOxygen.text = totalOxygen.ToString();
    }

    void Update()
    {
        if (GameManager.isWater)
        {
            currentBreatheTime += Time.deltaTime;
            if (currentBreatheTime >= breatheTime)
            {
                SoundManager.instance.PlaySE(sound_WaterBreathe);
                currentBreatheTime = 0;
            }
        }

        DecreaseOxygen(); 
    }

    private void DecreaseOxygen()
    {
        if(GameManager.isWater) // 물 속일땐 currentOxygen 1초에 1씩 감소
        {
            currentOxygen -= Time.deltaTime;
            text_currentOxygen.text = Mathf.RoundToInt(currentOxygen).ToString(); // 정수로 텍스트UI에 저장
            image_gauge.fillAmount = currentOxygen / totalOxygen; // %

            if (currentOxygen <= 0) // 호흡 게이지가 0 이하면 1초에 한번씩 HP를 1씩 달게한다.
            {
                temp += Time.deltaTime;
                if (temp >= 1)
                {
                    thePlayer.GetComponent<StatusController>().DecreaseHP(1); // 1초에 1씩 달게
                    temp = 0;
                }
            }
        }
    }

    private void GetInWater(Collider _player)
    {
        SoundManager.instance.PlaySE(sound_WaterIn);

        go_BaseUI.SetActive(true); // 호흡 게이지 UI 활성화

        // ...

    private void GetOutWater(Collider _player)
    {
        SoundManager.instance.PlaySE(sound_WaterOut);

        if (GameManager.isWater)
        {
            go_BaseUI.SetActive(false); // 호흡 게이지 UI 비활성화
            // ...

image

image

물 속에 있을 땐 호흡 게이지가 점점 줄어든다. 0 이하로 떨어지면 체력도 1초에 1씩 달게 된다.



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

맨 위로 이동하기

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

댓글 남기기