用的unity5.4中的network的功能进行场景中的物体同步。
虽然2022年了但是公司有些项目依然在用5.4的版本。不得不说关于低版本可以查阅的资料太少了。摸索了一下,最终实现了一些功能。截取了一个场景中物体同步的功能记录一下。下面开搞:
首先
新建一个场景。场景中很简单,一个cube和一个sphere 而且sphere是cube的子物体,和一个Cylinder。Cylinder作为游戏主角。cube和sphere是场景中的物体。
如下图:
目标:让sphere通过按键盘的A--D键来显示和隐藏,同步到所有客户端。
要想多个场景同步必然是有服务器和客户端。
本篇不讲服务器,直接用系统自带的。默认就好不用设置。
将networkmanager的两个脚本给到plane上。如下图:
-----
我们要通过角色来判断是不是本地客户端。因此我们要控制场景中物体同步的脚本加给主角。如图:
具体脚本的代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class testsceneobj : NetworkBehaviour
{
// Use this for initialization
void Start()
{
if (isLocalPlayer)
{
Debug.Log("我是本地物体");
}
}
// Update is called once per frame
void Update()
{
if (!isLocalPlayer)
{
return;
}
if (Input.GetKeyDown(KeyCode.A))
{
CmdIsNotActive();//隐藏物体
}
if (Input.GetKeyDown(KeyCode.D))
{
CmdIsActive();//显示物体
}
}
[Command]//服务器执行
void CmdIsNotActive()//方法必须是Cmd开头
{
RpcPlay();
}
[ClientRpc] //由服务器端调用,在客户端执行
void RpcPlay()//方法必须是Rpc开头
{
GameObject.Find("Cube").transform.FindChild("Sphere").gameObject.SetActive(false);
}
//-----------------
[Command]//服务器执行
public void CmdIsActive()
{
RpcPlay1();
}
[ClientRpc] //由服务器端调用,在客户端执行
void RpcPlay1()
{
GameObject.Find("Cube").transform.FindChild("Sphere").gameObject.SetActive(true);
}
}
这样就实现了场景中物体的同步显示和隐藏。
解释一下代码:
[Command]这个方法是某个客户端要告诉服务器应该执行内容的。
[ClientRpc] 是由服务器告诉所有客户端应该做什么的。
例如上面代码中 客户端告诉服务器应该执行方法RpcPlay();,然后服务器就执行了,并且是通知了所有客户端执行了这个方法。
简单理解就是有一群小弟(一群客户端),小弟们之间互相看不到,还有一个老大(服务器)。某个小弟告诉老大说打局游戏吧,老大通知所有小弟打游戏。最终我们看到的就是所有小弟都在打游戏。
最终效果如图:
文章浏览阅读3w次,点赞32次,收藏141次。 Arcgis中坐标系统及单位必须知道的知识(敲黑板!)1. 如果数据不存在坐标系统,则计算时无单位,许多操作都不能进行。2.投影坐标系统是平面坐标系统,单位是米、千米这些;而地理坐标系统是球面坐标系统,单位是度。 定义投影是定义坐标系统的意思,而不是单指定义投影坐标系统。3.图层的地图单位和显示单位,地图单位是你这个图层的使用的实际单位,一般默认你添加进来的第一个数据的坐标系..._shp数据没有坐标怎么处理
文章浏览阅读608次。QString 和std::string互转:std::string cstr;QString qstring;//****从std::string 到QStringqstring = QString(QString::fromLocal8Bit(cstr.c_str()));//****从QString 到 std::stringcstr =_qstring zhuan cstr
文章浏览阅读181次。int fab(int n) { return (n > 1) ? (fab(n-1) + fab(n-2)) : 1;}_斐波拉数列 函数
文章浏览阅读1.2w次,点赞8次,收藏5次。option+commamd+v 生成方法内变量option+commamd+f 生成类的静态变量_mac idea自动创建变量名
文章浏览阅读1.3k次,点赞2次,收藏2次。一、堂上限时训练1、 编写函数计算阶乘下面程序实现由键盘读入整数n,计算并输出n!,请补充完整计算阶乘的函数。include "stdio.h" __________ main() { int n; scanf("%d", &n); printf("%ld", fanc(n)); } 输入样例3输出样例6..._下面程序实现由键盘读入整数 计算并输出
文章浏览阅读5.7k次。详细的错误信息如下: 1 2016-06-28 17:18:13.366 [DefaultQuartzScheduler_Worker-1] ERROR org.quartz.core.JobRunShell:211 - Job group1.job1 threw an unhandled Exception: 2 java.lang.NullPointerException 3..._threw an unhandled exception
文章浏览阅读1k次。国产MCU 雅特力 AT32F403A 基于V2的 pwm移相输出_tmr_base_init
文章浏览阅读1.9w次。系统默认是torch.FloatTensor类型data = torch.Tensor(2,3)是一个2*3的张量,类型为FloatTensordata.cuda()就转换为GPU的张量类型,torch.cuda.FloatTensor类型(1)CPU或GPU之间的张量转换在Tensor后加long(), int(), double(),float(),byte()等函数就能将Tensor..._torch.floattensorz转tensor
文章浏览阅读187次。目录1MyBatis介绍2 传统jdbc编程步骤3Mybatis架构4Mybatis环境4.1 查询语句5小结5.1#{}和${}(面试重点)5.2parameterType和resultType5.3selectOne和selectList5.4mysql自增主键返回5.5Mybatis解决jdbc编程的问题5.6mybatis与hibernate不同6Mapper动态代理方式6.1开发规范1MyBatis介绍..._springboot、mybatisplus 面试
文章浏览阅读1.1k次。智能手机的普及使用越来越多的产品开始考虑增加蓝牙功能,从何实现和智能手机的交互。目前主流的BMS管理系统,使用的是单模蓝牙芯片。现在推荐一款上海巨微MS1656 BMS蓝牙芯片。MS1656是一款单模超低功耗蓝牙芯片,射频采用2.4GHzISM频段的频率,2MHz信道间隔,符合蓝牙规范。使用高性能的ARMCortex-M0+为内核的32位微控制器,最高工作频率可达24MHz,内置高速Flash存储器,丰富的增强型I/O端口和外设连接到外部总线。工作电压为2.4V3.6V,工作温度范围包含-40℃+85_锂电池蓝牙小程序
文章浏览阅读2.5k次。实现的功能如下图可以在对象的右侧画一个小图标,代码如下,放到Editor目录下,代码注释较多,就不详细介绍了using System;using System.Collections.Generic;using UnityEditor;using UnityEngine;[InitializeOnLoad]public class DrawHierarchyLockIcon{..._unity object小图标含义
文章浏览阅读818次。保护模式下8259A芯片编程及中断处理探究(上)Version 0.02哈尔滨工业大学 并行计算实验室 谢煜波[1]简介中断处理是操作系统必须完成的任务,在IBM PC中,常用一块中断控制芯片(PIC)——8259A来辅助CPU完成中断管理。在实模式下,中断控制芯片(PIC)8259A的初始化是由BIOS自动完成的,然而在保护模式下却需要我们自行编程初始化。_8259a芯片中断类型号的分配