简短说明:我正在我的主场景中加载一个添加场景,它的加载很好,但添加场景的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
我试图通过使用UNET同步Unity中一个非玩家游戏对象的转换.基本上我有一个可以反对该对象并移动它的玩家,我希望该对象的转换在服务器和客户端中以相同的方式改变.
我按照教程https://unity3d.com/learn/tutorials/topics/multiplayer-networking/handling-non-player-objects?playlist=29690进行操作,可以让播放器+子弹示例运行良好.然后我创建了一个新对象,添加了具有本地播放器权限的网络标识和网络转换(更新1秒),创建了一个预制件,并将其作为"注册的Spawnable Prefab"添加到网络管理器中.
认为这样就足够了,但它不起作用,因为对象转换在服务器和客户端中都没有以相同的方式更新.在服务器中,碰撞是非常奇怪的(例如,对物体的直线运动使其有时会跳回)但是物体可以移动到某个位置并保持在那里.在客户端,当玩家触摸对象时,碰撞非常平滑,然后对象具有某种磁效应,总是将其带回到服务器端对象的变换.
我检查了这些其他问题:1)Unity [UNET]同步非玩家对象转换 2)如何在UNet/Unity5中同步非玩家GameObject属性?3)UNET - 同步.非玩家对象上的颜色脚本,但我无法理解1)中的解决方案以及如何使用SyncVar进行同步转换(如果这实际上是最佳解决方案)
我也尝试过上面的Unity教程,就像敌人的情况一样设置我的对象,但它也不能保持变换在客户端和服务器中同步.
我相信我做的事非常愚蠢,所以非常欢迎任何提示!
我有一个多人回合制战略游戏,需要一个游戏经理,控制当前的游戏状态(轮到谁了).这个管理器应该对每个客户端都是通用的,它的状态应该在服务器上同步.
我是这样做的:游戏管理器对象是NetworkBehaviour,它有NetworkIdentity,它不是本地玩家权限,也不是服务器权限.我已经制作了一个自定义的NetworkManager,它在客户端连接上生成游戏管理器,还测试它是否是服务器.这是一个代码:
public override void OnClientConnect(NetworkConnection conn)
{
ClientScene.Ready(conn);
if (NetworkServer.active)
{
var manager = Instantiate(MultiplayerManagerPrefab, Vector3.zero, Quaternion.identity) as GameObject;
var tacticsManager = manager.GetComponent<MultiplayerManagerModel>();
NetworkServer.RegisterHandler(MsgType.AddPlayer, tacticsManager.CreatePlayerOnServer);
NetworkServer.Spawn(manager);
}
ClientScene.AddPlayer(0);
}
Run Code Online (Sandbox Code Playgroud)
当我在服务器上运行它工作正常时,它在客户端上创建一个实例并同步从服务器到客户端的变量.但是当我尝试从客户端运行命令时它会忽略它们,抛出这个警告:
试图在没有权限的情况下发送对象的命令.UnityEngine.Networking.NetworkBehaviour:SendCommandInternal(NetworkWriter,Int32,String)
请注意,此游戏管理器是在任何玩家之前生成的,因为它必须负责产生玩家.我究竟做错了什么?
我是团结的新手,目前正在尝试制作局域网多人RPG游戏.
仅供参考,我遵循了官方统一局的多人游戏指南,一切顺利. https://unity3d.com/learn/tutorials/topics/multiplayer-networking/introduction-simple-multiplayer-example
到目前为止,我让玩家加载,他们能够移动.我在下面编写了以下代码(在虚拟更新例程下),这样当玩家移动时,它将每1秒随机化1到50之间的数字,如果数字是25,我们随机"遇到敌人".当任何玩家遇到一个敌人时我都会这样做,所以网络上的每个人都会进入"战斗场景".
if (Input.GetKey("up") || Input.GetKey("down") || Input.GetKey("left") || Input.GetKey("right"))
{
if (Time.time > NextActionTime)
{
NextActionTime = Time.time + Period;
EnemyEncounter = Random.Range(1, 50);
if (EnemyEncounter == 25)
{
NetworkManager.singleton.ServerChangeScene("Scene2");
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但我不确定如何加载每个人,只加载某些玩家进入战斗场景.
例如:
玩家在主持/寻找局域网游戏之前输入一个名称
玩家1 = Joe
Player 2 = Bob
Player 3 = Billy
Player 4 = Jim
在预设的标签/文本上加载其中的文字"Joe,Billy".现在,当任何玩家发现遭遇时,我只想将玩家名称"Joe"和"Billy"加载到下一个场景,而其他玩家则不会.
这可能吗?任何形式的帮助将不胜感激.
谢谢大家
我有一个由动画预制件代表的爆炸.当用户单击UI按钮时,实例化预制件.在客户端或主机上单击按钮时,预制件将设置为Vector3(0.1,0.1,1)的localscale,并在主机上正确显示,但在客户端上以原始比例显示.
我有一个文本框显示客户端和主机上的比例,它们相匹配,但预制件的显示在主机(显示正确)和客户端(显示不正确)上是不同的.同样,客户端用户可以单击按钮或主机可以单击按钮,在这两种情况下,主机上的显示都是正确的,但客户端上的显示是正确的.
任何猜测,为什么我不能让客户端正确显示.似乎客户端上可以获得0.1,0.1,1的localscale,因为我可以在文本框中显示它,但是预制件显示得更大.
这是实例化代码.让我知道有助于诊断的任何其他信息.
go = Instantiate(shockwave, this.transform, false);
NetworkServer.Spawn(go);
Run Code Online (Sandbox Code Playgroud)
UPDATE
这是我根据Lotan的评论更新的代码.请注意,我首先调用createshockwave,然后调用Cmdcreateshockwave,因为我无法从UI按钮调用Command.
public void createshockwave()
{
if(!isLocalPlayer)
{ return; }
Cmdcreateshockwave();
}
[Command]
public void Cmdcreateshockwave()
{
//note that this line parents shockwave. The updated instantiation code below does not parent shockwave.
//go = Instantiate(shockwave, this.transform, false);
GameObject go = Instantiate(shockwave, this.transform.position, Quaternion.identity) as GameObject;
NetworkServer.Spawn(go);
go.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
...
}
Run Code Online (Sandbox Code Playgroud)
现在,实例化预制件的大小在客户端和主机上都是相同的原始比例.将区域设置比例更改为其他大小没有任何影响.
更新此问题似乎与预制件上的动画师有关.我删除了缩放预制件的动画师,现在缩放比例与客户端和主机上的父级匹配.看起来我不得不在更新功能中手动增加localscale而不是使用动画师.
from keras import backend as K
from tensorflow.keras.layers import MaxPooling2D,Conv2D,Input,Add,Flatten,AveragePooling2D,Dense,BatchNormalization,ZeroPadding2D,Activation
from tensorflow.keras.models import Model
def Dense_Layer(x,k):
x = BatchNormalization(axis = 3)(x)
x = Activation('relu')(x)
x = Conv2D(4*k,(1,1),strides = (1,1))(x)
x = BatchNormalization(axis = 3)(x)
x = Activation('relu')(x)
x = Conv2D(k,(1,1),strides = (1,1))(x)
return x
def Dense_Block(x,k):
x1 = Dense_Layer(x,k)
x1_add = keras.layers.Concatenate()([x1,x])
x2 = Dense_Layer(x1_add,k)
x2_add = keras.layers.Concatenate()([x1,x2])
return x2_add
def Dilated_Spatial_Pyramid_Pooling(x,k):
x = BatchNormalization(axis = 3)(x)
d1 = Conv2D(k, (1,1), dilation_rate = 2)(x)
d2 = Conv2D(k, (1,1), dilation_rate = …Run Code Online (Sandbox Code Playgroud) neural-network image-segmentation keras tensorflow unity3d-unet
我正在构建一个 UNET 模型。我陷入了一件事,如果我们必须将两个图像作为输入传递给 UNET,我们可以通过连接它们来完成它,就像下面的代码
inputs = []
for _ in range(num_inputs):
inputs.append(Input((self.input_height, self.input_width, self.input_features)))
x = concatenate(inputs)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
Run Code Online (Sandbox Code Playgroud)
但是我们如何才能在一次通过中获得两个图像作为输出?
artificial-intelligence machine-learning autoencoder deep-learning unity3d-unet
每个人!
我在一个本地网络中有很多设备。如何获取所有这些设备的 IP 地址?
我想做这样的事情:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Tools : MonoBehaviour {
//get local ip address
public string getIP() {
string IP = "";
IP = Network.player.ipAddress;
return IP;
}
//get all ip addresses in local network
public List<string> getIPArray() {
List<string> listIP = new List<string>();
return listIP;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试训练一个 U-net 来对卫星数据进行图像分割,从而提取一个具有九种不同道路类型的道路网络。到目前为止,我已经尝试了许多在网络上免费提供的不同 U-net 代码,但是我无法根据我的具体情况定制它们。我真诚地希望你能帮助我。
卫星图像和相关标签可以通过以下链接下载: 卫星图像和相关标签
此外,我编写了以下代码来为 Unet 准备数据
import skimage
from skimage.io import imread, imshow, imread_collection, concatenate_images
from skimage.transform import resize
from skimage.morphology import label
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Model
from keras.layers import Input, merge, Convolution2D, MaxPooling2D, UpSampling2D, Reshape, core, Dropout
from keras.optimizers import Adam
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
from keras import backend as K
from sklearn.metrics import jaccard_similarity_score
from shapely.geometry import MultiPolygon, Polygon
import shapely.wkt
import shapely.affinity
from collections …Run Code Online (Sandbox Code Playgroud) python image-segmentation deep-learning conv-neural-network unity3d-unet
我想在2个不同的位置产生2个玩家(主机和客户端).
我不知道如何做到这一点,因为播放器是由网络管理员自动生成的.
我尝试过以下但是非常失败:(.
[Command]
void CmdSpawn()
{
var go = (GameObject)Instantiate(
gameObject,
transform.position + new Vector3(0,1,0),
Quaternion.identity);
NetworkServer.SpawnWithClientAuthority(go, connectionToClient);
}
Run Code Online (Sandbox Code Playgroud)
如何在特定位置生成播放器对象?
unity3d-unet ×10
c# ×7
autoencoder ×1
keras ×1
multiplayer ×1
networking ×1
python ×1
tensorflow ×1
unet ×1
unityscript ×1