[유니티 네트워크] 애니메이션 동기화
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일 때만 실행되게 하면 동기화가 잘 됩니다. 간단!