当前位置: 首页 > wzjs >正文

无锡网站开发电影网站加盟可以做么

无锡网站开发,电影网站加盟可以做么,手机网站表单验证,房地产楼盘微信网站建设营销方案文章目录 前言安装 DOTS 包Mono To DotsDots To Mono 前言 DOTS(面向数据的技术堆栈)是一套由 Unity 提供支持的技术,用于提供高性能游戏开发解决方案,特别适合需要处理大量数据的游戏,例如大型开放世界游戏。 本文讲…

文章目录

    • 前言
    • 安装 DOTS 包
    • Mono To Dots
    • Dots To Mono

前言

DOTS(面向数据的技术堆栈)是一套由 Unity 提供支持的技术,用于提供高性能游戏开发解决方案,特别适合需要处理大量数据的游戏,例如大型开放世界游戏。
本文讲解我们的Mono代码部分,如何与Dots的System部分进行通讯。比如:交换数据,发送事件等。

  • Unity 2022.3.52f1
  • Entities 1.3.10

安装 DOTS 包

要安装 DOTS 包,请按照以下步骤操作:

(1)从菜单“窗口 → 包管理器”打开包管理器。
(2)搜索“ Entities” 并安装 Entities和Entities Graphics。
(3)搜索“ Universal RP” 并安装 Universal RP,并设置Graphics/Scriptable Render Pipeline Settings。

这会添加“实体”作为依赖项,并递归添加它所依赖的关联包( Burst、Collections、Jobs、Mathematics等)。

在这里插入图片描述

Mono To Dots

如何从Mono发送控制指令,比如创建士兵的命令到Dots中,让Dots创建指定的实体呢?
我们需要使用到DynamicBuffer,一个Dots中的消息Buffer队列,我们在Mono中可以通过World.EntityManager,获取这个共享的消息队列,并往里面添加消息数据,Dots只需要在System下接受数据并解析即可。

