[Unity3D] UI - HP, MP 에너바 조절하기. [Part 2]
※ 주의
이 글은 아마추어가 개인적으로 생각하여 작성하는 것으로, 이곳에 나오는 내용을 맹신하지 않는것을 당부드립니다.
Menu
0. 미리보기
1. HP,MP껍데기 및 기능 만들기.
2. HP,MP 조절을 위한 데미지, 리커버리 만들기.
2. HP,MP 조절을 위한 데미지, 리커버리 만들기.
에셋 스토어에서 무료 파티클을 받아서 하이러키창에 배치하자.
하나는 데미지 또 하나는 리커버리라고 명명하면 된다.
왼쪽이 데미지, 오른쪽이 리커버리 파티클이다.
두개의 오브젝트에 Rigidbody와 BoxColider를 부착하자.
※ 파티클 오브젝트 인스펙터창 정보.
각각에 오브젝트에 일어난 충돌들을 체크하여 플레이어에게 적용할 것이다.
충돌이 일어났을 때 플레이어가 가진 정보를 가져와서 그 정보를 이용하여 HP,MP에 영향을 준다.
충돌을 체크하는 방법에는 2가지가 있다.
OnCollision( 물리현상 O ) | OnTrigger( 물리현상 X ) | ||
OnCollisionEnter() | - 처음 한 번 충돌 시 한 번 호출. - 다시 호출 하려면 충돌 영역을 벗어난 뒤에 다시 부딪히면 된다. | OnTriggerEnter() | 기능은 같다. |
OnCollisionStay() | - 충돌 영역에 존재하는동안 게속 하여 호출한다. | OnTriggerStay() | 기능은 같다. |
OnCollisionExit() | - 충돌 영역에 들어온 후 그 영역을 벗어나면 호출된다. | OnTriggerExit() | 기능은 같다. |
OnCollision을 사용할 시에는 앞에 벽이 존재하는것처럼 충돌을 수행 하지만,
OnTrigger는 충돌만 체크할뿐 통과해 버린다.
이중 우리는 OnTrigger를 사용할 것이다.
OnTrigger를 사용하려면 각 오브젝트에 붙어있는 BoxCollider의 is Trigger를 체크해줘야 한다.
※ 충돌에 의한 움직임이나, 중력은 사용하지 않을 것이므로 Rigidbody에 Is Kinematic을 체크 하도록 하자.
각 기능이 다르기 때문에 2가지의 스크립트로 작성해 보도록 하자.
각각의 스크립트 이름은 Damage, Recover이다.
데미지 스크립트.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class Damage : MonoBehaviour { private PlayerInfo pInfo; // 플레이어의 스크립트가 저장될 변수. // 지속적으로 플레이어의 HP 감소. IEnumerator StartDamage() { while (true) { // 플레이어가 가지고 있는 UIUpdate호출. pInfo.UIUpdate("Damage", "HP", 0.1f); yield return null; } } // 충돌 했을 때. void OnTriggerEnter(Collider _Col) { if (_Col.transform.CompareTag("Player")) { // 플레이어의 스크립트 컴포넌트를 가져온다. pInfo = _Col.GetComponent<PlayerInfo>(); StartCoroutine("StartDamage"); } } // 충돌이 끝났을 때. void OnTriggerExit(Collider _Col) { if (_Col.transform.CompareTag("Player")) { // 코루틴을 멈춘다. StopCoroutine("StartDamage"); // 충돌이 끝난 후 정보를 플레이어의 정보를 게속 가지고 있을 필요가 // 없기 때문에 null로 초기화 해준다. pInfo = null; } } } | cs |
리커버리 스크립트.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class Recover : MonoBehaviour { private PlayerInfo pInfo; // 플레이어의 스크립트가 저장될 변수. // 지속적으로 플레이어의 HP회복. IEnumerator StartRecover() { while (true) { pInfo.UIUpdate("Recover", "HP", 0.1f); yield return null; } } // 충돌 했을 때. void OnTriggerEnter(Collider _Col) { if (_Col.transform.CompareTag("Player")) { pInfo = _Col.GetComponent<PlayerInfo>(); StartCoroutine("StartRecover"); } } // 충돌이 끝났을 때. void OnTriggerExit(Collider _Col) { if (_Col.transform.CompareTag("Player")) { // 코루틴을 멈춘다. StopCoroutine("StartRecover"); // 충돌이 끝난 후 정보를 플레이어의 정보를 게속 가지고 있을 필요가 // 없기 때문에 null로 초기화 해준다. pInfo = null; } } } | cs |
결과.
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] 객체 미리 생성 후 재활용 - Memory pool [Part 1] (0) | 2017.03.20 |
---|---|
[Unity3D] 객체 미리 생성 후 재활용 - Memory pool [Part 0] (0) | 2017.03.20 |
[Unity3D] UI - HP, MP 에너바 조절하기. [Part 1] (1) | 2017.03.16 |
[Unity3D] UI - HP, MP 에너바 조절하기. [Part 0] (0) | 2017.03.15 |
[Unity3D] 조이스틱으로 캐릭터 조종하기. [Part 2] (10) | 2017.03.13 |