같은 룸에 입장한 네트워크 유저간의 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를 만든후 적용해 주었다
'유니티게임강좌 > 포톤클라우드 네트워크' 카테고리의 다른 글
[포톤클라우드] 로그인 UI 제작 (0) | 2023.04.05 |
---|---|
[포톤클라우드] 로비제작 (0) | 2023.04.05 |
[포톤클라우드] RPC를 활용한 총 발사 로직 (0) | 2023.04.05 |
[포톤클라우드] 주인공 캐릭터의 네트워크 기능 구현 (0) | 2023.04.03 |
[포톤클라우드] JoinRandomRoom와 OnJoinRandomFailed (0) | 2023.03.28 |