public void Add(DanmakuCollision obj) { if (!Set.ContainsKey(obj.Danmaku)) { Set[obj.Danmaku] = obj; } }
public DanmakuCollisionList AsReadOnly() { int count = Set.Count; DanmakuCollision[] readonlyData = new DanmakuCollision[count]; Set.Values.CopyTo(readonlyData, 0); return(new DanmakuCollisionList(readonlyData, count)); }
public void Add(DanmakuCollision obj) { if (Contains(obj)) { return; } CheckCapacity(1); Array[Count++] = obj; }
void CheckCapacity(int count) { if (Count + count <= Capacity) { return; } var newArray = new DanmakuCollision[Capacity * kGrowthFactor]; System.Array.Copy(Array, 0, newArray, 0, Count); Array = newArray; }
internal static unsafe void TestPoolCollisions(DanmakuPool pool) { var layersPtr = (int * )(pool.CollisionMasks.GetUnsafePtr()); var count = pool.ActiveCount; for (var i = 0; i < count; i++) { if (*layersPtr++ == 0) { continue; } var layerMask = pool.CollisionMasks[i]; var oldPosition = pool.OldPositions[i]; var direction = pool.Positions[i] - oldPosition; var distance = direction.magnitude; var hits = Physics2D.CircleCastNonAlloc(oldPosition, pool.ColliderRadius, direction, raycastCache, distance, layerMask); if (hits <= 0) { continue; } var danmaku = new Danmaku(pool, i); for (var j = 0; j < hits; j++) { var collider = raycastCache[j].collider; List <DanmakuCollider> danmakuColliders; if (!ColliderMap.TryGetValue(collider, out danmakuColliders)) { continue; } var collision = new DanmakuCollision { Danmaku = danmaku, RaycastHit = raycastCache[j] }; foreach (var dCollider in danmakuColliders) { if (dCollider != null && dCollider.isActiveAndEnabled) { dCollider.AddDanmaku(collision); } } } } }
public bool Contains(DanmakuCollision obj) { if (Count <= 1024) { bool contained = false; for (var i = 0; i < Count; i++) { contained |= Array[i].Danmaku == obj.Danmaku; } return(contained); } else { for (var i = 0; i < Count; i++) { if (Array[i].Danmaku == obj.Danmaku) { return(true); } } return(false); } }
internal void AddDanmaku(DanmakuCollision danmaku) => collidedDanmaku.Add(danmaku);