public class GameManager : MonoBehaviour
{public static GameManager Instance { get; private set; }private EntityManager _entityManager;private Entity _commandEntity;private void Start(){Instance = this;_entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;//创建一个专门用于存储游戏命令的"信箱实体",相当于在 ECS 世界中创建了一个命令接收站_commandEntity = _entityManager.CreateEntity();// 为该实体附加一个可动态增长的缓冲区,用于存储多个 GameCommand 命令_entityManager.AddBuffer<GameCommand>(_commandEntity);}private void Update(){if (Input.GetKeyDown(KeyCode.Alpha1))AddSpawnCommand(Faction.Red, SolderType.Melee);}void AddSpawnCommand(Faction faction, SolderType solder, int num = 1){DynamicBuffer<GameCommand> buffer = _entityManager.GetBuffer<GameCommand>(_commandEntity);// 解析网络数据为命令(示例)var command = new GameCommand{CMD = CommandType.SpawnUnit,Faction = faction,Solder = solder,Number = num};buffer.Add(command);}
//UnitSpanerSystem系统类
public partial struct UnitSpawnerSystem : ISystem
{[BurstCompile]public void OnCreate(ref SystemState state){state.RequireForUpdate<EndSimulationEntityCommandBufferSystem.Singleton>();state.RequireForUpdate<EntitiesReferences>();}[BurstCompile]public void OnUpdate(ref SystemState state){var ecbSingleton = SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>();var ecb = ecbSingleton.CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();var entitiesReferences = SystemAPI.GetSingleton<EntitiesReferences>();var job = new UnitSpawnerJob{EntitiesReferences = entitiesReferences,ECB = ecb};var jobHandle = job.ScheduleParallel(state.Dependency);jobHandle.Complete();}
}//UnitSpawnerJob类,用来实现多线程执行任务
[BurstCompile]
public partial struct UnitSpawnerJob : IJobEntity
{public EntityCommandBuffer.ParallelWriter ECB;public EntitiesReferences EntitiesReferences;public void Execute([EntityIndexInQuery] int index, ref DynamicBuffer<GameCommand> buffer){//buffer中会接收到来自Mono端的消息foreach (GameCommand cmd in buffer){ProcessCommand(index, cmd);}buffer.Clear();}//解析命令private void ProcessCommand(int index, GameCommand cmd){switch (cmd.CMD){case CommandType.SpawnUnit:var prefabEntity = GetPrefab(cmd);float3 startPosition = GetBornPos(cmd);float3 targetPosition = GetTargetPos(cmd);Entity zombieEntity = ECB.Instantiate(index, prefabEntity);ECB.SetComponent(index, zombieEntity, LocalTransform.FromPosition(startPosition));ECB.SetComponent(index, zombieEntity, new UnitMover{moveSpeed = 2,rotationSpeed = 2,targetPosition = targetPosition});break;case CommandType.DestroyUnit:break;case CommandType.ChangeTeam:break;default:throw new ArgumentOutOfRangeException();}}
}

Dots To Mono

从Dots把消息发送给Mono层,比如我们的Dots系统中,有士兵死亡,或者游戏的成功/失败,我们需要通知Mono层的主UI更新界面显示等。我们需要用到从Dots往Mono层发送事件。

新建一个数据结构,用来从Dots往Mono发送的消息结构体

public struct RcvData
{public Faction faction;public int type;public float value;public RcvData(Faction faction,int type,float value){this.faction = faction;this.type = type;this.value = value;}
}

新建一个全局的共性数据队列静态类Facade
它主要维护了一个NativeQueue 的共享队列

public static class Facade
{public static NativeQueue<RcvData> SharedQueue { get; } = new(Allocator.Persistent);public static void Cleanup(){if (SharedQueue.IsCreated){SharedQueue.Dispose();}}
}

比如我们的阵营有一个血量,血量 变化会通知Mono端的UGUI更新界面

public partial struct HealthSystem : ISystem
{private NativeQueue<RcvData>.ParallelWriter _writer;private EntityCommandBuffer.ParallelWriter _ecb;[BurstCompile]public void OnCreate(ref SystemState state){state.RequireForUpdate<EndSimulationEntityCommandBufferSystem.Singleton>();_writer = Facade.SharedQueue.AsParallelWriter();}[BurstCompile]public void OnUpdate(ref SystemState state){_ecb = SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>().CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();var job = new HealthJob{Writer = _writer,ECB = _ecb,};var jobHandle = job.ScheduleParallel(state.Dependency);jobHandle.Complete(); // 确保Job执行完成}
}[BurstCompile]
public partial struct HealthJob : IJobEntity
{public NativeQueue<RcvData>.ParallelWriter Writer;public EntityCommandBuffer.ParallelWriter ECB;public void Execute([EntityIndexInQuery] int index,ref Health health){float healthNormalized = health.healthAmount / (float)health.healthAmountMax;//发送数据到UI层Writer.Enqueue(new RcvData(health.faction, 1, healthNormalized));}
}

Mono端,我们如何接受这个数据呢?

	//Update 检测Dots事件private void Update(){QueryDotsEvent();}void QueryDotsEvent(){while (Facade.SharedQueue.TryDequeue(out RcvData value)){// 主线程安全读取switch (value.type){case 1:UIManager.Instance.SetHP(value.faction, value.value);break;case 2:Money += (int)value.value;UIManager.Instance.SetMoney(value.faction, Money);break;}}}//销毁时,注意释放共享队列private void OnDestroy(){Facade.Cleanup();}

好了,这样我们就实现了Mono和Dots的双向数据通讯
应该还有别的更好的方法,欢迎大家的留言交流


文章转载自:

http://w4VllZ2y.mfzyn.cn
http://5DBPCtD8.mfzyn.cn
http://gWp9iGce.mfzyn.cn
http://rT22eSrC.mfzyn.cn
http://eSpM0Bqy.mfzyn.cn
http://vhTrToHO.mfzyn.cn
http://TMVoX9wp.mfzyn.cn
http://VO1shFZz.mfzyn.cn
http://S8mm3WRw.mfzyn.cn
http://Yfz97gpO.mfzyn.cn
http://cgoIJmt9.mfzyn.cn
http://TpzXpmyv.mfzyn.cn
http://26x0f8tw.mfzyn.cn
http://CdmvuYc0.mfzyn.cn
http://twBEWleV.mfzyn.cn
http://KNVZsjbd.mfzyn.cn
http://uaIwuJQa.mfzyn.cn
http://pSkjAq3K.mfzyn.cn
http://DLFJxaxB.mfzyn.cn
http://qW70YaZD.mfzyn.cn
http://E2olhG9P.mfzyn.cn
http://0usG3Vim.mfzyn.cn
http://6UW1FFSj.mfzyn.cn
http://izVyI1Ns.mfzyn.cn
http://FfJ4Figv.mfzyn.cn
http://MgPIOp7F.mfzyn.cn
http://bauSJ5A9.mfzyn.cn
http://NWU74Hqa.mfzyn.cn
http://Dftj8fTQ.mfzyn.cn
http://5602bHST.mfzyn.cn
http://www.dtcms.com/wzjs/770978.html

相关文章:

  • 内蒙古建设厅建筑网站图片做多的网站是哪个
  • 衡阳网站建设衡阳千度网络个人可以做几个网站
  • 网站建设状态栏百度浏览器极速版
  • 深圳专业做网站哪家好58网站怎么样做效果会更好
  • 景安网站备案 不去拍照企业做app好还是网站好
  • 深圳商业网站建设模板菲律宾有做网站的吗
  • 山东聊城建设学校网站东莞企业网站建设公司
  • 网站底部公司是什么样的深圳市保障性住房官网
  • 网站制作机构宁德市古田县
  • 常州市网站制作dw软件制作网页图片教程
  • 如何给自己公司做网站平原网站建设价格
  • 百度网站推广电话做网站沈阳本地
  • nodejs做网站google seo网站 被k
  • 国外用什么做网站wordpress条件判断
  • 个人网站备案需要多久wordpress 获取插件目录下
  • 怎么自己做网站怎么赚钱三原县城乡建设局网站
  • 开通微网站最出名的网站建设公司
  • 专业手机网站公司哪家好安心保险官方网站
  • 天津定制开发网站网站建设用户使用手册
  • 网站平台在线提交功能网站报价详情
  • 网站可以做哪些内容股票交易网站建设
  • 棕色网站设计泰安人力资源招聘
  • 房地网站制作聊城做网站低费用
  • seo整站优化前端和后端适合什么人
  • 大数据网站开发工程师怎么让自己的网站稍微变前面点
  • 免费企业网站源码大全c 怎么做网站开发
  • 手机测评做视频网站软件开发公司有哪些
  • 成都制作网站价格表建设网络道德教育网站的有效措施有
  • 大数据平台的搭建seo好学吗
  • 网站开发用什么语言最安全知识付费问答系统网站开发