以一个Fps游戏为例 1、新建一个Plane作为游戏场景内的地板。 2、导入Character包,在场景中添加FirstPersonCharacter中的Prefabs——FPSController,并重命名为Player。 3、在Player中添加一个Capsule子物体作为玩家模型,将此Player保存为一个新的Prefab。 4、在场景中新建一个空物体,重命名为NetworkManager,并添加Network Manager和Network Manager HUD组件。
PS:Hetwork Manager HUD是一个UNET自带的快速开始联网的UI。 5、在Network Manager 组件下的Spawn Info——Player Prefab中,添加之前创建的Player的Prefab。 6、在Player中添加Network Identity组件,并勾选Local Player Authority。 7、在Player中添加Network Transform组件,在Transform Sync Mode中选择Sync Transform。 PS:Transform Sync Mode中还有许多模式,现只需选择同步Transform即可。 到这里就可以保存场景,Bulid And Run,尝试联网了。运行后在编辑器中点击LAN Host,在客户端点击LAN Client,就可以看到有两个Player了,然而不难发现,你在同时控制着两个Player并且同一个场景下还具有三个AudioListener组件,接下来,就要通过自己写脚本来解决这个[color=rgb(85, 85, 85) !important]问题了。 1、在Player的prefab中,将组建Character Controller和FirstPerson Controller关闭(左上角的勾点选掉),将Player子物体中的FirstPersonController的组件Camera和Audio Listener关闭。 2、新建脚本Player_NetworkSetup,添加using UnityEngine.Networking;并将MonoBehaviour改为NetworkBehaviour。 脚本如下: - using UnityEngine;
- using System.Collections;
- using UnityEngine.Networking;
- public class Player_NetworkSetup:NetworkBehaviour{
- [SeriallzeField] Camera FPSCharacterCam;
- [SeriallzeField] AudioListener audioListener;
- void Start()
- {
- if(isLocalPlayer)
- {
- GameObject.find("Main Camera").SetActive(false);
- GetComponent<CharacterController>().enabled=true;
- GetComponent<UnityStandardAssets.Character.FirstPersonController>().enabled=true;
- FPSCharacterCam.enabled=true;
- audioListener.enabled=true;
- }
- }
- }
复制代码3、将脚本Player_NetworkSetup添加到Player中,并在Inspector中,将Player的子物体FirstPersonController赋予Player_NetworkSetup中的FPSCharacterCam和audioListener中。
保存场景,编辑并运行,发现此时一个窗口只控制当前窗口的Player,不会再有同时控制两个物体的问题了,其他的问题也都解决了。 不难发现,对于角色位置的位移动画并没有特别的流畅,这个时候我们要删除Player上的Network Transform组件,并自己写一个脚本解决它! - using UnityEngine;
- using System.Collections;
- using UnityEngine.Networking;
- public class Player_SyncPosition : NetworkBehaviour {
- [SyncVar]private Vector3 syncPos;
- [SerializeField]Transform myTransform;
- [SerializeField]float lerpRate = 15;
- void FixedUpdate()
- {
- TransformPosition();
- LerpPosition();
- }
- void LerpPosition()
- {
- if (!isLocalPlayer)
- {
- myTransform.position = Vector3.Lerp(myTransform.position, syncPos, Time.deltaTime * lerpRate);
- }
- }
- [Command]
- void CmdProvidePositionToServer(Vector3 pos)
- {
- syncPos = pos;
- }
- [ClientCallback]
- void TransformPosition()
- {
- if (isLocalPlayer)
- {
- CmdProvidePositionToServer(myTransform.position);
- }
- }
- }
复制代码 添加脚本到Player 上,将Player物体拖到Player_SyncPosition的MyTransform中,再次运行,发现流畅了不少。
|