- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
统一版本:5.5
场景示例:
LightSwitch.cs
public class LightSwitch : NetworkBehaviour
{
public GameObject roomLight;
void OnMouseDown () {
CmdToggleLight(!roomLight.activeSelf);
}
[Command]
void CmdToggleLight (bool status) {
RpcToggleLight(status);
}
[ClientRpc]
void RpcToggleLight (bool status) {
roomLight.SetActive(status);
}
}
¿如何让任何玩家点击那个 LightSwitch 并打开/关闭灯光?
编辑:按照示例,这是我必须构建的代码:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class LightSwitch : NetworkBehaviour
{
public GameObject roomLight;
[SyncVar(hook="setLight")]
private bool status;
void OnMouseDown()
{
// my player's singleton
Player.singleton.CmdToggleSwitch(this.gameObject);
}
public void toggleLight()
{
status = !status;
}
void setLight(bool newStatus)
{
roomLight.SetActive(newStatus);
}
[ClientRpc]
public void RpcToggleSwitch(GameObject switchObject)
{
switchObject.GetComponent<LightSwitch>().toggleLight();
}
}
Player.cs代码:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Collections.Generic;
using System;
public class Player : NetworkBehaviour {
public static Player singleton;
void Start () {
singleton = this;
}
//... my player class code ....//
[Command]
public void CmdToggleSwitch(GameObject gObject)
{
gObject.GetComponent<LightSwitch>().RpcToggleSwitch(gObject);
}
}
多亏了 Unity,只是为了切换灯光而已。
最佳答案
不幸的是,命令只能从客户端玩家对象发送。来自文档:
[Command] functions are invoked on the player GameObject associated with a connection.
您可以做的是在播放器对象上放置一个切换函数,该函数传递您要切换的对象的网络标识。例如:
[Command]
void CmdToggleSwitch (GameObject switch) //switch must have network identity component
{
//Set the switch state on the server
switch.GetComponent<LightSwitch>().ToggleMethod();
}
然后在服务器上,您可以调用 RPC 或将电灯开关状态设置为 SyncVar。后一种方法可能更简单、更可靠(即新玩家将自动设置正确的电灯开关状态)。
这是一个(未经测试的)示例:
using UnityEngine;
using UnityEngine.Networking;
public class RaycastExample : NetworkBehaviour
void ToggleSwitch()
{
RaycastHit hit;
//Use raycasting to find switch
if (Physics.Raycast(transform.position, transform.forwards, out hit, 5.0f))
{
if (hit.GetComponent<LightSwitch>())
{
//Send the command to toggle the switch of the server, passing in the LightSwitch gameobject as the parameter
CmdToggleSwitch (hit.transform.gameObject);
}
}
}
//This will be run on the server version of our player
[Command]
void CmdToggleSwitch (GameObject switch) //switch must have network identity component
{
//Set the switch state on the server
//Server light switch will need some way to notify the clients of the change. RPC or SyncVar.
switch.GetComponent<LightSwitch>().ToggleMethod();
}
编辑:
这是我的一个项目的代码片段。此片段来自附加到我用来控制玩家健康的联网玩家对象的脚本。
[SyncVar(hook="OnHealth")]
public float currentHealth = 100f;
首先,我声明了一个变量来保存玩家的健康状况,并为其分配了一个 SyncVar 属性。通过分配此属性,服务器将在服务器上更改此变量时跨客户端更新此变量。我还添加了 Hook 参数,导致在更新此变量时在所有客户端上调用 OnHealth() 函数。
void OnHealth (float newHealth) {
currentHealth = newHealth;
}
这是 OnHealth 函数。每当服务器通知客户端 currentHealth 已更改时,都会调用此函数。它还将 currentHealth 的新值作为参数传递,我们只需要手动将这个传递的值指定为新的 currentHealth。
public void TakeDamage (float damage) {
if (!isServer)
return;
currentHealth -= damage;
if (currentHealth < 0)
currentHealth = 0;
}
我还有一个允许玩家受到伤害的公共(public)函数。注意这个函数第一行的检查,我只关心服务器是否发生损坏。 SyncVar 属性将导致 currentHealth 中的更改在客户端之间同步。在这个特定的游戏中,玩家只有在被射弹击中时才会受到伤害。通过以这种方式调用损坏函数,服务器成为真实的来源(如果客户端滞后,射弹可能会在应该击中时出现错过,反之亦然 - 在这种情况下,使用 [Command] 属性可能会导致结果冲突).
[Command]
public void CmdHeal(float heal) {
currentHealth += heal;
}
在这个游戏中还有一个治疗功能,当玩家按下某个键时就会发生。由于服务器不知道该键何时被按下,我无法像使用损坏功能那样更新健康状况。因此,我使用了 [Command] 属性。所以这是流程:玩家按下键 -> 客户端通知服务器调用了 CmdHeal -> CmdHeal 在服务器上执行 -> 服务器通知所有客户端 currentHealth 已更改。
关于c# - UNET - 让任何玩家向同一个 NetworkIdentity 发送命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41115946/
目录 1 Motivation 2 U-Net网络 3 训练 3.1 数据增强 3
我已经在这个问题上苦苦挣扎了好几个星期了,我找不到任何可以帮助我的东西。 Unity 的多人网络拓扑(我所知道的)是主机-客户端。主机开始游戏,客户端使用 ip:port 连接到主机。当其中一方位于
我正在训练用于分割的 uNet 模型。训练模型后,输出全为零,我不明白为什么。 我看到建议我应该使用特定的损失函数,所以我使用了 dice 损失函数。这是因为黑色区域 (0) 比白色区域 (1) 大得
正如标题所暗示的,我遇到了一个问题,即客户端发送的命令没有被触发。 我尝试实现的基本功能是,当敌人出现在玩家面前并且我单击时,该玩家会被暂时击晕。如果我是主持人,工作正常,双方都完美注册。 如果我作为
设置:创建我的第一个多人游戏并遇到一个奇怪的问题。这是一款坦克游戏,玩家可以射击子弹并互相残杀 问题:当客户端移动时射击,子弹似乎有一点延迟产生,导致玩家与子弹相撞。 The issue seems
我正在尝试在2 个不同的位置 生成2 个玩家(主机和客户端)。 我不知道该怎么做,因为播放器是由网络管理器自动生成的。 我尝试了以下但失败得很惨:(。 [Command] void CmdSpawn(
我正在使用 unet 进行客户端-服务器通信,当我从服务器(在 PC 上)向客户端(在 PC 上)广播消息时它工作正常但是当我尝试从服务器(PC)到客户端(Hololens 模拟器) unet 不起作
我一直在做一个小型的副项目,它需要服务器端的最高性能,因为它应该被设计为处理多达 100 名玩家。我也希望它尽可能具有权威性(当然还有客户端预测和所有这些东西) 我已经决定分离客户端/服务器,但是,u
我正在尝试使用 UNET 在 Unity 中同步一个非玩家游戏对象的变换。基本上我有一个玩家可以对抗那个对象并移动它,我希望那个对象的转换在服务器和客户端中以相同的方式改变。 我遵循了教程 https
统一版本:5.5 场景示例: Light [带有 Light 组件的游戏对象] LightSwitch - [包含:BoxCollider|NetworkIdentity|继承自 NetworkBeh
我正在 Keras 中使用 VGG16(解码器部分)训练 U-Net。该模型训练良好并且正在学习 - 我看到验证集的 gradua tol 改进。 但是,当我尝试对图像调用 predict 时,我收到
当我尝试训练模型时,我不断收到以下代码的以下错误:TypeError: fit_generator() missing 1 required positional argument: 'generat
简短描述:我正在加载一个主场景中的附加场景,它加载正常但附加场景的游戏对象(包含网络标识组件)正在禁用。 详细信息:我正在通过此代码加载附加场景,以便附加场景加载到我的服务器和所有工作正常的客户端中:
我正在研究和学习 Unity 5、UNET 和网络的一些基础知识。我制作了一个简单的 3D 游戏,您可以在其中四处走动并更改对象的颜色。但我现在想让它成为多人游戏,我在弄清楚如何通过网络发送更改以便所
我最近开始学习图像分割和 UNet。我正在尝试进行多类图像分割,其中我有 7 个类,输入是 (256, 256, 3) rgb 图像,输出是 (256, 256, 1) 灰度图像,其中每个强度值对应一
我正在 PyTorch 中实现基于 U-Net 的架构。在火车时间,我有大小 256x256 的补丁这不会造成任何问题。但是在测试时,我有全高清图像( 1920x1080 )。这会在跳过连接期间导致问
我创建了我的如何统一匹配类(class)。这一切在电脑上运行良好,我可以轻松地创建一场比赛,没有任何问题。当我尝试为 iOS 创建匹配时出现了问题。 当我尝试创建新匹配时,我在 Xcode 上收到此错
我正在开发第一人称游戏,玩家可以在其中构建复杂的对象。结构示例: Train - Wagon - Table - Chair - Chest (stores items) - Work
众所周知,Unet 的文档缺乏。 我很想得到这个答案,并希望它可以帮助其他人以后搜索。 这是我正在尝试做的事情: 在玩家客户端上使用光线转换检测命中。 使用[命令]指示对专用服务器的命中 使用 [Ta
我的游戏中有一个立方体,它在观察另一个物体时在其初始状态和更大的状态之间切换。这在单人游戏中运行良好,但当我将它带到多人游戏时,我找不到正确的选项组合来让它在两个客户端(一个是主机)上更新。每个玩家仍
我是一名优秀的程序员,十分优秀!