2023-02-01 11:18:58    102    0    0

之前探索的内容:

demo git地址:chenhao/Mirror2KCC: Mirror2KCC 同步Demo - Mirror2KCC - Gitea: Git with a cup of tea (minish-cap.com)

效果 ->:试封装的Mirror角色同步基类(包含快照) - Chen Hao - Confluence (cyboak.com)


如下是正式视角讨论的同步方案:

接入的一些前提 (先读我):


接下来,是...

同步时序总览:(若采用CMD不广播,仅同步后续结果的模式)


  • 基本前提:

个人理解,

在本游戏中是动作主导,则角色相关的任何外围系统,都必须以动作的同步修正的当前帧(TAE运行时总帧)作为依据。

例如,当前动作处于10帧,现由于滞后需要修正到15帧的位置,

那么 动作修正到15帧的快照状态的同时,数值属性等其他系统应该修正到15帧的快照的状态。


  • 快照大结构:


基于基本前提,那么可考虑的结构为,以依据帧(如TAE)为主,其他各系统 必要和可选快照,在同一结构体中。

如下:

注:玩家对象会包含CMD数据


依据帧:TAE运行时。

关键帧标记:bool值,实则是为了加速修正过程中可抛弃的非关键帧数的标识。也许来自于策略。

transform类快照:包含Position,Rotation,KCC向量等

动作状态快照:TAE状态相关

属性类快照:采集来自数值计算Redux的当前结果值相关

其他可选快照插槽:其他有快照需求,但不需要频繁,有时需要快照携带同步的内容。


  • 快照管理模式:



  • 关于采集的部分描述


在整体图的采集上报部分设计思路,

设计描述的是一个逻辑帧内的流程。

参照上面的快照结构设计,分为可选快照和必要快照,构建一个发送前的快照Cache。

然后借助引擎对于不同功能块的执行:

1,各类系统,按需将可选的快照插入到发送前缓存中 

2,在引擎逻辑帧的末尾,快照按需采集必要的快照。组装成一个单个快照数据。

3,最后发送,并清除缓存的可选部分


2024-05-08 15:12:18    201    0    0

没搞清楚confluence上如何插入markdown...


个人理解的两种方式 ##方式一 房间模式:(自带一个需要准备等待功能的模式)

###创建场景 Offline,Room,GamePlay 作用:区分Online和非Online模式

###准备脚本 通过create->mirror 创建如下脚本

[NetworkRoomManager] 作用:房间管理,有房间创建,连接,等房间相关的回调 基于房间补充相关逻辑

[NetworkRoomPlayer] 作用:包含房间里的玩家状态和回调

[NetworkBehaviour]

创建多个NetworkBehaviour : 如,NetworkBehaviour 改为 myPlayer NetworkBehaviour 改为 myItem 作用: 有了本脚本,才会标记告知服务器需要同步本对象 继承了MonoBehaviour的Network脚本, 可以衔接Update等函数书写自己的逻辑, 取到玩家网络状态,如

isServer
如果是此对象是在服务器上运行的(包括服务器+客户端一体的主机),则返回true
isServerOnly
如果是此对象仅在服务器运行的(而非包含客户端的主机),则返回true
isClient
如果此对象已经存在,且处于客户端上(包括主机的客户端),则返回true

等等

###准备预制体 创建空物体,命名为RoomPlayer,挂MyNetworkRoomPlayer 创建胶囊,命名为Player,挂MyPlayer 创建Cube, 命名为Item 挂myItem

客户端操作权限: Player预制体上的挂NetworkTransform脚本的ClientAuthority 一定要勾选上,否则没有客户端操作其状态的权限。

在玩家或者我物体预制体上挂载,NetworkIdentity 脚本 (往往挂载其他Mirror脚本时,NetworkIdentity脚本会自动挂载)

###创建管理组件

1.在Offline场景空物体,挂MyNetworkRoomManager脚本 挂载好在线和离线对应的场景,Player预制体,以及房间相关的预制体和场景

