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

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的时候,添加到删除命令缓冲中去,系统自动完成删除。

http://www.xdnf.cn/news/453385.html

相关文章:

  • 计算机系统结构——Cache性能分析
  • 苹果处理器“仿生“命名背后的营销策略与技术创新
  • 【ROS2】报错记录及对应解决方案
  • Open3D 体素化下采样
  • 当DeepSeek遇上百年医院:解码AI医疗落地实践
  • 香橙派/树莓派读取GY39数据
  • Spring Boot 日志
  • 仿真每日一练 | 多刚体动力学分析中的自由度问题
  • 领麦微红外温度传感器:发面机非接触测温
  • AI短期学习计划(持续完善更新)
  • 基于CETOL 6σ的生产不良判定与故障分析技术应用
  • Android Framework学习五:APP启动过程原理及速度优化
  • Made with Unity | 拓展“双点”宇宙版图
  • 再来1章linux系列-17 ssh sshd sshd非对称加密(密钥加密)‌SSH对称加密组件/流程
  • 树莓派3B+ wiringPi库安装
  • 【golang】网络数据包捕获库 gopacket
  • 用户模块 - IP归属地框架吞吐测试
  • 运维日志管理全解析:从存储优化到合规审计
  • LeetCode 题解 41. 缺失的第一个正数
  • 静电的起因与静电效应:技术分析与应用
  • svn status . 命令返回分析
  • 交易所功能设计的核心架构与创新实践
  • 论文查询的ai工具 —— SCAICH
  • 总共76dp 空出20dp然后放一个控件的写法
  • Shell和Bash介绍
  • PT2022E单触控三段LED调光IC
  • 云渲染实用指南:如何高效省心地使用炫云平台
  • JVM 精华
  • [特殊字符] GSG 插件 + 渲染 101:C4D 渲染效率革命!
  • 程序设计语言----软考中级软件设计师(自用学习笔记)