ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 AOS게임 만들기 - 체력바 UI 구현
    유니티 2022. 5. 23. 12:55
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class hp_mp_update : MonoBehaviour
    {
        public Slider hp_slider;
        public Slider mp_slider;
        // public Slider exp_slider; 아직 사용x
        public Text hp_text;
        public Text mp_text;
        // public Text exp_text; 아직 사용x
        public Camera cam;
        public Stats stats;
        
        void Start(){
            cam = Camera.main;
            stats = cam.GetComponent<Camera_Work>().player.GetComponent<Stats>(); //스텟 스크립트 지정 UI는 따로 떨어져있기때문에 다른 오브젝트에서 값을 빌려와야 함
            hp_slider= GameObject.Find("hp_slider").GetComponent<Slider>();
            mp_slider= GameObject.Find("mp_slider").GetComponent<Slider>();
            hp_slider.minValue = 0;
            mp_slider.minValue = 0;
    
        }
         void Update()
        { 
            hp_slider.maxValue = stats.maxHp;//슬라이더의 최대값을 스텟의 최대체력으로 지정
            mp_slider.maxValue = stats.maxMp;//슬라이더의 최대값을 스텟의 최대마나으로 지정
            hp_slider.value = stats.hp;//슬라이더의 값을 스텟의 체력으로 지정
            mp_slider.value = stats.mp;//슬라이더의 값을 스텟의 마나으로 지정
            hp_text.text=(stats.hp.ToString()+"/"+stats.maxHp.ToString());//텍스트의 값을 스텟의 체력으로 지정
            mp_text.text=(stats.mp.ToString()+"/"+stats.maxMp.ToString());//텍스트의 값을 스텟의 마나으로 지정
    
        }
    
    }

    기능1.이동기능 (마우스로 클릭한 위치로 이동)

    기능2.스탯(공격력,방어력,체력,마나,이동속도 등)

    기능3.공격 및 스킬(일반공격,스킬)

    기능4.상점,옵션,미니맵등 각종 UI

    기능5.매치메이킹 시스템

    기능6.미니언 AI(공격로를 따라 이동)

    오늘은 기능 4를 구현 해보겠습니다.

    우선 캐릭터 hp와 mp를 나타내주는 상태창을 만들어보겠습니다.

    계층구조에 오른쪽마우스->UI->캔버스를 눌러 생성해줍니다.

    그후 생성된캔버스에 슬라이더를 추가해줍니다.

    저희는 슬라이더의 막대부분만 사용할것 이기 때문에 헨들 오브젝트(handle slide Area)는 삭제해줍니다.

    핸들을 삭제한 슬라이더

     

    각 오브젝트의 설정값입니다.

    fill 오브젝트의 image 컴포넌트의 컬러를 빨간색으로 조정합니다 체력이 만땅차있으면 빨간색 으로표시되어야겟죠?

    background 오브젝트또한 image 컴포넌트의 컬러를 빨간색에서 살짝 검은색이 섞인값으로 바꿔줄게요.

    이제 slider 오브젝트의 컴포넌트 slider의 value값을 조정해보면 

    이런식으로 채워지는것을 볼수 있습니다. 이것을 복사해서 hp와 mp로 하겟습니다.

    아까 한것과같이 색만 변경해주면 파란색 슬라이더가 생긴것을 볼 수 있습니다.

    이제 빈오브젝트를하나 생성하여 이름을 hp/mp로 하겠습니다.

    hp와 mp를 넣어주겠습니다.

    넣어진 모습

    hp와 mp에 text를 추가할게요

    생성후엔 rect transform 는 건들이지 않고

    text 컴포넌트의 paragraph를 중앙 중앙으로 맞춰줍니다.

    오브젝트의 이름은 Text_hp,Text_mp로 바꿔주겠습니다.

    이제 플레이어의 hp와 mp를 슬라이더와 이어주기만 하면됩니다.

    스크립트를 짜주어야 한다는 이야기죠

    hp/mp 오브젝트에 hp_mp_update 스크립트를 추가합니다.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class hp_mp_update : MonoBehaviour
    {
        public Slider hp_slider;
        public Slider mp_slider;
        // public Slider exp_slider; 아직 사용x
        public Text hp_text;
        public Text mp_text;
        // public Text exp_text; 아직 사용x
        public Camera cam;
        public Stats stats;
        
        void Start(){
            cam = Camera.main;
            stats = cam.GetComponent<Camera_Work>().player.GetComponent<Stats>(); //스텟 스크립트 지정 UI는 따로 떨어져있기때문에 다른 오브젝트에서 값을 빌려와야 함
            hp_slider= GameObject.Find("hp_slider").GetComponent<Slider>();
            mp_slider= GameObject.Find("mp_slider").GetComponent<Slider>();
            hp_slider.minValue = 0;
            mp_slider.minValue = 0;
    
        }
         void Update()
        { 
            hp_slider.maxValue = stats.maxHp;//슬라이더의 최대값을 스텟의 최대체력으로 지정
            mp_slider.maxValue = stats.maxMp;//슬라이더의 최대값을 스텟의 최대마나으로 지정
            hp_slider.value = stats.hp;//슬라이더의 값을 스텟의 체력으로 지정
            mp_slider.value = stats.mp;//슬라이더의 값을 스텟의 마나으로 지정
            hp_text.text=(stats.hp.ToString()+"/"+stats.maxHp.ToString());//텍스트의 값을 스텟의 체력으로 지정
            mp_text.text=(stats.mp.ToString()+"/"+stats.maxMp.ToString());//텍스트의 값을 스텟의 마나으로 지정
    
        }
    
    }

    이렇게 스크립트까지 짜놓으면 실시간으로 hp와 maxhp값이 바뀌는것도 문제없이 표시해줄 수 있겟네요.

    자이제 플레이어의 머리위에도 만들어 보겠습니다.

    방금 만든 canvas를 플레이어한테 복사해 넣어준뒤 canvas 컴포넌트의 랜더링모드를 월드공간으로 바꿔줍니다

    그후 사이즈와 위치를 지정해주세요 그후 실행시켜보면 캐릭터의 회전에 따라 같이 회전하는것을 볼 수 있습니다 그러나 회전하지 않게 하고싶잖아요?

    그럼 스크립트를하나 추가해줍니다.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    
    public class angle_fixed : MonoBehaviour
    {
        void Update()
        {
            this.gameObject.transform.eulerAngles = new Vector3(0, 45, 0);
        }
    
    }

    이렇게하면 카메라가 45도 돌아있으니 항상 일정한 모습만 보여주는 형태가 되는것 입니다.

    이제 hp와mp Ui는 다만들었군요 

    상점을 구현해봅시다

    상점구현은 다음에 포스팅해보겠습니다.

    댓글

Designed by Tistory.