title


2.同时挂上NetworkManagerHUD,
启动时开启Host服务器和连接的显示UI

title



写一个简单的操作

在myPlayer脚本(NetworkBehaviour)中加入移动操作。

2023-02-07 18:06:48    3162    0    0

COOP是战地3的合作模式内容,

不同于单机战役剧情,

COOP有额外的内容,且必须双人

关卡设计都很不错,建议在皓月云体验

 

而 皓月BF3 COOP联机服务:

可以说是非正版独家的COOP公网联机服务,

且国内低延迟。

(在皓月联机娘新版本中,已支持,通过皓月服务器流量转发,实现联机)

*皓月网站上有专门的COOP房间列表,可创建房间和加入房间。


那么如何游玩皓月BF3 COOP呢?

首先建议,先约个联机的人,开黑。

首先[房主]玩家 创建房间:

网站顶部点击【COOP】,选择想游玩的地图,点【创建房间】。

等待联机娘启动游戏。

待游戏地图加载完成后,显示【等待玩家】时

 

网页上就显示了你的房间。

 


[玩家2](参加你房间的朋友)

在列表上点击【加入房间】,联机娘自动启动游戏,一会儿就连上了

(目前玩家名显示的是电脑的计算机名,后续优化,不影响游玩)

祝游戏愉快


 

 

 

2022-10-14 17:52:46    238    0    0
  1. public class ctrl : MonoBehaviour
  2. {
  3. [SerializeField]
  4. PostProcessVolume m_postpVol;
  5. [SerializeField]
  6. Camera m_Cam;
  7. DepthOfField m_Df;
  8. void Awake()
  9. {
  10. m_postpVol.profile.TryGetSettings(out m_Df);
  11. }
  12. //焦距设置为摄像机和玩家的位置
  13. void Update()
  14. {
  15. m_Df.focusDistance.value = Vector3.Distance(Player.position, m_Cam.transform.position);
  16. }
  17. }
2018-03-30 11:11:45    367    0    0

-----Nintendo-----

Famicom FC 日版 89版 | ?

GameBoy 初代(屏幕损坏)| 80

GameBoy (非官方)|附送

GameBoy Light 日版 | ?

GameBoy Advance 日版(大概)*损坏 | 赠送 | 然后被自己翻新了

GameBoy Advance 黄色 改装B屏 背光 可调节 | 2019-10-19 | ¥ 459

GameBoy Advance SP 神游 | 2014-12-10 | 70

Super Famicom 日版 | 350+

Nintendo 64 日版 | 280

Nintendo DS 日版 (已坏) | 200

Nintendo DS Lite 日版 (烧屏) | 30 买了配件 翻新未完成

Nintendo DS Lite 日版 | 70

Nintendo DSi LL 日版 | 200

Nintendo Wii 日版 | 458.00  +  额外手柄 33.00

NGC 原装手柄 |36.00

Nintendo New 3DS LL 日版 |1728.00 + MHX 348.00

Nintendo Wii U 日版 | ¥818

Nintendo Switch 日版  (全新)| 2440.00  包含奥德赛

-----SONY-----

PlayStation®Protable - 1000 港版(黑色) |150.00

PlayStation®Protable - 1000 港版(白色) | 2018-08-10 |150.00

PlayStation®Protable - 2000 港版(薰衣紫) | ¥1800.00(2008年购入 带4G卡)

PlayStation®Vita - 2000 港版 |¥1500.00???

PlayStation®1 -  (PSOne版本) 日版 |2020-06-27 |¥150.00

PlayStation®2 - 30006 日版 |270.00

PlayStation®3 初代 美版 | 470.00

PlayStation®4 Slim 国行 | ¥ 2100??

-----Microsoft----

Xbox 360 厚机  美版(单65) | ¥ 580

 

--实体正版游戏--

NS:

 

PS4:

侍魂闪 日版

PSP:

怪物猎人 携带版 廉价版(日版)

怪物猎

2022-05-26 10:36:31    607    0    0

