추가할 애니메이션 클립을 애니메이션 컨트롤러에 추가하고
Parameter에서 클립이 실행될 조건을 추가한다.
IsDead가 참일때 캐릭터가 죽는 모션 실행.
플레이어의 컴포넌트에 Photon Animator View의
IsDead 파라미터를 동기화 상태를 'Continuous'로 변경해준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
public class Shooting : MonoBehaviourPunCallbacks
{
public Camera FPS_camera;
public GameObject hitEffectPrefab;
[Header("Health Related Stuff")]
// 시작 체력을 실수형 변수에 100으로 담는다.
public float startHealth = 100;
private float health;
public Image healthBar;
//애니메이터 변수 선언
private Animator animator;
private void Start()
{
//초기 체력을 starthealth로 설정
health = startHealth;
//heath bar 이미지 채워지는 영역 startHealth에 비례해서 설정;
healthBar.fillAmount = health / startHealth;
//Animator 컴포넌트를 찾아서 할당
animator = GetComponent<Animator>();
}
public void Fire()
{
RaycastHit _hit;
Ray ray = FPS_camera.ViewportPointToRay(new Vector3(0.5f, 0.5f));
if(Physics.Raycast(ray, out _hit, 1000))
{
Debug.Log(_hit.collider.gameObject.name);
// CreatedHitEffect 를 모든 클라이언트가 볼 수 있도록 Pun RPC이용해 호
photonView.RPC("CreatedHitEffect", RpcTarget.All, _hit.point);
}
//감지해온 콜라이더의 태그가 플레이어일 경우 && 자기자신이 아닌 경우
if(_hit.collider.gameObject.CompareTag("Player") && !_hit.collider.gameObject.GetComponent<PhotonView>().IsMine)
{
//RPC(다른 모든 클라이언트들에게 메소드를 전파하는 역할
//RPC("실행할 메소드", 메소드를 전파받을 대상, 메소드에 입력할 매개변수);
_hit.collider.gameObject.GetComponent<PhotonView>().RPC("TakeDamage", RpcTarget.AllBuffered, 10f);
}
}
// RPC용 메서드이므로 PunRPC attribute를 추가
[PunRPC]
public void TakeDamage(float _Damage, PhotonMessageInfo info)
{
// 입력받은 데미지 만큼 체력 차
health -= _Damage;
// 체력 게이지바 업데이트
healthBar.fillAmount = health / startHealth;
Debug.Log(health);
if(health <= 0 )
{
Die();
// Sender는 메소드를 보내주는 객체 즉, 데미지를 가하는 객체
// Owner는 전파받은 메소드를 스스로 실행해주는 해당 객체기 때문에 데미지를 입은 객체
Debug.Log(info.Sender.NickName + " killed" + info.photonView.Owner.NickName);
}
}
// RPC용 메서드, HitEffect가 Room내의 모든 플레이어가 볼 수 있도록 한다.
[PunRPC]
public void CreatedHitEffect(Vector3 position)
{
GameObject hitEffectGameObeject = Instantiate(hitEffectPrefab, position, Quaternion.identity);
Destroy(hitEffectGameObeject, 0.5f);
}
void Die()
{
//플레이어가 피격되었을 때만 실행되므로
if(photonView.IsMine)
{
// 애니메이터의 IsDead 컨디션을 트루로 변경
animator.SetBool("IsDead", true);
}
}
}