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

CS016-2-unity ecs

目录

【23】射击改进

【24】僵尸生成器

​编辑【25】随机行走

【27】射击光效


【23】射击改进

a. 当距离目标太远的时候,要继续移动。而当距离目标到达攻击距离之后,则停止移动。

上图中的if:判断自身和目标的距离是否大于攻击距离,如果是,则将目标位置设置为targetLocalTransform.Position。

else语句,是说明小于等于攻击距离,此时如何停止呢?直接更改目的位置为自身的位置。此时就可以停止移动了。

b. 旋转控制

要确保在攻击的时候,单位的朝向是朝着僵尸的。

根据当前单位的位置和目标攻击的位置计算出朝向,然后将朝向单位化。

计算出旋转的四元数,使用的函数是,quaternion.LookRotation函数。

最后用math.slerp差值出一个四元数作为最终的旋转四元数。

【24】僵尸生成器

a. 要学会从面向对象的编程转向面向数据的编程。

定义一个僵尸生成器的monobehavior:ZombieSpawnerAuthoring。需要将ZombieSpawnerAuthoring拖拽到场景的物体上,这里是ZombieSpawner。

b. 创建的实体,得先序列化到EntitiesReferencesAuthoring上,将其gameobject转为zombiePrefabEntity。

然后通过SystemAPI.GetSingleton()拿到这个单例,访问其中的zombiePrefabEntity。调用state.EntityManager.Instantiate方法,创建entity。创建出来之后设置其位置。

【25】随机行走

a. 随机种子,必须使用不同的种子才能得到不同的随机数,最简单的方法是使用实体的索引作为种子。

b. 在遍历的时候,不能动态添加和删除实体组件。比如你想动态的给实体添加组件随机生成组件,不能通过下面的方式。而正确的做法是使用命令缓冲。

c. 使用命令缓冲动态的给实体添加组件,一定要明确系统是针对所有具有相同特征的所有实体,而不是单独一个实体。当然也可以是一个单独的实体,这个要为某个实体添加专属的标签。

【26】血条制作教程

【Unity】【DOTS】使用 DOTS 制作完整RTS游戏【26】血条制作教程_哔哩哔哩_bilibili

a. 血条的制作

父物体的bar的位置是:

子物体的bar的位置是:(0,0,0)

这里比较巧妙的是直接缩放父物体bar的缩放即可。父物体是往中间缩放,但是因为位置是(-0.5,0,0),导致子物体bar的缩放从右往左缩放。

b. 血条朝向摄像机

如下图所示,我们拿到父物体bar的依赖实体,这里就是BaseUnit,也就是这句代码;

LocalTransform parentLocalTransform = SystemAPI.GetComponent(healthBar.ValueRO.healthEntity);

