일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- u#
- 포톤
- typeof
- generic
- VRChat
- navmash
- unityai
- Animation
- 티스토리챌린지
- animator
- fusion
- navmashagent
- unity
- c
- 브이알챗
- Default
- 유니티 네비매쉬
- 제네릭
- pothon
- sendcustomnetworkevent
- udon#
- 오블완
- CS
- 유니티
- c#
- Today
- Total
대마법사의 개발 블로그랄까?
[Photon] Fusion Animation 본문
Photon Fusion으로 멀티플레이 상황에서 애니메이션을 동기화 해보자
Trouble Shooting
문제 상황 : 플레이어 에게는 애니메이션이 정상작동하지만 상대방의 입장에서는 애니메이션이 작동하지않는다.
해당 코드
private static readonly int HashIsWalk = Animator.StringToHash("isWalk");
private static readonly int HashIsRun = Animator.StringToHash("isRun");
private static readonly int HashX = Animator.StringToHash("x");
private static readonly int HashY = Animator.StringToHash("y");
public override void FixedUpdateNetwork()
{
if (!HasInputAuthority) return;
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
float mouseX = Input.GetAxis("Mouse X");
float mouseY = Input.GetAxis("Mouse Y");
Vector3 move = new Vector3(horizontal, 0, vertical);
Vector3 rot = new Vector3(mouseX, 0, mouseY);
UpdateRunState();
Move(move);
Rotate(rot);
Jump();
}
//이동
private void Move(Vector3 dir)
{
float h = dir.x;
float v = dir.z;
bool isMoving = h != 0 || v != 0;
if (isRunning)
anim.SetBool(HashIsRun, isMoving);
else
{
anim.SetBool(HashIsWalk, isMoving);
anim.SetBool(HashIsRun, false);
}
float forwardMoveSpeed = isRunning ? forwardRunSpeed : forwardSpeed;
Vector3 movement = transform.forward * v * forwardMoveSpeed + transform.right * h * sideSpeed;
controller.Move(movement * Time.deltaTime);
anim.SetFloat(HashX, h);
anim.SetFloat(HashY, v);
}
위와같이 코드를 짰을때 이동하는것은 멀티로 구현이 되길래 당연히 애니메이션도 같은 방식으로 될줄알았다.
하지만 애니메이션은 조금 다르다.
응 달라
우선 코드에 잘못된점이 좀 있다.
1. 애니메이션 관련 변수가 [Networked] Attribute를 사용하지 않았다.
2. 애니메이션 관련 코드가 Render() 에서 사용되지 않았다.
3. HasInputAuthority가 False면 실행되지 않는다. (음 이건 사실 잘모르겠어서 확인해봐야할듯 수저예정)
아래는 수정된 코드이다.
//Networked를 사용하고 전역변수로 변경
[Networked] float h { get; set; }
[Networked] float v { get; set; }
[Networked] bool isMoving { get; set; }
[Networked] private bool isRunning { get; set; } = false;
public override void FixedUpdateNetwork()
{
if (HasInputAuthority)
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
float mouseX = Input.GetAxis("Mouse X");
float mouseY = Input.GetAxis("Mouse Y");
Vector3 move = new Vector3(horizontal, 0, vertical);
Vector3 rot = new Vector3(mouseX, 0, mouseY);
UpdateRunState();
Move(move);
Rotate(rot);
Jump();
}
}
private void Move(Vector3 dir)
{
h = dir.x;
v = dir.z;
isMoving = h != 0 || v != 0;
float forwardMoveSpeed = isRunning ? forwardRunSpeed : forwardSpeed;
Vector3 movement = transform.forward * v * forwardMoveSpeed + transform.right * h * sideSpeed;
controller.Move(movement * Time.deltaTime);
//FixedUpdateNetwork에서 애니메이션을 실행하지않는다.
}
//Render를 Override하여 애니메이션을 실행한다.
public override void Render()
{
ApplyAnimation();
}
private void ApplyAnimation()
{
if (isRunning)
anim.SetBool(HashIsRun, isMoving);
else
{
anim.SetBool(HashIsWalk, isMoving);
anim.SetBool(HashIsRun, false);
}
anim.SetFloat(HashX, h);
anim.SetFloat(HashY, v);
}
애니메이션에 사용될 Float 변수를 전역변수로 빼주고 Attribute 를 부여해주었다.
Render를 오버라이드하여서 해당 함수내에서 애니메이션을 실행하였다.
수정후 실행
음 상대방한테도 애니메이션이 잘 보인다.
(따봉 두개드립니다.)
자 그럼이제 Docs를 읽어봅시다.
(순서가 굉장히 잘못되었지만..)
https://doc.photonengine.com/ko-kr/fusion/current/concepts-and-patterns/animation
Fusion 2 - 애니메이션 | Photon Engine
애니메이션은 플레이어 입력에 의해 유도되는 움직임 및 동작과 같은 중요한 게임 플레이 피드백을 플레이어에게 제공합니다. 이 문서에서는 Fusion으로 멀티플레이어 게임을 만들 때 적합한 애
doc.photonengine.com
흠... 읽어보면 Render가 아닌 FixedUpdateNetwork() 에서 애니메이션을 실행하여도 되어야할것같은데.. 되지는않는다.
'Unity 한테 정복당하기 > Photon 멀티플레이 게임 제작' 카테고리의 다른 글
유니티 [포톤] Photon Fusion Shared Mode (1) | 2025.05.11 |
---|---|
Unity 멀티플레이 Photon Fusion 겉핥기 (5) | 2025.05.05 |