将unity缓存三个文件夹

C:\Users\你用户名\AppData\Local\Unity
C:\Users\你用户名\AppData\LocalLow\Unity
C:\Users\你用户名\AppData\Roaming\Unity

分别拷贝到 别的盘符,如

F:\UnityCache\LocalUnity
F:\UnityCache\LocalLowUnity
F:\UnityCache\RoaMingUnity

 

删除源文件夹,添加软链接

mklink /j C:\Users\你用户名\AppData\Local\Unity F:\UnityCache\LocalUnity
mklink /j C:\Users\你用户名\AppData\LocalLow\Unity F:\UnityCache\LocalLowUnity
mklink /j C:\Users\你用户名\AppData\Roaming\Unity F:\UnityCache\RoaMingUnity

 

管理员身份运行CMD,并执行, 结果:

Microsoft Windows [版本 10.0.19044.1706]
(c) Microsoft Corporation。保留所有权利。

C:\Users\Admin>mklink /j C:\Users\Admin\AppData\Local\Unity F:\UnityCache\LocalUnity
为 C:\Users\Admin\AppData\Local\Unity <<===>> F:\UnityCache\LocalUnity 创建的联接

C:\Users\Admin>mklink /j C:\Users\Admin\AppData\LocalLow\Unity F:\UnityCache\LocalLowUnity
为 C:\Users\Admin\AppData\LocalLow\Unity <<===>> F:\UnityCache\LocalLowUnity 创建的联接

C:\Users\Admin>mklink /j C:\Users\Admin\AppData\Roaming\Unity F:\UnityCache\RoaMingUnity
为 C:\Users\Admin\AppData\Roaming\Unity <<===>> F:\UnityCac

2022-05-19 11:32:19    1108    0    0

我写一个简单明了的范例
比如我们要同步一个V3类型的数据,
数据来源:客户端操作
目标:同步所有客户端的 Vector3 V3FromNetwork 变量值

流程为

本地客户端客户端(isLocalPlayer为true)进行操作
↓↓↓
调用[Command]修饰的方法SetTestV3,(SetTestV3就具备了往服务器上报的特性)
↓↓↓
服务器执行SetTestV3函数内容
↓↓↓
服务器修改TestV3值时,由于具备标识[SyncVar(hook = nameof(ChangeTestV3))],通知所有客户端的该对象脚本中调用ChangeTestV3
↓↓↓
客户端调用ChangeTestV3,最终成功修改到值。

