必须建立的五个网路思维
1,这个对象由谁创建
2,这个状态由谁拥有
3,谁可以修改他
4,它是"持续状态"还是"一次性事件"?
5,新玩家加入时,是否需要看到它
此篇真正创建主角并且设置在不同客户端下角色的颜色显示
第一步创建调试场景
将场景和摄像机架设好后开始制作主角的预制体用以自动生成
首先在场景中创建一个胶囊体用来代表角色
联机游戏中,角色除了在主机本地存在还需要在网络中存在以便调用
想要在网络中存在需要在下面添加组件NetWorkObject代表这是一个网络角色
分配NetWork后在FishWork中才会给他分配身份
注意:NetWorkObject应该放在玩家根节点
创建角色显示脚本用于玩家初始化后分配身份以及颜色
完整脚本:
cs
using FishNet.Object;
using UnityEngine;
public class PlayerOwnershipView : NetworkBehaviour
{
[SerializeField]
private Color ownerColor = Color.green;
[SerializeField]
private Color remoteColor = Color.gray;
public override void OnStartClient()
{
base.OnStartClient();
Renderer playerRenderer = GetComponent<Renderer>();
if (playerRenderer != null)
{
playerRenderer.material.color =
IsOwner ? ownerColor : remoteColor;
}
Debug.Log(
$"玩家客户端初始化:" +
$"Name={gameObject.name}," +
$"IsOwner={IsOwner}"
);
}
}
代码分解:
public class PlayerOwnershipView : NetworkBehaviour:继承至NetworkBehaviour和传统的MonoBehaviour不一样,增加了以下功能
IsOwnerIsServerInitializedIsClientInitialized- RPC
- SyncVar
- 网络生命周期
ownerColor:自身颜色
remoteColor:其余玩家角色
OnStartClientp:初始化时调用,这个方法在游戏启动时,会进行调用,场景中每个被检测到的角色都会进来一次,打破了传统单机游戏一个角色一次分配的固有思想,每个角色在进入这个主角的场景时都会进入一次OnStartClientp的调用,进入的角色身上会根据身份不同带有自己的变量,比如是否为主机角色,然后加载对应的方法用以控制
为什么不用start改为OnStartClientp:start是在游戏开始的时候进行直接的调用,而那个时候网络服务器不一定初始化完成,而OnStartClientp是在服务器初始化完成后进行调用
base.OnStartClient();加载父类的方法,也是所有角色进入场景后不论身份都会调用的基础方法
Renderer playerRenderer = GetComponent<Renderer>();
这是得到被调用玩家自身的材质渲染组件,用于后续分配颜色
playerRenderer.material.color =
IsOwner ? ownerColor : remoteColor;
这一段设置材质,意思是这个角色是否为主角也就是IsOwner是否为True,然后选择将 ownerColor :或者remoteColor赋值给该角色的材质组件
这样子进来的角色的身份就全被初始化完成了
总结:生成的角色都会带有该脚本,并在不同的电脑上被调用,而后根据身上的网络组件在电脑本地判断是否为主角,在不同的电脑上设置为不同的身份
下一步,将玩家制作为预制体
想要让玩家自动生成就需要将玩家预制起来,在特定的地方进行赋值,这样才可以完成一个网络游戏中自动生成角色的功能
下一步,配置主角
将玩家作为预制体后进行角色配置以及出生点配置
点击之前拖入的NetworkManager物体,在右侧找到

将玩家预制体拖入PlayerPrefab
在场景中新建两个空物体作为出生点,注意不要让两个空物体重叠
将两个空物体拖入Spawns,第一个是先加载完毕的物体,也就是主角的位置
Add To Default Scene保持默认勾选即可,它可以让Fish知道客户端正在观测哪个网络场景,如果不分配的话会出现服务器生成的玩家,但是客户端看不到
全部拖入后保存,然后重新构建
再次打开两个客户端后主机依次点击两个按钮
再打开客户端点击第二个按钮,可以看到两个屏幕的的角色被成功生成了,并且根据的设置的颜色,在双方的视角中自身和对方的颜色都不一样

这样,两个不同客户端的角色就实现身份的判定了