Skip to content

develop AttackedPlayer

Sanguk Lee edited this page Jan 13, 2023 · 3 revisions

준비

  • 임시로 플레이어와 적이 될 도형을 각각 다른 형태로 생성
  • Canvas 생성 후 그 안에 Slider 생성 및 Handle Slide Area 삭제

체력 바 스크립트: 플레이어를 따라 움직이기

using UnityEngine;

public class HealthPointBar : MonoBehaviour
{
    private Camera uiCamera;                // UI 카메라를 담을 변수
    private Canvas canvas;                  // 캔버스를 담을 변수
    private RectTransform rectParent;       // 부모의 rectTransform 변수를 저장할 변수
    private RectTransform rectHp;           // 자신의 rectTransform 저장할 변수

    public Vector3 offset = Vector3.zero;   // 플레이어 위치를 기준으로 체력 바를 표시하는 오프셋
    public Transform player;                // 플레이어 위치

    void Start()
    {
        canvas = GetComponentInParent<Canvas>();                    // 부모가 가지고 있는 Canvas 가져오기, 체력바가 포함된 Canvas가 변수로 할당
        uiCamera = canvas.worldCamera;                              // UI를 보여줄 카메라
        rectParent = canvas.GetComponent<RectTransform>();          // 캔버스의 rect 속성
        rectHp = this.gameObject.GetComponent<RectTransform>();     // 체력바의 rect 속성
    }

    //LateUpdate는 Update 이후 실행되는 함수
    private void LateUpdate()
    {
        var screenPos = Camera.main.WorldToScreenPoint(player.position + offset);   // 월드 좌표(3D)를 스크린 좌표(2D)로 변경, 플레이어의 좌표에 오프셋 더함
        var localPos = Vector2.zero;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(rectParent, screenPos, uiCamera, out localPos); // 스크린 좌표에서 캔버스에서 사용할 수 있는 좌표로 변환

        // 변환된 좌표에 HP바를 표시
        rectHp.localPosition = localPos; 
    }
}

체력 바 만들기

  1. 만든 Silder에서 Interactable은 체크 해제를 해준다. 클릭으로 체력바를 움직이지 못하게 하기 위해서다.
  2. Slider의 stretch와 Scale은 아래와 같이 설정한다.

image

  1. Slider > Background는 HP가 깎인 정도를 나타내는 색이다. 사실상 체력 바의 배경이다. 시안성이 좋은 색으로 선택하는 것이 좋다.
  2. Slider > Fill Area의 Rect Transform를 아래와 같이 수정한다.

image

  1. Slider > Fill Area > Fill의 Inspector를 아래와 같이 수정한다.

image

  1. Slider에 HealthPointBar 스크립트를 추가한다.
  2. 만든 Slider를 Prefabs 폴더에 드래그 앤 드랍하여 프리팹을 생성한다.

체력 바 스크립트: 접촉에 의한 피격 판정 만들기

using UnityEngine;
using UnityEngine.UI;

public class PlayerHP : MonoBehaviour
{
    public GameObject hpBarPrefab;      //Instantiate 메서드로 복제할 HP 바 프리펩을 담을 변수
    public Vector3 hpBarOffset = new Vector3(0, -0.65f, 0); // Player를 기준으로 HP 바를 표시할 좌표 오프셋

    public Canvas hpBarCanvas;          // Slider가 들어갈 UI Canvas
    public Slider hpBarSlider;          // Slider의 초기 설정, HP 갱신에 사용할 Slider를 담을 변수

    private GameObject hpBar;           // HP 바 프리팹을 저장할 변수

    public float hp = 100;              // 현재 HP
    public int maxHP = 100;             // HP 최댓값
    public float damage = 0.1f;         // 프레임 당 대미지

    void Start()
    {
        // 플레이어 혹은 적 좌표 + offset에 HP 바 프리팹으로 HP 바 생성하기
        hpBar = Instantiate<GameObject>(hpBarPrefab, hpBarCanvas.transform);

        var _hpbar = hpBar.GetComponent<HealthPointBar>();  // 생성된 HP 바의 Component 가져옴
        _hpbar.player = this.gameObject.transform;          // 플레이어의 좌표
        _hpbar.offset = hpBarOffset;                        // 플레이어의 좌표를 중심으로 체력바의 좌표(오프셋)

        // HP 바를 보이게 설정
        hpBarSlider.gameObject.SetActive(true);
    }

    void OnTriggerStay2D(Collider2D other)
    {
        if (hp > 0)
        {
            hp -= damage;
            hpBar.GetComponent<Slider>().value = hp / maxHP;    // HP 바의 Slider Component를 가져와서 value를 수정
        }
    }
}

스크립트 적용

  1. 빈 오브젝트를 만들어서 '준비' 단계에서 만든 플레이어 도형을 넣는다.
  2. 빈 오브젝트에 Add Component로 Box Colider 2D를 추가, is Trigger를 체크한다. RigidBody 2D도 추가하고 Body Type은 Kinematic으로 한다.
  3. 빈 오브젝트에 PlayerHP 스크립트를 적용한다.
  4. 스크립트의 HpBarPrefab과 HpBarSlider은 '체력 바 만들기'에서 만든 Slider 프리팹을 드래그 앤 드롭해 적용한다.
  5. 마찬가지로 HpBarCanvas에는 '준비'에서 만든 Canvas를 넣어준다.
  6. 적으로 취급할 Object에도 마찬가지로 Box Colider 2D를 추가, is Trigger를 체크한다. RigidBody 2D도 추가하고 Body Type은 Kinematic으로 한다.
Clone this wiki locally