您好,我目前正在学习 DOTS,但遇到了问题。我想移动一些立方体,但他们不想。我的系统脚本如下所示:
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
var deltaTime = Time.DeltaTime;
return Entities.WithName("Cube").ForEach((ref Translation position, in Scale scale) =>
{
position.Value = NoisePosition(position.Value, deltaTime, scale.Value);
}).Schedule(inputDeps);
}
噪声位置函数根据当前给定的位置计算新位置。立方体只移动一次,然后它们会停留在那个位置并且不会进一步移动。所以我猜系统设置立方体位置但不改变初始值。所以我从 state1 开始,从中计算 state2,立方体被移动到 state2,但在下一帧它再次用 state1 计算。此处链接示例图片:https : //ibb.co/kGqb3pP 立方体的初始 y 位置始终为零,因此计算似乎有效。
我用这些线创建立方体:
var entity = entityManager.CreateEntity(cubeArchetype);
entityManager.SetComponentData(entity, new LocalToWorld {
Value = new float4x4(quaternion.identity,
new Vector3(x * scale, 0, y * scale))
});
entityManager.AddComponentData(entity, new Translation() {
Value = new float3(x * scale, 0, y * scale)});
entityManager.AddComponentData(entity, new Scale() { Value = scale });
entityManager.AddComponentData(entity, new WorldRenderBounds());
entityManager.AddSharedComponentData(entity, cubeRenderMesh);
entityManager.SetName(entity, "Cube");
对于运动代码:我使用相同的函数与独立作业系统进行比较。既然它在那里工作,逻辑应该是正确的:
Vector3 NoisePosition(Vector3 position, float time, float scale)
{
float Noise(float x, float y)
{
var pos = math.float2(x, y);
return noise.snoise(pos);
}
var noiseValue = Noise(
position.x * (RandomHeigtParameters.waveSize * scale) +
RandomHeigtParameters.offsetSpeed * time,
position.z * (RandomHeigtParameters.waveSize * scale) +
RandomHeigtParameters.offsetSpeed * time);
return new Vector3(position.x, noiseValue *
RandomHeigtParameters.height + RandomHeigtParameters.waveSize,
position.z);
}
但是,如果我将函数调用替换为一个简单position.Value += deltaTime
的立方体,则立方体会正确移动。
所以总结一下,我有点困惑,如果这里有人对 DOTS 有足够的了解来帮助我,我会很感激。提前致谢。