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