-
Notifications
You must be signed in to change notification settings - Fork 2
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;
}
}
- 만든 Silder에서 Interactable은 체크 해제를 해준다. 클릭으로 체력바를 움직이지 못하게 하기 위해서다.
- Slider의 stretch와 Scale은 아래와 같이 설정한다.
- Slider > Background는 HP가 깎인 정도를 나타내는 색이다. 사실상 체력 바의 배경이다. 시안성이 좋은 색으로 선택하는 것이 좋다.
- Slider > Fill Area의 Rect Transform를 아래와 같이 수정한다.
- Slider > Fill Area > Fill의 Inspector를 아래와 같이 수정한다.
- Slider에 HealthPointBar 스크립트를 추가한다.
- 만든 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를 수정
}
}
}
- 빈 오브젝트를 만들어서 '준비' 단계에서 만든 플레이어 도형을 넣는다.
- 빈 오브젝트에 Add Component로 Box Colider 2D를 추가, is Trigger를 체크한다. RigidBody 2D도 추가하고 Body Type은 Kinematic으로 한다.
- 빈 오브젝트에 PlayerHP 스크립트를 적용한다.
- 스크립트의 HpBarPrefab과 HpBarSlider은 '체력 바 만들기'에서 만든 Slider 프리팹을 드래그 앤 드롭해 적용한다.
- 마찬가지로 HpBarCanvas에는 '준비'에서 만든 Canvas를 넣어준다.
- 적으로 취급할 Object에도 마찬가지로 Box Colider 2D를 추가, is Trigger를 체크한다. RigidBody 2D도 추가하고 Body Type은 Kinematic으로 한다.