统一同步玩家位置(镜像)
Syncronize player position in unity (Mirror)
目标:在使用镜像网络的 Unity 多人游戏中同步玩家位置 API
问题:
使用NetworkTransform组件位置似乎没有精确同步,客户端和服务器都看到玩家在错误的位置,玩家往往无缘无故地飞起来
我尝试制作一个单独的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
public class PlayerSyncronization : NetworkBehaviour
{
[SyncVar]
public Vector3 syncPosition;
[SyncVar]
public Quaternion syncRotation;
public float lerpRate = 15;
private void FixedUpdate()
{
TransmitPosition();
Lerp();
}
void Lerp()
{
if (!hasAuthority) return;
transform.position = Vector3.Lerp(transform.position, syncPosition, Time.deltaTime * lerpRate);
transform.rotation = Quaternion.Lerp(transform.rotation, syncRotation, Time.deltaTime * lerpRate);
}
[ClientCallback]
void TransmitPosition()
{
CmdProvidePositionToServer(transform.position, transform.rotation);
}
[Command]
void CmdProvidePositionToServer(Vector3 pos, Quaternion rot)
{
syncPosition = pos;
syncRotation = rot;
}
}
但是网络变换组件的结果是一样的,即使一个玩家停止行走,另一边他继续行走直到他从地图上掉下来
这些是我使用脚本得到的 errors/warning
信息:
- 玩家移动是客户端,因为我使用的是根运动。
- 我无法使用 IsLocalPlayer,因为它仅在播放器由 NetworkManger 直接生成并且我的播放器由单独的脚本生成时才有效。
- 现在,即使我没有使用它,我的 PlayerPrefab 中也有一个 CharacterController
- 我正在使用 Steamworks 让玩家通过互联网连接
如果需要更多信息,请告诉我。
我知道问题出在我使用的角色控制器上,所以在播放器脚本中我检查了玩家是否有权限,如果没有我销毁了角色控制器,如果我在服务器上销毁了它我更换了它与一个没有物理的普通对撞机,所以我仍然可以碰撞
目标:在使用镜像网络的 Unity 多人游戏中同步玩家位置 API
问题:
使用NetworkTransform组件位置似乎没有精确同步,客户端和服务器都看到玩家在错误的位置,玩家往往无缘无故地飞起来
我尝试制作一个单独的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
public class PlayerSyncronization : NetworkBehaviour
{
[SyncVar]
public Vector3 syncPosition;
[SyncVar]
public Quaternion syncRotation;
public float lerpRate = 15;
private void FixedUpdate()
{
TransmitPosition();
Lerp();
}
void Lerp()
{
if (!hasAuthority) return;
transform.position = Vector3.Lerp(transform.position, syncPosition, Time.deltaTime * lerpRate);
transform.rotation = Quaternion.Lerp(transform.rotation, syncRotation, Time.deltaTime * lerpRate);
}
[ClientCallback]
void TransmitPosition()
{
CmdProvidePositionToServer(transform.position, transform.rotation);
}
[Command]
void CmdProvidePositionToServer(Vector3 pos, Quaternion rot)
{
syncPosition = pos;
syncRotation = rot;
}
}
但是网络变换组件的结果是一样的,即使一个玩家停止行走,另一边他继续行走直到他从地图上掉下来
这些是我使用脚本得到的 errors/warning
信息:
- 玩家移动是客户端,因为我使用的是根运动。
- 我无法使用 IsLocalPlayer,因为它仅在播放器由 NetworkManger 直接生成并且我的播放器由单独的脚本生成时才有效。
- 现在,即使我没有使用它,我的 PlayerPrefab 中也有一个 CharacterController
- 我正在使用 Steamworks 让玩家通过互联网连接
如果需要更多信息,请告诉我。
我知道问题出在我使用的角色控制器上,所以在播放器脚本中我检查了玩家是否有权限,如果没有我销毁了角色控制器,如果我在服务器上销毁了它我更换了它与一个没有物理的普通对撞机,所以我仍然可以碰撞