[유니티] 포톤 애니메이션 연동하기

NOAH·2021년 7월 11일
0

Unity

목록 보기
20/33

API


추가할 애니메이션 클립을 애니메이션 컨트롤러에 추가하고

Parameter에서 클립이 실행될 조건을 추가한다.

IsDead가 참일때 캐릭터가 죽는 모션 실행.

플레이어의 컴포넌트에 Photon Animator View의
IsDead 파라미터를 동기화 상태를 'Continuous'로 변경해준다.

추가 할 스크립트

Reference :전체 스크립트

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);
        }
    }

}

0개의 댓글