같은 룸에 입장한 네트워크 유저간의 RPC를 이용해 총알이 발사되는 로직을 완성했다. 이제 상대편 네트워크 유저가 발사한 총알에 데미지를 입고 사망하는 로직을 구현하자.  그 반대도 같은 로직이다. 또 사망한 후 일정시간이 지난 후 리스폰(재생,부활) 되게 한다.  이 처리는 새로운 스크립트에서 처리한다. 스크립트를 새로 만들고 이름을 Damage라고 하자 프로젝트뷰의 Resoures폴더에 있는 Player프리팹에 추가한 후 다음과 같이 작성한다.

핵심은 총알을 맞아서 생명수치 hp값이 0이하일 때 캐릭터의 Die 애니메이션을 실행한 후 화면상에 보이지 않게 모든 Renderer 컴포넌트를 비활성화 하는 것이다. 리스폰 시간이 지난 후 불규칙한 위치로 이동시키고 다시 Renderer 컴포넌트를 활성화해 화면에 표시한다.

using System.Collections;
using UnityEngine;


public class Damage : MonoBehaviour { // MonoBehaviourPunCallbacks {
    private Renderer[] renderers;  // 사망 후 투명 처리를 위한 MeshRenderer 컴포넌트의 배열
    private int initHp = 100;  // 캐릭터의 초기 생명치
    public int currHp = 100;  // 캐릭터의 현재 생명치
     private Animator anim;
    private CharacterController cc;

    // 애니메이터 뷰에 생성한 파라미터의 헤시값 추출
    private readonly int hashDie = Animator.StringToHash("Die");
    private readonly int hashRespawn = Animator.StringToHash("Respawn");



    void Awake() {
        // 캐릭터 모델의 모든 Renderer 컴포넌트를 추출한 후 배열에 할당
        renderers = GetComponentsInChildren<Renderer>();
        anim = GetComponent<Animator>();
        cc = GetComponent<CharacterController>(); 
        currHp = initHp;  //현재 생명치를 초기 생명치로 초깃값 설정

    }

    void OnCollisionEnter(Collision coll) {
        // 생명 수치가 0보다 크고 충돌체의 태그가 BULLET인 경우에 생명 수치를 차감
        if (currHp > 0 && coll.collider.CompareTag("BULLET")) {
            currHp -= 20;
            if (currHp <= 0) {
                // 자신의 PhotonView 일 때만 메시지를 출력

                StartCoroutine(PlayerDie());
            }
        }
    }

    IEnumerator PlayerDie() {
        cc.enabled = false; // CharacterController 컴포넌트 비활성화
        anim.SetBool(hashRespawn, false);  // 리스폰 비활성화
        anim.SetTrigger(hashDie); // 캐릭터 사망 애니메이션 실행
        yield return new WaitForSeconds(3.0f);   
        anim.SetBool(hashRespawn, true); // 리스폰 활성화     
        SetPlayerVisible(false); // 캐릭터 투명 처리
        yield return new WaitForSeconds(1.5f);

        currHp = 100;    // 리스폰 시 생명 초깃값 설정       
        SetPlayerVisible(true); // 캐릭터를 다시 보이게 처리
        cc.enabled = true;  // CharacterController 컴포넌트 활성화
    }

    //Renderer 컴포넌트를 활성/비활성화하는 함수
    void SetPlayerVisible(bool isVisible) {
        for (int i = 0; i < renderers.Length; i++) {
            renderers[i].enabled = isVisible;
        }
    }
}

소스코드와 프로젝트를 모두 저장후 빌드후 캐릭터가 피격후 사망후 리스폰되는지 확인해보자.

블러거는 실행후 BULLET Tag가 없다고 해서 Resources/Prefab/Bullet 에서 BULLET Tag를 만든후 적용해 주었다

 

 

+ Recent posts