搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
笔触狂放9
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Android快速开发控件---下拉导航菜单_android 下拉菜单
2
ANT在Mac OS X上的安装和设置
3
Rabbitmq学习之路3-cluster
4
bashplotlib,一个有趣的 Python 数据可视化图形库
5
【前端|JS实战第1篇】使用JS来实现属于自己的贪吃蛇游戏!_js写贪吃蛇
6
Git报错fatal unable to connect to github.com: github.com[0: 20.205.243.166]: errno=unknown error的解决方法_github 20.205.243.166
7
学习unity的几个网站_unity自学博客网站
8
【玩转TableAgent 数据智能分析】-- 数据分析不再是专业人士的专利_table agent
9
linux中telnet端口成功现象,如何优雅的使用telnet测试端口连通性
10
服务器window如何设置防火墙开放端口_windows sever2022开启防火墙
当前位置:
article
> 正文
Unity多人游戏和网络功能(三) 游戏物体的派生_unity 派生是什么意思
作者:笔触狂放9 | 2024-02-19 19:41:00
赞
踩
unity 派生是什么意思
游戏物体的派生
在Unity中,使用Instantiate()函数创建新的
游戏
物体有时也被叫做Spawning,在网络HLAPI中,派生(Spawn)有更特殊的含义。在服务器权威式的网络模式下,在服务器上派生一个物体,意味着这个物体也同时应该在相连的客户端上创建,而且这个创建的物体应该被派生系统所管理。物体状态在服务器上的更新会被实时发送到客户端,当物体在服务器上被销毁时,这个物体也应该同时在客户端上被修改。派生出的物体还同时应该被添加到服务器管理的网络物体的集合中,当有一个新的客户端加入时,这些物体也都应该在新的客户端上被派生出来。这些物体每个都有一个唯一的网络标识符,而且标识符在服务器和客户端上是一致的。
当网络标识的物体在客户端上被派生的时候,他们应该具有和服务器上相同的状态,包括物体的位置,运动状态和同步的变量。因此一个客户端被创建的时候,应该总是拿到最新的数据,这可以避免客户端上在错误的初始位置创建物体,又在更新数据包到达的时候瞬间移动物体的问题。
这听起来很好,但是马上问题就来了。如何在客户端上创建物体?当物体的状态改变的时候,又有一个新的客户端连接进来怎么办?在新连接的客户端上应该创建物体的哪个版本?
客户端上创建的物体是从服务器上传给NetworkServer.Spawn的预设体中创建的。在NetworkIdentity属性面板中显示了这个物体的资源ID,这是一个标识预设体的ID。为了让这个过程工作的更有效,客户端需要执行一个注册过程,他们必须要执行ClientScene.RegisterPrefab来告诉系统客户端创建物体的资源ID。
注册的过程最简单的方式是在NetworkManager的编辑器中完成,“Spawn Info”部分可以让你不用写一行代码就完成预设体的注册。也可以在NetworkClient创建的时候用代码来完成。代码如下:
using UnityEngine;
usingUnityEngine.Networking;
public classMyNetworkManager : MonoBehaviour
{
public GameObject alienPrefab;
NetworkClient myClient;
// Create a client and connect to theserver port
public void SetupClient()
{
ClientScene.RegisterPrefab(alienPrefab);
myClient =
new
NetworkClient();
myClient.RegisterHandler(MsgType.Connect,OnConnected);
myClient.Connect("127.0.0.1",4444);
}
}
在这个例子中,用户应该拖放一个预设体到MyNetworkManager脚本的alienPrefab槽位上。当一个物体在服务器上被创建之后,同样的物体将被创建在客户端上。这种资源的注册保证资源和场景一起加载,因此创建时没有资源加载的延迟。关于对象池和动态创建资源的情况,可以使用ClientScene.RegisterSpawnHandler()函数,它可以用来注册客户端派生一个物体的回调函数。
下面是一个创建拥有随机生成的树叶的树的例子:
class Tree :NetworkBehaviour
{
[SyncVar]
public int numLeaves;
}
class MySpawner :NetworkBehaviour
{
public GameObject treePrefab;
public void Spawn()
{
GameObject tree =(GameObject)Instantiate(treePrefab, transform.position, transform.rotation);
tree.GetComponent<Tree>().numLeaves= Random.Range(10,200);
NetworkServer.Spawn(tree);
}
}
要完成上面的功能,工程中需要有一棵树的预设体,并有叫做Tree的脚本和NetworkIdentity组件。然后在场景的MySpawner脚本中,把这个树的预设体拖放到脚本的treePrefab槽位上。这个树的预设体还必须注册为可派生的物体,可以通过NetworkManager的UI界面,也可以在代码中使用ClientScene.RegisterPrefab()函数。
当代码运行时,在客户端上派生出来的树会具有和服务器上的树相同的叶子数量
约束条件
- 在派生的预设体物体上,在根节点上必须要有一个NetworkIdentity组件;
- 一个NetworkBehaviour脚本必须像NetworkIdentity一样绑定在物体的根节点上;
- 预设体如果没有NetworkIdentity组件,将不能被绑定在NetworkManager上;
物体创建流程:
派生物体的实际流程为:
- 注册一个包含NetworkIdentity组件的预设体
- 在服务器上创建出该物体
- 调用游戏代码为物体设置初始值(三维物体上的物理力不会马上生效)
- 调用NetworkServer.Spawn()方法
- 服务器上这个物体的NetworkBehaviour组件里的所有同步变量(SyncVars)的值被收集并序列化
- 包含同步变量数据的MsgType.ObjectSpawn类型的网络消息被发送给所有的客户端
- 服务上调用OnStartServer()函数,并把isServer设置为true
- 客户端接收ObjectSpawn消息,并从注册的预设体中创建游戏物体
- 在创建的物体上应用接收到的同步变量值
- 每个客户端执行OnStartClient()
函数
,isClient变量设置为True
- 在
游戏
进行过程中,同步变量的值的修改都会被自动同步到所有的客户端,直到游戏结束
- 服务器上调用NetworkServer.Destroy()
- 给所有的客户端发送MsgType.ObjectDestroy类型的消息
- 所有的客户端执行OnNetworkDestroy方法,实例被销毁
玩家物体:
玩家
物体在网络HLAPI中有点特殊,NetworkManager对玩家物体的处理流程是:
- 将包含NetworkIdentity组件的预设体注册为派生预设体
- 客户端连接到服务器
- 客户端调用AddPlayer(), 发送MsgType.AddPlayer类型的消息给服务器
- 服务器接收到消息,调用NetworkManager.AddPlayer()
- 服务器从预设体中创建物体
- 服务器上为新创建的玩家物体调用NetworkManager.AddPlayerForConnection()
- 玩家物体被创建出来(你不需要再调用NetworkManager.Spawn())
- 一个MsgType.Owner类型的消息发送给客户端(只发送给这个连接进来的客户端)
- 客户端接收到消息
- 客户端上调用OnStartLocalPlayer,并且将isLocalPlayer设置为True
要注意的是,OnStartLocalPlayer()会在OnStartClient()之后被调用,这发生在玩家物体被创建,并接收到Owner消息的时候。所以在OnStartClient
函数
中,isLocalPlayer属性还没有被设置。
因为OnStartLocalPlayer()只在
玩家
自己的客户端上执行,因此这里是对本地玩家执行初始化的好地方。这应该包括开启输入控制,启动
摄像机
跟随等功能。一般情况下,只有本地玩家拥有活动的摄像机。
定制派生函数
在客户端上派生
游戏
物体的默认行为可以使用派生处理函数进行定制。你可以在客户端上使用ClientScene.RegisterSpawnHandler()函数注册Spawn和un-Spawn回调函数。这个函数接收两个函数代理类型的变量,一个用来处理物体创建,另一个处理物体的销毁。
// 客户端上的物体创建处理函数
public delegateGameObject SpawnDelegate(Vector3 position, NetworkHash128 assetId);
// 客户端上的物体销毁处理函数
public delegate voidUnSpawnDelegate(GameObject spawned);
物体创建
函数
中的assetId可以在预设体的NetworkIdentity.assetId属性中找到,他是自动设置的。你可以使用下面的代码进行创建:
// 创建一个唯一的assetId
NetworkHash128creatureAssetId =
new
NetworkHash.Parse("e2656f");
// 注册这个assetId的处理函数
ClientScene.RegisterSpawnHandler(creatureAssetId,SpawnCreature, UnSpawnCreature);
// 派生一个物体,SpawnCreature()将在客户端上被调用
NetworkServer.Spawn(
game
Object,creatureAssetId);
使用定制的派生函数的时候,有时候unspawn一个物体但是不销毁他们是有用的。这可以通过调用NetworkServer.UnSpawnObject()来实现。这将引发一个消息被发送给un-spawn的物体,在客户端上定制的unspawn函数将被调用。这个函数被调用后不会销毁这个物体。
注意的是,在
伺服器
上,物体不会再本地客户端上被创建出来,因为这个物体在服务器上已经有了,所以派生处理
函数
不会被调用。
创建客户端授权的物体
可以派生一个物体并把这个物体授权给某个客户端。这可以通过NetworkServer.SpawnWithClientAuthority()来完成。它接收与目标客户端关联的NetworkConnection变量作为参数。
对于这些物体,hasAuthority属性在被授权的客户端上将为True,而且OnStartAuthority()将会在被授权的客户端上被调用。这个客户端就可以发起控制这个物体的命令。在其他的客户端上,hasAuthority属性将为False。
拥有客户端授权的派生物体必须在NetworkIdentity上设置LocalPlayerAuthority属性
例如,要允许
玩家
派生并控制一个物体:
[Command]
void CmdSpawn()
{
var go = (GameObject)Instantiate(
otherPrefab,
transform.position +
new
Vector3(0,1,0),
Quaternion.identity);
NetworkServer.SpawnWithClientAuthority(go, connectionToClient);
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/笔触狂放9/article/detail/116519?site
推荐阅读
article
(五)
unity
shader
基础之——————学习
shader
所需
的
数学基础:下篇(
坐标
空间
:
模型
...
一
、
坐标
空间
上篇文章讲述了如何使用矩阵来表示基本
的
变换
,如平移
、
旋转和缩放,在本节我们将关注如何使用这些
变换
来对
坐标
空间
...
赞
踩
article
Unity
UI
Toolkit
学习笔记-
EditorWindow
_
unity
editorwind...
使用
UI
Toolkit
制作
EditorWindow
_
unity
editorwindow
停靠
unity
editorwi...
赞
踩
article
Unity
UI
-- (3)管理
屏幕
大小
和
锚点
_
unity
中打开网页,并且控制网页
大小
...
为何我们需要
锚点
?现在我们已经将设置按钮放到了
屏幕
的某个角落了。一切看起来似乎很美好,但如果我们移动游戏视图窗口的边界,...
赞
踩
article
Unity
Editor
基础篇(三):
自定义
窗口
Editor
Window_selectiongr...
本文参自:http://mp.weixin.qq.com/s/tMSAIND4Pq0farn2jY8rwg本文为本人学习...
赞
踩
article
Unity
EditorWindow
使用案例...
Unity
EditorWindow
学习笔记了解
EditorWindow
的生命周期:OnEnable():当打开界面的时候...
赞
踩
article
【
Unity
WEBGL
】
WEBGL
发布
后运行时窗口自
适应
浏览器
大小(网页内全屏)_
unity
we...
按照默认设置,
发布
webgl
后,代码如下(
发布
好的文件,根目录index.html文件)<...
赞
踩
article
Unity
编辑器
扩展(一) ——
自定义
Unity
面板
_
unity
在
面板
上设置
自定义
结构...
Unity
编辑器
扩展(一) ——
自定义
Unity
面板
自定义
Menu菜单MenuItem 特性MenuItem 属性可...
赞
踩
article
Unity
:
WebGL
发布后在
浏览器
上运行时窗口大小自适应
_
unity
webgl
适配网页...
unity
webgl
在
浏览器
上自适应
浏览器
窗口大小
_
unity
webgl
适配网页
unity
webgl
适配网页 ...
赞
踩
article
Unity
编辑器开发实战【
Editor
Window
】-
Filter
物体筛选工具_
unity
...
Unity
开发工作中,在Hierarchy窗口搜索栏可以通过物体名称或组件名称对场景中的物体进行搜索,但是并不能满足我们...
赞
踩
article
Unity
工具之
UniWebView
内嵌
网页
/
浏览器
到应用中,
并且
根据
UGUI
大小
放置(简单适...
Unity
工具之
UniWebView
内嵌
网页
/
浏览器
到应用中,
并且
根据
UGUI
大小
放置(简单
适配
UGUI
)目录Un...
赞
踩
article
Unity
编辑器
开发实战【
Editor
Window
】- 构建公司
内
部的PackageManage...
Unity
中的资源包管理器Package Manager为我们提供了模块、工具包的集中管理功能,可在其中下载、升级相应的...
赞
踩
article
Unity
Editor
知识点整理(创建 自定义编辑器窗体 二)_
unity
editor
一秒一...
常用的
Editor
Window 消息方法 //在我们对象被选中的时候调用的,常常用于一些初始化的代码 private v...
赞
踩
article
Unity
代码
设置
UI
尺寸
的一种方法_
unity
设置
ui
大小...
计算
设置
sizeDelta
设置
UI
尺寸
_
unity
设置
ui
大小
unity
设置
ui
大小 ...
赞
踩
article
Unity
---
UGUI
---
Rect
Transform
(矩形变换)
---
锚点
及其相关...
a.
锚点
左右分离
---
此时Pos X 失去意义,被Left和Right取代
---
Left的数值是UI物体的左边框...
赞
踩
article
unity
webgl
自适应
网页
尺寸
_
unity
网页
端
尺寸
...
我使用的是
unity
2019.4 LTS版一共有两步1 在Index.html中修改2 修改css 的内容 位置在打包...
赞
踩
article
Unity
UI
锚点
和
位置
关系
_
unity
锚点
代码怎么改成最左侧...
一、Anchors
锚点
Anchors的设置会直接改变RectTransform中它的
位置
信息;Anchors设置中的X ...
赞
踩
article
Unity
Windows
选择图片并加载_
unity
editorwindow
中
如何加载图集
中
的子...
1.找到System.
Windows
.Forms.dll,并放在project
中
的Plugins文件夹下。 “”_uni...
赞
踩
article
【
Unity
】PC端:
缩放
、
移动
画面_
unity
exe
如何
像
编辑器
游戏面板一样 拉伸
的
时候等比缩...
本文章内容适用于PC端UCUI,通过鼠标
移动
与滑动滚轮,进行正交摄
像
机
的
移动
与
缩放
。_
unity
exe
如何
像
编辑器
游...
赞
踩
article
Unity
EditorWindow
---扩展自定义编辑器
窗口
_
unity
editorwindow
...
一、
EditorWindow
类属性及函数首先提供官方参考文档:API-Reference-
EditorWindow
概述:...
赞
踩
article
Unity
win
平台 调整
窗口
大小强制固定比例_
unity
unity
游戏
窗口
的
长宽
比...
我写了一个脚本,对独立的Windows版本(仅Windows,32/64位)强制执行任意宽高比。它通过拦截
窗口
调整大小事...
赞
踩
相关标签
unity shader
游戏开发
坐标空间
顶点变换
shader数学基础
unity
UI Toolkit
EditorWindow
ui
锚点
Anchor
Pivot
编辑器
Unity
WEBGL
自适应浏览器
前端
web
html
Editor Window
Hierarchy
Filter