[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




결과.