본문 바로가기
개발일지/게임개발

유니티 3D 게임 개발 - 체력, 총알 수 UI 제작

by 라이티아 2024. 12. 4.

이러한 형태의 일반 상태, 조준상태가 달라지는 UI를 만들어 보려 한다

 

우선 게임 창에서 작게 검은색 상자 UI를 만들어 준다

 

이렇게 플레이어를 따라다니는듯한 느낌을 줄 수 있다

이제 여기에 플레이어가 조준을 하고 있는가에 따라서 각도 변화를 주기 위한 스크립트를 제작한다

 

public class PlayerUI : MonoBehaviour
{
    private PlayerMovement playerMovement;
    private RectTransform rectTransform;

    void Start()
    {
        playerMovement = GameObject.FindWithTag("Player").GetComponent<PlayerMovement>();
        rectTransform = gameObject.GetComponent<RectTransform>();
    }

    void Update()
    {
        Vector3 targetAngle = playerMovement.isAiming ? new Vector3(0f, 30f, 0f) : new Vector3(0f, 0f, 0f);

        Vector3 currentAngle = rectTransform.rotation.eulerAngles;
        Vector3 newAngle = Vector3.Lerp(currentAngle, targetAngle, Time.deltaTime * 5f);

        rectTransform.rotation = Quaternion.Euler(newAngle);
    }
}

플레이어가 조준을 하고 있는가를 나타내는 bool값을 받아온뒤, 이를 삼항 연산자를 통해서 목표를 정하고 있다

 

이때 Lerp를 사용하여 자연스러운 변화를 유도하고 있다

이렇게 잘 변화하고 있는것을 알 수 있다 다만, 현재 canvas에 원근감이 없어서 이를 적용시켜 주어야 한다

우리의 GPT선생님에게 물어본다

 

Canvas를 worldspace에서 다루라고 하는데, 잘 해보지 못한 영역이라서 공부를 해야 할 것 같다

 

해결법을 찾았다

 

GPT가 알려준 방법은 전부 아니였고, Canvas를 추가로 생성해서 해당 Canvas를 조절하는 방식으로 하면 된다

 

다만, 이렇게 할 시, Canvas가 플레이어를 따라다니지는 않기 때문에 직접 작성을 해주어야 한다

 

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class PlayerUI : MonoBehaviour
{
    private PlayerMovement playerMovement;
    private RectTransform rectTransform;
    public TextMeshProUGUI bulletLeft;

    void Start()
    {
        playerMovement = GameObject.FindWithTag("Player").GetComponent<PlayerMovement>();
        rectTransform = gameObject.GetComponent<RectTransform>();
    }

    void Update()
    {
        Vector3 targetAngle = playerMovement.isAiming ? new Vector3(0f, 20f, 0f) : new Vector3(0f, 0f, 0f);

        // 로컬 좌표계를 기준으로 회전
        Vector3 currentLocalAngle = rectTransform.localEulerAngles;
        Vector3 newLocalAngle = Vector3.Lerp(currentLocalAngle, targetAngle, Time.deltaTime * 10f);

        rectTransform.localRotation = Quaternion.Euler(newLocalAngle);
    }

}

플레이어의 하위에 있게 하면서, 회전을 시도할시, 로컬 좌표계를 기준으로 회전을 하게 한다

 

잘 회전되는 것을 볼 수 있다