관리 메뉴

caLAB

[유니티 네트워크] 애니메이션 동기화 본문

Unity/유니티 개발

[유니티 네트워크] 애니메이션 동기화

도이(doi) 2021. 11. 18. 11:10
728x90

0. 네트워크 환경 세팅

기본적인 네트워크 스크립트는 아래와 같이 작업해두었습니다. 

networkMgr 스크립트

- 서버 연결

- 방 생성

- 캐릭터 생성

- 다른 플레이어가 방 나가는 것 들어오는 것 체크

- 방에서 나가면 파괴

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;

namespace networkTest
{
    public class networkMgr : MonoBehaviourPunCallbacks
    {
        private GameObject spawnedPlayerPrefab;

        private void Awake()
        {
            PhotonNetwork.ConnectUsingSettings();
        }

        public override void OnConnectedToMaster()
        {
            base.OnConnectedToMaster();
            Debug.Log("Connected to master.");
            PhotonNetwork.JoinOrCreateRoom("room", new RoomOptions { MaxPlayers = 20 }, null);
        }

        public override void OnJoinedRoom()
        {
            base.OnJoinedRoom();
            Debug.Log("joined room.");
            spawnedPlayerPrefab = PhotonNetwork.Instantiate("player", Vector3.zero, Quaternion.identity);
        }

        public override void OnLeftRoom()
        {
            base.OnLeftRoom();
            PhotonNetwork.Destroy(spawnedPlayerPrefab);
        }
        public override void OnPlayerEnteredRoom(Player newPlayer)
        {
            Debug.Log("a new player joined the room.");
            base.OnPlayerEnteredRoom(newPlayer);
        }

        public override void OnPlayerLeftRoom(Player otherPlayer)
        {
            Debug.Log("a player left the room");
            base.OnPlayerLeftRoom(otherPlayer);
        }
    }
}

 

1. 애니메이션 작업 

캐릭터가 갈아가는 애니메이션을 간단하게 만들어주도록 합니다. 

파라미터에는 IsWalking을 bool 타입으로 speed를 float 타입으로 설정해서 추가해주도록 합니다.  

*bool 과 trigger의 차이

trigger는 bool과 유사합니다. 다만, bool은 상태가 전환되고 계속 상태를 유지하면 trigger는 상태가 전환되고 바로 다시 운래 상태로 돌아옵니다. 

Idle에서 Walking으로 갈 때는 IsWalking의 Conditions를 true로 합니다.

반대로, Walking에서 Idle로 갈 때는 false로 합니다.  Has Exit Time의 경우는 체크를 해제합니다.

* Has Exit Time이란?

Has Exit Time은 애니메이션이 실행되고 있을 때 값이 바뀌어도 애니메이션이 끝날 때까지 기다렸다가 다음 애니메이션으로 넘어가는 설정을 하는 것입니다. Has Exit Time을 체크해두면 상태가 바뀌어도 애니메이션의 루틴이 한 번 돌고 다음 상태에 맞는 애니메이션이 실행됩니다. Has Exit Time이 해제되어 있으면, 상태가 바뀌면 바로 그 상태에 맞는 애니메이션이 실행되게 됩니다. 

2. 애니메이션 동기화

애니메이션 동기화의 경우 포톤네트워크에서 동기화 처리를 해주기 때문에 설정만 맞춰주면 됩니다. 우선, 방에 접속했을 때 PhotonNetwork.Instantiate 함수로 생성할 player의 설정을 아래와 같이 해줍니다.

- Animator

- PhotonView : 동기화 시킬 것들을 관측.

- Photon Transform View (위치 동기화)

- Photon Animator View (애니메이션 동기화) : Synchronize Parameters를 discrete로 설정해줄 것. 

- Network PC player 스크립트 : 네트워크 플레이어의 움직임 관련 스크립트

아래는 networkPCPlayer 스크립트 입니다. 

이 스크립트의 핵심은 Upadte에서 PhotonView가 isMine일 때만 움직이도록 설정하는 것입니다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class networkPCplayer : MonoBehaviourPunCallbacks
{
    public PhotonView PV;
    public Animator anim;
    public float speed = 1.0f;
    public float rotationSpeed = 100.0f;
    public GameObject player;

    private void Update()
    {
        if(PV.IsMine)
        {
            player.SetActive(false);

            float translation = Input.GetAxis("Vertical") * speed;
            float rotation = Input.GetAxis("Horizontal") * rotationSpeed;

            translation *= Time.deltaTime;
            rotation *= Time.deltaTime;
            transform.Translate(0, 0, translation);
            transform.Rotate(0, rotation, 0);

            if (translation != 0 || rotation != 0)
            {
                if (translation < 0)
                {
                    anim.SetFloat("speed", -1);
                }
                anim.SetFloat("speed", 1);
                anim.SetBool("IsWalking", true);
            }
            else
            {
                anim.SetFloat("speed", 1);
                anim.SetBool("IsWalking", false);
            }
        }
    }
}

포톤네트워크에서 동기화 처리를 잘 해주기 때문에 포톤네트워크의 컴포넌트를 잘 가져오고, 원하는 움직임이나 애니메이션을 PhotonView.IsMine일 때만 실행되게 하면 동기화가 잘 됩니다. 간단!

728x90
반응형
Comments