public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex) { NativeArray <CapsuleColliderComponentData> capsuleColliders = chunk.GetNativeArray(CapsuleColliderType); NativeArray <Position> positions = chunk.GetNativeArray(PositionType); NativeArray <Rotation> rotations = chunk.GetNativeArray(RotationType); NativeArray <Scale> scales = chunk.GetNativeArray(ScaleType); NativeArray <Entity> entities = chunk.GetNativeArray(EntityType); float3 zero = float3.zero; for (int i = 0, length = capsuleColliders.Length; i < length; ++i) { CapsuleColliderComponentData capsule = capsuleColliders[i]; Position position = positions[i]; Rotation rotation = rotations[i]; Scale scale = scales[i]; float3 dir = new float3(); float radius = 0.0f; switch (capsule.Direction) { case 0: dir.x = 1; radius = capsule.Radius * math.max(scale.Value[1], scale.Value[2]); break; case 1: dir.y = 1; radius = capsule.Radius * math.max(scale.Value[0], scale.Value[2]); break; case 2: dir.z = 1; radius = capsule.Radius * math.max(scale.Value[0], scale.Value[1]); break; } float height = capsule.Height * scale.Value[capsule.Direction]; dir = math.rotate(rotation.Value, dir); float3 offset = (dir * (height * 0.5f) - (dir * radius)); float3 point1 = position.Value + capsule.Center + offset; float3 point2 = position.Value + capsule.Center - offset; CapsulecastCommand capsuleCast = new CapsulecastCommand(point1, point2, radius, zero, 0, 0); CapsuleCasts.TryAdd(entities[i], capsuleCast); } }
void UpdateCapsuleColliders(NativeArray <Entity> entities, [ReadOnly] ArchetypeChunkComponentObjects <CapsuleCollider> capsuleColliders) { for (int i = 0, length = capsuleColliders.Length; i < length; ++i) { CapsuleCollider capsule = capsuleColliders[i]; if (capsule != null) { CapsuleColliderComponentData capsuleInfo = new CapsuleColliderComponentData(); capsuleInfo.Center = capsule.center; capsuleInfo.Direction = capsule.direction; capsuleInfo.Height = capsule.height; capsuleInfo.Radius = capsule.radius; capsuleInfo.IsTrigger = capsule.isTrigger ? (byte)1 : (byte)0; Utils.Utils.AddOrSetComponent(entities[i], capsuleInfo, GetComponentDataFromEntity <CapsuleColliderComponentData>(true), EntityManager); } } }