【UNET自学日志】Part2 旋转同步

时间:2022-09-04 03:53:36

在正式开始设置旋转的同步之前,先进行Network场景的设置,使得在Menu这一场景下连接服务器,然后在Main场景中开始游戏,断开连接后再次回到Menu场景。

我们需要的时候将Main中的NetworkManager复制到Menu场景中,并且删除Main中的NetworkManager,然后在Build Setting中添加两个场景,Menu在Main之前。

接着需要在NetworkManager物体的Network Manager组件中,将Menu设为Offine Scene,Main设为Online Scene。


接下来我们进入正题——旋转的同步

新建脚本Player_SyncRotation

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class Player_SyncRotation : NetworkBehaviour {

[SyncVar]private Quaternion syncPlayerRotation;
[SyncVar]private Quaternion syncCamRotation;

[SerializeField]private Transform playerTransform;
[SerializeField]private Transform camTransform;
[SerializeField]private float lerpRate=15;


void FixedUpdate ()
{
TransmitRotations();
LerpRotations();
}

void LerpRotations()
{
if (!isLocalPlayer)
{
playerTransform.rotation = Quaternion.Lerp(playerTransform.rotation, syncPlayerRotation, Time.deltaTime * lerpRate);
camTransform.rotation = Quaternion.Lerp(camTransform.rotation, syncCamRotation, Time.deltaTime * lerpRate);
}
}

[Command]
void CmdProvideRotationToServer(Quaternion playerRot, Quaternion camRot)
{
syncPlayerRotation = playerRot;
syncCamRotation = camRot;
}

[Client]
void TransmitRotations()
{
if (isLocalPlayer)
{
CmdProvideRotationToServer(playerTransform.rotation, camTransform.rotation);
}
}
}
将脚本添加到Player上,将Player物体拖到playerTransform上,将Player的子物体FirstPersonCharacter拖到camTransform上。旋转同步设置完成。


额外再补充:Player的生成点问题

Player的生成点一直是固定的一个位置,现在我们要将Player的生成点设置为固定的几个位置,随机选择一个位置生成。

首先我们需要新建一个空物体,称其为Spawn,再新建一个空物体命名为SpawnPoints,将Spawn成为其子物体。

在Spawn中添加组件NetworkStartPosition,并复制Spawn物体,随意的放置到其他的位置。至此,生成点的设置完成。