Exemplo n.º 1
0
                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);
         }
     }
 }