查看: 1685|回复: 0
打印 上一主题 下一主题

[其他] 【UNET自学日志】Part1 UNET的设置与运动同步

[复制链接]

9903

主题

126

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
53480
精华
316

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2016-5-30 00:57:47 |只看该作者 |倒序浏览

以一个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。

      脚本如下:

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.Networking;

  4. public class Player_NetworkSetup:NetworkBehaviour{

  5. [SeriallzeField] Camera FPSCharacterCam;
  6. [SeriallzeField] AudioListener audioListener;

  7.   void Start()
  8. {
  9.    if(isLocalPlayer)
  10.    {
  11.       GameObject.find("Main Camera").SetActive(false);
  12.       GetComponent<CharacterController>().enabled=true;
  13.       GetComponent<UnityStandardAssets.Character.FirstPersonController>().enabled=true;
  14.       FPSCharacterCam.enabled=true;
  15.       audioListener.enabled=true;
  16.     }
  17. }

  18. }
复制代码

3、将脚本Player_NetworkSetup添加到Player中,并在Inspector中,将Player的子物体FirstPersonController赋予Player_NetworkSetup中的FPSCharacterCam和audioListener中。


保存场景,编辑并运行,发现此时一个窗口只控制当前窗口的Player,不会再有同时控制两个物体的问题了,其他的问题也都解决了。

不难发现,对于角色位置的位移动画并没有特别的流畅,这个时候我们要删除Player上的Network Transform组件,并自己写一个脚本解决它!

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.Networking;

  4. public class Player_SyncPosition : NetworkBehaviour {

  5.     [SyncVar]private Vector3 syncPos;
  6.     [SerializeField]Transform myTransform;
  7.     [SerializeField]float lerpRate = 15;

  8.     void FixedUpdate()
  9.     {
  10.         TransformPosition();
  11.         LerpPosition();
  12.     }

  13.     void LerpPosition()
  14.     {
  15.         if (!isLocalPlayer)
  16.         {
  17.             myTransform.position = Vector3.Lerp(myTransform.position, syncPos, Time.deltaTime * lerpRate);
  18.         }
  19.     }

  20.     [Command]
  21.     void CmdProvidePositionToServer(Vector3 pos)
  22.     {
  23.         syncPos = pos;
  24.     }

  25.     [ClientCallback]
  26.     void TransformPosition()
  27.     {
  28.         if (isLocalPlayer)
  29.         {
  30.             CmdProvidePositionToServer(myTransform.position);
  31.         }
  32.     }
  33. }
复制代码
添加脚本到Player 上,将Player物体拖到Player_SyncPosition的MyTransform中,再次运行,发现流畅了不少。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-9-23 05:26 , Processed in 0.111321 second(s), 33 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部