为什么两个玩家都在做动画,而只有一个玩家应该做动画?



所以我正在尝试构建这个基本的多人游戏,它有点像mmorpg游戏。 到目前为止,这就是它的工作方式。 当我连接到游戏时,我可以看到我的角色走来走去很好,但是当我的朋友连接并静止不动并且我走来走去时,我可以看到我的角色走路并做行走动画,但他的角色也是如此,即使他站在电脑上静止不动,他的角色也会移动。

这是设置。.当我走路(按 W(时,客户端将输入发送到服务器,然后服务器向客户端发送回一个数据包,然后更新玩家位置,这也是我尝试更新玩家动画的地方。

/// <summary>
/// Packet that's received when the server updates the players position.
/// This happens every game tick, even if the player is standing still
/// </summary>
/// <param name="_packet"></param>
public static void PlayerPosition(Packet _packet)
{
//The players id
int _id = _packet.ReadInt();
//The players position
Vector3 position = _packet.ReadVector2();
//GameManager.players[_id].transform.position = position;

//var clientAnimator = GameManager.players[_id].GetComponent<Animator>();
if (position != GameManager.players[_id].position)
{
GameManager.players[_id].GetComponent<Animator>().SetBool("isWalking", true);
GameManager.players[_id].position = position;
}
else
{
GameManager.players[_id].GetComponent<Animator>().SetBool("isWalking", false);
}
}

我做错了什么非常明显的地方吗?

原因:

我敢打赌您的播放器是预制件,因此两个播放器实例都有一个Animator组件,其中引用了同一个AnimatorController

因此,设置布尔值或更改为其中的任何状态会影响两个玩家的Animator。由于这不是同步的,因此它只发生在你这边,而是同时发生在两个玩家身上。


我不知道这在运行时是否可能以简单的方式实现,但解决此问题的方法可能包括为每个播放器实例创建一个新的单个AnimatorController实例(克隆(。

也许可以简单地将Animator.RuntimeAnimatorController克隆为类似的东西

[RequireComponent(typeof(Animator))]
public class AnimatorSetup : MonoBehaviour
{
// Reference this via the Inspector
[SerializeField] private Animator _animator;
private void Awake()
{
// As fallback get it on runtime
if(!_animator) _animator = GetComponent<Animator>();
// Clonet he currently reference animator controller
var newController = Instantiate(_animator.runtimeAnimatorController);
// Use the new instance of the controller for this animator
_animator.runtimeAnimatorController = newController;
}
}

并将其放在播放器预制件上Animator组件旁边。

最新更新