简短说明:我正在我的主场景中加载一个添加场景,它的加载很好,但添加场景的GameObject(包含网络标识组件)正在变得禁用.
详细信息: 我正在通过此代码加载一个附加场景,以便添加一个场景加载到我的服务器和所有工作正常的客户端:
[ClientRpc]
public void RpcLoadLevelAcrossNetwork() {
SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
}
Run Code Online (Sandbox Code Playgroud)
虽然它已将我的场景加载到客户端/服务器,但具有网络标识的对象是禁用的(这是默认行为,因为我检查了Unity UNetSceneObjects,它指出:
加载场景时,将禁用场景中具有NetworkIdentity组件的所有对象; 在客户端和服务器上.然后,当场景完全加载时,将调用NetworkServer.SpawnObjects()来激活这些联网的场景对象.这将在服务器场景完成加载时由NetworkManager自动完成 - 或者可以由用户代码直接调用.
由于文档声明它将自动激活网络标识对象,但它在我的上下文中没有发生.我的场景加载很好,但其网络标识对象不活动.
我做错了什么?
我还试图通过在我新加载的场景中调用NetworkServer.SpawnObjects()来激活我自己 的对象,但它只在服务器端生成对象,同时在客户端显示错误
未找到1个Spawn场景对象的Spawn场景对象找不到2个未找到的Spawn场景对象..... ..
任何Unet冠军可以帮助我吗?
编辑/更新方法:
我已根据添加场景加载的统一论坛讨论更改了我的代码,它在服务器上加载我的附加场景有错误(如下所示),仍然我的客户端的场景网络标识对象被禁用:
错误:
使用无效连接对象调用Ready():conn = null
另一个代码尝试:
#region AdditiveSceneLoadingSetup
[Command]//calling this for additive scene load- its start
public void CmdLoadAdditiveSceneMainCall() {
RpcLoadAdditiveScene();
StartCoroutine(LoadAdditiveSceneAtServer());
}
[ClientRpc]
public void RpcLoadAdditiveScene() {
Debug.Log("RpcLoadAdditiveScene");
StartCoroutine(LoadAdditiveSceneAtClient());
}
public IEnumerator LoadAdditiveSceneAtClient() {
Debug.Log("LoadAdditiveSceneAtClient");
yield return …Run Code Online (Sandbox Code Playgroud) c# multiplayer unity-game-engine unity-networking unity3d-unet
我听说Unity3D具有内置多人游戏功能,它可以在没有服务器的情况下提供服务.但是我找不到任何关于它的信息,我发现的所有turtorial都只是与Photon(PUD)或Google Services合作.我知道Photon很好,所以我开始研究它并计划使用它.
但是我仍然想写一些非常简单的应用程序,不使用服务器,比如One VS One Rock Paper Scissors游戏.使用Photon必须在性能上更好,但在某些情况下,如上所述,它似乎太多了.此外,免费用户的PUD CCU只有二十,所以这意味着只有十个小组可以同时玩,Rock Paper Scissors游戏.
我看到有人说没有服务器就有可能,但其他一些人说不可能.
什么是对的?
我正在研究和学习Unity 5,UNET和网络的一些基础知识.我制作了一个简单的3D游戏,你可以四处走动并改变物体的颜色.但我现在想让它成为多人游戏,而且我在如何通过网络发送更改方面遇到了很多麻烦,因此所有玩家都可以看到单个玩家的颜色变化.
部分问题是使用较新的UNET网络引擎很难找到答案.有时我会遇到旧方式的答案.
所以主要的问题是,如何联网非玩家GameObject属性的变化?颜色,形状,大小等.
这是我现在的一些代码 - 我有很多不同的版本,所以我只发布当前版本:
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Player_Paint : NetworkBehaviour {
private int range = 200;
[SerializeField] private Transform camTransform;
private RaycastHit hit;
[SyncVar] private Color objectColor;
[SyncVar] private GameObject objIdentity;
void Update () {
CheckIfPainting();
}
void CheckIfPainting(){
if(Input.GetMouseButtonDown(0)) {
if (Physics.Raycast (camTransform.TransformPoint (0, 0, 0.5f), camTransform.forward, out hit, range)) {
string objName = hit.transform.name;
CmdPaint(objName);
}
}
}
[ClientRpc]
void RpcPaint(){
objIdentity.GetComponent<Renderer>().material.color = objectColor;
}
[Command]
void CmdPaint(string name) { …Run Code Online (Sandbox Code Playgroud) 正如问题所述,我一直在尝试将 WebCamTexture 从带有网络摄像头的客户端流式传输到服务器。双方(客户端和服务器)都在 Unity 中。稍后,客户端将部署到 Android,而服务器将是一个桌面应用程序。
目前我正在使用以下方法获取纹理的像素:
tex.GetPixels32();
Run Code Online (Sandbox Code Playgroud)
并使用自定义序列化程序对它们进行序列化(以优化其大小)。我目前有一个未压缩的字节数组,每帧大约 3.5MB 准备发送。我知道它很大,但我想在压缩部分和实时部分开始之前传输它。
该过程的最后一部分应该是使用新的 Unity NetworkTransport 静态类发送它。距离上次用sockets已经很久了,真的很烂。目前我无法让它工作。
这是我的服务器端代码(为清楚起见省略了序列化代码):
void Start()
{
webcamTexture = new WebCamTexture();
Background.texture = webcamTexture;
Background.material.mainTexture = webcamTexture;
webcamTexture.Play();
if (!_isStarted)
{
_isStarted = true;
NetworkTransport.Init();
m_Config = new ConnectionConfig();
m_CommunicationChannel = m_Config.AddChannel(QosType.ReliableFragmented);
HostTopology topology = new HostTopology(m_Config, 12);
m_GenericHostId = NetworkTransport.AddHost(topology, 0);
byte error;
m_ConnectionId = NetworkTransport.Connect(m_GenericHostId, ip, port, 0, out error);
}
}
void Update()
{
if (!_isStarted)
return;
NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out …Run Code Online (Sandbox Code Playgroud) c# textures video-streaming unity-game-engine unity-networking
我有一个可以装备多种武器的玩家对象.配备武器时,其变换的父级设置为其手.我已经搞砸了一段时间,并且不能让它对主机和客户端起作用.现在我正在尝试在服务器上装备武器,并告诉所有客户设置他们的父母变换.
public NetworkInstanceId weaponNetId;
[Command]
void Cmd_EquipWeapon()
{
var weaponObject = Instantiate (Resources.Load ("Gun"),
hand.position,
Quaternion.Euler (0f, 0f, 0f)) as GameObject;
weaponObject.transform.parent = hand;
NetworkServer.Spawn (weaponObject);
//set equipped weapon
var weapon = weaponObject.GetComponent<Weapon> () as Weapon;
weaponNetId = weaponObject.GetComponent<NetworkIdentity> ().netId;
Rpc_SetParentGameobject (weaponNetId);
}
[ClientRpc]
public void Rpc_SetParentGameobject(NetworkInstanceId netID)
{
weaponNetId = netId;
}
Run Code Online (Sandbox Code Playgroud)
在更新中,我正在更新武器转换
void Update () {
// set child weapon tranform on clients
if (!isServer) {
if (weaponNetId.Value != 0 && !armed) {
GameObject child = NetworkServer.FindLocalObject (weaponNetId); …Run Code Online (Sandbox Code Playgroud) network-programming multiplayer unity-game-engine unity-networking
所以正如标题所暗示的那样,我遇到了一个问题,即客户端发送的命令没有被触发。
我正在尝试使用的基本功能是,当一个敌人出现在玩家面前并且我点击时,该玩家将被暂时惊呆。如果我是主持人,效果很好,并且双方都完美注册。
如果我作为客户端玩游戏,我会到达“应该”发送命令的地步,但我注意到我收到一条警告,上面写着“正在尝试为非本地玩家发送命令”。同样,两端都没有任何反应。显然,我一定是在客户端做错了什么,但不知道还有什么其他方法可以解决这个问题。
“问题”代码。
if (Input.GetButtonDown("Fire1")) {
Ray ray = new Ray(transform.position, transform.forward);
RaycastHit hit = new RaycastHit();
Physics.Raycast(ray, out hit, 20f);
if (hit.transform != null) {
if (hit.rigidbody != null) {
PlayerController controller = hit.rigidbody.GetComponent<PlayerController>();
if (controller != null) {
if (!controller.stunned) {
// Send the stun command to the server
controller.CmdStun();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
该方法调用
[Command]
public void CmdStun() {
// Report that the stun was sent
UnityEngine.Debug.Log("Stun Sent");
RpcStun();
}
[ClientRpc]
public void RpcStun() { …Run Code Online (Sandbox Code Playgroud) 在新的Unity UNET网络上,是否有人让多个播放器预制件工作(例如,具有不同预制件的不同角色类)?
所以我知道 [command] 不适用于非玩家对象,但是......为什么?我该如何同步非玩家对象的数据,例如 NPC 位置。在非玩家对象上调用 Command 的能力将节省每个客户端上的大量重复计算时间。
有没有人想出解决这个设计决策的方法?
另外,如果不在播放器对象上,SyncVar 似乎也不会同步。
现在我最好的策略是在玩家对象上存储大量数据,并且必须不断从外部类引用它
编辑:哎呀我的错误,正如所指出的那样,SyncVars 只在服务器上更新时才适用于非玩家对象
我正在使用UNet和NetworkManager组件.我试图连接到服务器的玩家只是对我说"我已经连接"了.我必须序列化.我正在使用NetworkBehaviour,我认为这可能导致失败.但是我如何序列化呢?
这是我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.Networking;
public class MultiPlayerOyunKontrol : NetworkBehaviour
{
void OnPlayerConnected(NetworkPlayer player)
{
Debug.Log("Player baglandi"+this.transform.name);
}
}
Run Code Online (Sandbox Code Playgroud)