让其做世界到本地变换:parentLocalTransform.InverseTransformRotation(quaternion.LookRotation(cameraForward, math.up());

然后将其赋值给localTransform.ValueRW.Rotation,这说明这个localTransform.ValueRW.Rotation是local的。所以上面的quaternion.LookRotation(cameraForward, math.up())其实得到是world的旋转,故要将其转为父亲下的旋转,也即是local的。

c. 血量改变时才出发计算,这个如何做呢?

得到健康组件Health,监听health.onHealthChanged变量,如果其没有变化则直接continue.

d. 健康组件的onHealthChanged的变量何时重置、何时设置。

重置在重置系统里面做,如下面的第二个红色方框。第一个红色方框指定这个重置系统在LateSimulateSystemGroup组中进行更新,并且是本组的最后更新。

同时保证血条系统也在LateSimulateSystemGroup组中更新。

e. 在满血的时候,将血条隐藏掉。在掉血的情况下,将血条显示出来。

f. 问题代码,在开启burst编译的情况下,不能访问托管的代码。比如这里下面的代码。临时解决的方法是,关闭burst编译。

后面有更优的解决方法。

【27】射击光效

【Unity】【DOTS】使用 DOTS 制作完整RTS游戏【27】射击光效_哔哩哔哩_bilibili

a. 在射击的时候创建灯光。ShootLightSpawnerSystem负责显示工作,监听ShootAttack中的onShoot.isTriggered是否为true。如果是true则实例化灯光。

这里调用state.EntityManager.Instantiate方法实例化一个实体。

b. ShootAttack组件中的onShoot是一个结构体。里面封装了是否发生了射击,并同时记录其射击时的灯光产生位置。

c. 灯光是一个预制体,在EntitiesReferencesAuthoring脚本中直接拖拽灯光预制体到上面即可,在baker系统中负责将gameobject转为entity。

d. 灯光的生命周期控制,灯光的生命周期需要一个timer控制。当timer小于0的时候,添加到删除命令缓冲中去,系统自动完成删除。

相关文章:

CS016-2-unity ecs

目录 【23】射击改进 【24】僵尸生成器 ​编辑【25】随机行走 【27】射击光效 【23】射击改进 a. 当距离目标太远的时候,要继续移动。而当距离目标到达攻击距离之后,则停止移动。 上图中的if:判断自身和目标的距离是否大于攻击距离&#…...

CST软件对OPERACST软件联合仿真汽车无线充电站对人体的影响

上海又收紧了新能源车的免费上牌政策。所以年前一些伙伴和我探讨过买新能源汽车的问题,小伙伴们基本纠结的点是买插电还是纯电?我个人是很抗拒新能源车的,也开过坐过。个人有几个观点: 溢价过高,不保值。实际并不环保…...

华为2024年报:鸿蒙生态正在取得历史性突破

华为于2025年03月31日发布2024年年度报告。报告显示,华为经营结果符合预期,实现全球销售收入 8,621 亿元人民币,净利润 626 亿元人民币。2024 年研发投入达到 1,797 亿元人民币,约占全年收入的 20.8%,近十年累计投入的…...

策略模式-枚举实现

策略模式的实现方法有很多,可以通过策略类if,else实现。下面是用枚举类实现策略模式的方法。 定义一个枚举类,枚举类有抽象方法,每个枚举都实现抽象方法。这个策略,实现方法是工具类的很实现,代码简单好理解 枚举实现…...

C++中多重继承下的虚表结构

在 C 的多重继承 中,虚表(vtable)结构会变得更加复杂。 一、基础回顾:单继承下的虚表结构 类中含有虚函数 → 编译器生成虚表(每类一张);每个对象有一个隐藏的虚表指针(vptr&#x…...

LabVIEW的CAN通讯测试程序

该程序是基于 NI LabVIEW 平台开发的 CAN(Controller Area Network,控制器局域网)通讯测试程序。主要功能是对 CAN 通讯过程进行模拟、数据传输与验证,确保 CAN 通讯的正常运行和数据的准确传输。 程序详细说明 接口选择&#xff…...

Spring Boot 使用Itext绘制并导出PDF

最终效果 其实可以加分页&#xff0c;但是没有那么精细的需求&#xff0c;所以我最后就没有加&#xff0c;有兴趣的可以尝试下。 项目依赖 <!-- Spring Boot 版本有点老 --> <spring-boot.version>2.3.12.RELEASE</spring-boot.version><!-- 依…...

访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时

华为云轻量应用服务器&#xff08;Ubuntu 系统&#xff09; 遇到的问题是&#xff1a; &#x1f512; 访问 Docker 官方镜像源&#xff08;包括代理&#xff09;全部被“重置连接”或超时了&#xff0c;说明你这台服务器的出境网络对这些国外域名限制很严格&#xff0c;常见于华…...

RPC框架源码分析学习(二)

RPC框架源码分析与原理解读 前言 在分布式系统开发中&#xff0c;远程过程调用(RPC)是一项基础且关键的技术。通过对KVstorageBaseRaft-cpp项目RPC模块的源码分析&#xff0c;我深入理解了RPC框架的工作原理和实现细节。本文将从程序员视角分享我的学习心得。 框架概述 本项…...

【测试】BUG

目录 1、描述BUG的要素&#xff1a; 2、BUG的级别 3、BUG的状态的流转 4、与开发产⽣争执怎么办&#xff08;⾼频考题&#xff09; 什么是BUG&#xff1f;&#xff1f;&#xff1f; 程序与规格说明之间的不匹配才是错误 1、描述BUG的要素&#xff1a; 问题出现的版本、问…...

MongoClient和AsyncIOMotorClient的区别和用法

示例代码&#xff1a; from motor.motor_asyncio import AsyncIOMotorClient from pymongo import MongoClient&#x1f50d; 这两个库分别是&#xff1a; 名字说明举个例子pymongo.MongoClient同步版 的 MongoDB 客户端&#xff08;常规阻塞式操作&#xff09;你在主线程里一…...

Mac 环境下 JDK 版本切换全指南

概要 在 macOS 上安装了多个 JDK 后&#xff0c;可以通过系统自带的 /usr/libexec/java_home 工具来查询并切换不同版本的 Java。只需在终端中执行 /usr/libexec/java_home -V 列出所有已安装的 JDK&#xff0c;然后将你想使用的版本路径赋值给环境变量 JAVA_HOME&#xff0c;…...

Pillow 移除或更改了 FreeTypeFont.getsize() 方法

w, h self.font.getsize(label) # text width, height AttributeError: FreeTypeFont object has no attribute getsize 在Pillow 项目的变更日志里可以查到哪个版本移除了 getsize() 方法&#xff0c;Pillow仓库&#xff1a; Releases python-pillow/Pillow GitHub 因为…...

数据结构中链表的含义与link

在数据结构中,链表是一种常见的数据结构,它由一组节点组成,每个节点包含两部分:数据部分和指针部分。指针部分用于指向下一个节点的地址。这种结构允许高效的插入和删除操作。 链表的节点表示 链表节点的基本结构可以用以下伪代码表示: Node {data // 存储的数据next /…...

视频编辑软件无限音频、视频、图文轨

威力导演APP的特色功能包括无限音频、视频、图文轨&#xff0c;以及上百种二/三维特技转场、音/视频滤镜和多种音视频混编输出。此外&#xff0c;它还支持实时高清HDV格式、模拟信号输出&#xff0c;并具有DV25、DVACM、DV、HDV输入和输出等功能。在视频编辑领域&#xff0c;威…...

NVMe-oF(NVMe over Fabrics)

技术背景与定义 传统存储协议&#xff08;如iSCSI、FC&#xff09;无法发挥NVMe SSD性能&#xff08;如延迟<100μs、IOPS>100万&#xff09;。NVMe-oF&#xff08;NVMe over Fabrics&#xff09;由NVM Express组织于2016年发布&#xff0c;将NVMe协议从本地访问扩展到了…...

uniapp-商城-53-后台 商家信息(更新修改和深浅copy)

1、概述 文章主要讨论了在数据库管理中如何处理用户上传和修改商家信息的问题&#xff0c;特别是通过深浅拷贝技术来确保数据更新的准确性和安全性。 首先&#xff0c;解释了深拷贝和浅拷贝的区别&#xff1a;浅拷贝使得两个变量共享相同的内存地址&#xff0c;而深拷贝则创建新…...

配置 Spark 以 YARN 模式

以下是配置 Spark 以 YARN 模式运行的详细步骤&#xff1a; 环境准备 安装 JDK&#xff1a;所有节点需安装 JDK 1.8 或以上版本&#xff0c;并配置环境变量&#xff0c;确保 JAVA_HOME 正确指向安装路径。安装 Hadoop&#xff1a;安装 Hadoop&#xff08;推荐 3.x 版本&#…...

[Java实战]Spring Boot 整合 Thymeleaf (十)

[Java实战]Spring Boot 整合 Thymeleaf &#xff08;十&#xff09; 引言 在 Java Web 开发领域&#xff0c;Thymeleaf 以其自然模板、无缝 Spring 集成和强大的表达式引擎脱颖而出&#xff0c;成为 Spring Boot 官方推荐的模板引擎。本文将深度解析 Spring Boot 与 Thymelea…...

NGINX 开源与社区动态:从基石到浪潮,持续演进的生态力量

NGINX 之所以能够成为全球应用最为广泛的 Web 服务器和反向代理软件之一,其成功的核心驱动力无疑是开源。开放的源代码、活跃的社区参与以及透明的开发过程,共同铸就了 NGINX 的辉煌。然而,正如所有大型开源项目一样,NGINX 的开源之路也并非一帆风顺,其社区动态也时常涌现…...

监控易一体化运维:网络流量分析的智慧引擎

在数字化时代&#xff0c;企业运营与网络紧密相连&#xff0c;网络性能的优劣直接影响企业的发展步伐。网络流量管理在企业网络运维中占据非常关键的地位。监控易一体化运维管理软件&#xff0c;凭借其强大的网络流量分析功能&#xff0c;为企业网络的稳定高效运行提供了有力保…...

IDEA+git将分支合并到主分支、IDEA合并分支

文章目录 一、合并分支二、可能遇到的问题2.1、代码冲突 开发过程中我们可能在开发分支(dev)中进行开发&#xff0c;等上线后将代码合并到主分支(master)中&#xff0c;本文讲解如何在IDEA中将dev分支的代码合并到master分支中。 一、合并分支 功能说明&#xff1a;将dev分支的…...

QML学习01(设置宽度、高度、坐标点、标题,信号与槽,键盘事件)

QML学习 1、前言2、QML3、QML和QWidget的区别3、QtQuick下的Windows应用4、总结 1、前言 记录一下QML学习的过程&#xff0c;方便自己日后回顾&#xff0c;也可以给有需要的人提供帮助。 2、QML QML是 Qt 框架中的一种声明式编程语言&#xff0c;专门用于快速设计和开发用户…...

uniapp+vue3中自动导入ref等依赖

前言&#xff1a; 在我们使用uni-appvue3创建项目&#xff0c;开发的过程中&#xff0c;老是需要导入我们的ref、onshow等&#xff0c;那么能不能自动导入&#xff0c;不用我们每个页面都写呢&#xff1f;是没问题的&#xff0c;这里让他的小帮手来帮你减轻负担&#xff1a;他就…...

【.net core】.net core 6.0添加WCF服务引用

在 .NET Core 6.0 (.NET 6) 中&#xff0c;调用 WCF 服务 是完全支持的&#xff0c;只要服务使用的是 basicHttpBinding 或类似 HTTP 协议的绑定&#xff08;如 wsHttpBinding&#xff0c;但不推荐&#xff09; .NET Core不支持 net.tcp,只能用http形式。 .net core调用WCF服务…...

React学习———Redux 、 React Redux和react-persist

Redux Redux是一个流行的JavaScript状态管理库&#xff0c;通常用于React等前端框架结合使用。Redux 的设计思想是让应用的状态变得可预测、可追踪、易于调试和测试。 Redux的核心l理念 单一数据源&#xff1a;整个应用的状态被存储在一个唯一的Store对象中&#xff0c;所有…...

小结: js 在浏览器执行原理

浏览器多进程与多线程 现代浏览器的标签环境隔离主要通过多进程架构和多线程机制实现&#xff0c;以确保安全、性能和稳定性。以下是浏览器实现标签环境隔离的多进程和多线程交互架构的详细解析&#xff1a; ------------------- ------------------- -----------…...

【实战篇】低代码报表开发——平台运营日报表的开发实录

前言 myBuilder的推广有段时间了&#xff0c;想开发个报表看看平台运营的情况。采用myBuilder强大的报表、数据交换模块功能&#xff0c;直接开干。 1. 报表指标思考与概要设计 首先是报表模块的概要设计&#xff0c;先构思一下&#xff0c;我希望报表能查看新用户注册、活跃…...

51 单片机头文件 reg51.h 和 reg52.h 详解

51 单片机头文件详解 51 单片机的头文件reg51.h和reg52.h是开发中非常重要的文件,它们定义了单片机的特殊功能寄存器 (SFR) 和位地址。以下是对这两个头文件的详细解析: 1. 头文件概述 reg51.h:针对标准 8051 单片机(4KB ROM, 128B RAM) reg52.h:针对增强型 8052 单片…...

PyTorch中.item()函数:提取单元素张量值

PyTorch中,.item()函数是什么 在PyTorch代码中,.item() 主要用于从一个只包含单个元素的张量(Tensor)中提取出对应的Python标量值 ,具体作用和使用场景如下: 作用 获取数值:当通过计算得到一个张量,且该张量仅包含一个元素时,使用 .item() 方法可以方便地将这个元素…...