Untitled
unknown
csharp
3 years ago
3.1 kB
7
Indexable
// system
using Game.Core.Authors;
using Game.Core.Entities;
using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using Unity.Transforms;
namespace Game.Core.Systems {
[BurstCompile]
[CreateAfter(typeof(ProtectorSpawner))]
[UpdateAfter(typeof(ProtectorSpawner))]
public partial struct ProtectorMovementSystem: ISystem {
private ProtectorAspect entityAspect;
public float CurrentOrbitSpeed;
public float CurrentRotationSpeed;
private struct CoreSystemTag : IComponentData { }
private struct MovementTag : IComponentData { }
public void OnCreate(ref SystemState state) {
entityAspect = SystemAPI.GetAspectRW<ProtectorAspect>(SystemAPI.GetSingletonEntity<ProtectorEntity>());
CurrentOrbitSpeed = entityAspect.GetRandomOrbitSpeed();
CurrentRotationSpeed = entityAspect.GetRandomRotationSpeed();
state.RequireForUpdate<ProtectorEntity>();
}
public void OnDestroy(ref SystemState state) {
}
[BurstCompile]
public void OnUpdate(ref SystemState state) {
var query = SystemAPI.QueryBuilder().WithAll<ProtectorTag>().Build();
var entitiesTransform = query.ToComponentDataArray<LocalToWorldTransform>(Allocator.Temp);
for (int i = 0; i < entitiesTransform.Length; i++) {
var entityTransform = entitiesTransform[i];
var transform = entityAspect.GetOribitTransform(CurrentOrbitSpeed, entityTransform.Value);
transform.Rotation = entityAspect.GetCurrentRotaion(CurrentRotationSpeed, entityTransform.Value.Rotation);
entitiesTransform[i] = new LocalToWorldTransform {
Value = transform
};
}
entitiesTransform.Dispose();
}
}
}
// actorss methods
...
public float GetRandomOrbitSpeed() => _controllerEntityMetaData.ValueRW.RandomObj.NextFloat(5f, 35f);
public float GetRandomRotationSpeed() => _controllerEntityMetaData.ValueRW.RandomObj.NextFloat(5f, 50f);
private float angleOrbit() => 1; //_controllerEntityMetaData.ValueRW.RandomObj.NextFloat(5f, 90f);
public UniformScaleTransform GetOribitTransform(float currentOrbitSpeed,UniformScaleTransform transform) {
var dt = SystemAPI.Time.DeltaTime;
var distance = math.distance(math.float3(0, 0, 0), _transform.Position);
float3 pos;
var angle = currentOrbitSpeed * dt;
pos.x = math.cos(angle) * distance;
pos.y = 0f;
pos.z = math.sin(angle) * distance;
return new UniformScaleTransform {
Position = pos,
Rotation = transform.Rotation,
Scale = transform.Scale
};
}
public Quaternion GetCurrentRotaion(float currentRotationSpeed, Quaternion currentRotation) {
var dt = SystemAPI.Time.DeltaTime;
return Quaternion.Euler(0, currentRotationSpeed * dt, 0) * currentRotation;
}
...
Editor is loading...