代码如下

  1. using UnityEngine;
  2. using Mirror;
  3. public class Player : NetworkBehaviour
  4. {
  5. void Update()
  6. {
  7. if (!isLocalPlayer) return;//只操作本地客户端
  8. Vector3 V3SendData = new Vector3(Input.GetAxis("Vertical") * Time.deltaTime, 0, Input.GetAxis("Horizontal") * Time.deltaTime);
  9. SetTestV3(V3SendData);
  10. }
  11. [Command]//客户端上行标识
  12. public void SetTestV3(Vector3 v)
  13. {
  14. //服务端执行内容
  15. TestV3 = v;
  16. }
  17. [SyncVar(hook = nameof(ChangeTestV3))]//服务端修改触发客户端调用hook函数
  18. public Vector3 TestV3 = Vector3.zero;
  19. public void ChangeTestV3(Vector3 oldv, Vector3 newc)
  20. {
  21. //客户端执行内容
2022-05-17 17:13:05    1721    0    0

标签: Command 从客户端发送到服务器,服务器执行

  1. [Command]
  2. void ABC(){}

注意点
1,方法可以带参数,但需要序列化
2,客户端只能发送属于自己的对象的方法
如果都允许,则设置为不验证:

  1. [Command(requiresAuthority = false)]

标签: ClientRpc 从服务器发送到,客户端执行

  1. [ClientRpc]
  2. void ABC(){}

标签: TargetRpc 从服务器发送到,指定的客户端执行

  1. [TargetRpc]
  2. void TargetRemoteDamaged(NetworkConnection target, int damage){}

PS:第一个参数可忽略,默认发给自己,也就是调用此方法的客户端实体
PS:如果第一个参数有,则发给指定,目标

总结

[Command] 由客户端调用,内容服务器执行;
[ClientRpc]和[TargetRpc]由服务器调用,内容客户端执行;
但[TargetRpc]是指定目标发送,[ClientRpc]是都发送。

2022-05-17 16:05:14    951    0    0

一,用SyncVar进行同步

函数标签[SyncVar]
用标签来标记变量,被改变时时,同步给其他客户端;
可指定Hook指定回调函数,并返回旧值和新值

如:

  1. [SyncVar(hook = nameof(ChangeColor))]
  2. Color pcolor = Color.white;
  3. void ChangeColor(Color oldc, Color newc)
  4. {
  5. }

即pcolor发生变化时,客户端都调用ChangeColor

PS:使用此特性标注的变量,只应该在服务器上对此变量进行更改,而通过hook在客户端作用此更改
然后hook,仅会再客户端调用,如果服务器是OnlyServer模式则不会调用

使用脚本让服务器控制所有客户端颜色变化的代码

  1. using UnityEngine;
  2. using Mirror;
  3. public class PlayerController : NetworkBehaviour
  4. {
  5. [SyncVar(hook = nameof(ChangeColor))]
  6. Color pcolor = Color.white;
  7. Rigidbody rb;
  8. MaterialPropertyBlock prop;
  9. /// <summary>
  10. /// 客户端收到同步时调用
  11. /// </summary>
  12. /// <param name="oldc"></param>
  13. /// <param name="newc"></param>
  14. void ChangeColor(Color oldc, Color newc)
  15. {
  16. Debug.Log("更新为新颜色");
  17. prop.SetColor("_Color", newc);
  18. GetComponent<Renderer>().SetPropertyBlock(prop);
  19. }
  20. private void Awake()
  21. {
  22. rb = GetComponent<Rigidbody>();
  23. prop = new MaterialPropert
2022-05-17 14:39:49    238    0    0

个人理解的两种方式

方式一 房间模式:(自带一个需要准备等待功能的模式)

创建场景

Offline,Room,GamePlay
作用:区分Online和非Online模式

准备脚本

通过create->mirror 创建如下脚本

[NetworkRoomManager]
作用:房间管理,有房间创建,连接,等房间相关的回调
基于房间补充相关逻辑

[NetworkRoomPlayer]
作用:包含房间里的玩家状态和回调

[NetworkBehaviour]

创建多个NetworkBehaviour :
如,NetworkBehaviour 改为 myPlayer
NetworkBehaviour 改为 myItem
作用: 有了本脚本,才会标记告知服务器需要同步本对象
继承了MonoBehaviour的Network脚本,
可以衔接Update等函数书写自己的逻辑,
取到玩家网络状态,如

  1. isServer
  2. 如果是此对象是在服务器上运行的(包括服务器+客户端一体的主机),则返回true
  3. isServerOnly
  4. 如果是此对象仅在服务器运行的(而非包含客户端的主机),则返回true
  5. isClient
  6. 如果此对象已经存在,且处于客户端上(包括主机的客户端),则返回true
  7. 等等

准备预制体

创建空物体,命名为RoomPlayer,挂MyNetworkRoomPlayer
创建胶囊,命名为Player,挂MyPlayer
创建Cube, 命名为Item 挂myItem

客户端操作权限:
Player预制体上的挂NetworkTransform脚本的ClientAuthority 一定要勾选上,否则没有客户端操作其状态的权限。

在玩家或者我物体预制体上挂载,NetworkIdentity 脚本
(往往挂载其他Mirror脚本时,NetworkIdentity脚本会自动挂载)

创建管理组件

1.在Offline场景空物体,挂MyNetworkRoomManager脚本
挂载好在线和离线对应的场景,Player预制体,以及房间相关的预制体和场景
title

2.同时

4/23