标签: unity-networking

Unity Networking-UNet中的加法场景加载

简短说明:我正在我的主场景中加载一个添加场景,它的加载很好,但添加场景的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

13
推荐指数
1
解决办法
2043
查看次数

Unity3D中没有服务器的内置多人游戏?

我听说Unity3D具有内置多人游戏功能,它可以在没有服务器的情况下提供服务.但是我找不到任何关于它的信息,我发现的所有turtorial都只是与Photon(PUD)或Google Services合作.我知道Photon很好,所以我开始研究它并计划使用它.

但是我仍然想写一些非常简单的应用程序,不使用服务器,比如One VS One Rock Paper Scissors游戏.使用Photon必须在性能上更好,但在某些情况下,如上所述,它似乎太多了.此外,免费用户的PUD CCU只有二十,所以这意味着只有十个小组可以同时玩,Rock Paper Scissors游戏.

我看到有人说没有服务器就有可能,但其他一些人说不可能.

什么是对的?

c# multiplayer unity-game-engine photon unity-networking

6
推荐指数
1
解决办法
1万
查看次数

如何在UNet/Unity5中同步非玩家GameObject属性?

我正在研究和学习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)

c# multiplayer unity-game-engine unity5 unity-networking

6
推荐指数
1
解决办法
2万
查看次数

使用新的 Unity 5.1 传输层 API 流式传输 WebCamTexture

正如问题所述,我一直在尝试将 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

5
推荐指数
1
解决办法
4063
查看次数

Unity 5.1网络 - 为主机和所有客户端生成一个对象作为子对象

我有一个可以装备多种武器的玩家对象.配备武器时,其变换的父级设置为其手.我已经搞砸了一段时间,并且不能让它对主机和客户端起作用.现在我正在尝试在服务器上装备武器,并告诉所有客户设置他们的父母变换.

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

5
推荐指数
2
解决办法
9813
查看次数

UNET 客户端无法发送服务器命令,主机可以

所以正如标题所暗示的那样,我遇到了一个问题,即客户端发送的命令没有被触发。

我正在尝试使用的基本功能是,当一个敌人出现在玩家面前并且我点击时,该玩家将被暂时惊呆。如果我是主持人,效果很好,并且双方都完美注册。

如果我作为客户端玩游戏,我会到达“应该”发送命令的地步,但我注意到我收到一条警告,上面写着“正在尝试为非本地玩家发送命令”。同样,两端都没有任何反应。显然,我一定是在客户端做错了什么,但不知道还有什么其他方法可以解决这个问题。

“问题”代码。

            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)

c# network-programming unity-game-engine unity-networking

5
推荐指数
1
解决办法
9044
查看次数

如何为Unity的新UNET使用多个播放器预制件?

在新的Unity UNET网络上,是否有人让多个播放器预制件工作(例如,具有不同预制件的不同角色类)?

unity-game-engine unity-networking

4
推荐指数
1
解决办法
1万
查看次数

Unity UNET - 在玩家对象之外调用 [Command]

所以我知道 [command] 不适用于非玩家对象,但是......为什么?我该如何同步非玩家对象的数据,例如 NPC 位置。在非玩家对象上调用 Command 的能力将节省每个客户端上的大量重复计算时间。

有没有人想出解决这个设计决策的方法?

另外,如果不在播放器对象上,SyncVar 似乎也不会同步。

现在我最好的策略是在玩家对象上存储大量数据,并且必须不断从外部类引用它

编辑:哎呀我的错误,正如所指出的那样,SyncVars 只在服务器上更新时才适用于非玩家对象

network-programming unity-game-engine unity-networking

2
推荐指数
1
解决办法
1万
查看次数

如何在使用NetworkManager Unity时触发OnPlayerConnected?

我正在使用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)

c# unity-game-engine unity-networking

1
推荐指数
1
解决办法
2332
查看次数