NGO是unity新推出的联机解决方案,我会在接下来几章介绍如何配置NGO,以及使用NGO联机的代码知识
下载
在package manager中搜索netcode
配置NetworkManager
创建空的游戏物体,命名NetworkManager
添加networkmanager组件,在三角形警告下方选择transport,只有一个,选就是了
创建角色预制体
创建一个游戏角色预制体,为它添加跟随相机(这个不多介绍)
添加Network object组件
添加move组件(建议复制)
using System.Collections;
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
public class Mover : NetworkBehaviour
{
public float speed = .1f;
private void Update() {
if (!IsOwner) return;
Vector3 moveVector = Vector3.zero;
if (Input.GetKey(KeyCode.W)) {
moveVector.z += 1;
}
if (Input.GetKey(KeyCode.S)) {
moveVector.z -= 1;
}
if (Input.GetKey(KeyCode.A)) {
moveVector.x -= 1;
}
if (Input.GetKey(KeyCode.D)) {
moveVector.x += 1;
}
transform.position += moveVector*speed;
}
}
将预制体拖入networkmanager的player prefeb字段
点开NetworkPrefebs List
需要在网络上同步的物体,全都要在这里注册,你也可以新建一个NetworkPrefebs List
将player 注册进去
删除场景中的Player,网络对象如果一开始就存在于场景中,那么它就不是动态生成的,这貌似是句废话,体现在unity中是这样的:运行unity,打开inspector debug模式,可以看到is Spawned字段为false,这个字段用来引用网络对象,它没有生成,不能被在Rpc中引用,我们接下来会看到。
添加UI控制
在画布上加2个按钮,添加控制脚本
using System.Collections;
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;
public class StartMenu : MonoBehaviour {
[SerializeField] public Button StartHost;
[SerializeField] public Button StartClient;
private void Awake() {
StartHost.onClick.AddListener(() => {
NetworkManager.Singleton.StartHost();
gameObject.SetActive(false);
});
StartClient.onClick.AddListener(() => {
NetworkManager.Singleton.StartClient();
gameObject.SetActive(false);
});
}
}
Build设置
点击file->build setting->Player setting
返回buildsetting点击build,新建一个build文件夹,复制路径,选择该文件夹进行build,
黏贴路径,打开Build文件夹,运行exe文件并且运行unity
可以看到他们成功联机了,但是运动没有同步,所有同步操作需要的代码知识在另外一章