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

14138 단어 photon포톤photon

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

}

좋은 웹페이지 즐겨찾기