An open source Danmaku development kit for Unity3D.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Small optimizations

james713 46c01ec2 bd213889

+410 -17
+1
Assets/DanmakuPoolTest.cs
··· 33 33 /// </summary> 34 34 void Update() { 35 35 pool.ColliderRadius = 1; 36 + DanmakuCollider.RebuildSpatialHashes(); 36 37 pool.Update().Complete(); 37 38 timer += Time.deltaTime; 38 39 if (timer > 1/20f) {
+337 -1
Assets/Test Scene.unity
··· 113 113 debug: 114 114 m_Flags: 0 115 115 m_NavMeshData: {fileID: 0} 116 + --- !u!1 &665760968 117 + GameObject: 118 + m_ObjectHideFlags: 0 119 + m_PrefabParentObject: {fileID: 0} 120 + m_PrefabInternal: {fileID: 0} 121 + serializedVersion: 5 122 + m_Component: 123 + - component: {fileID: 665760972} 124 + - component: {fileID: 665760971} 125 + - component: {fileID: 665760970} 126 + - component: {fileID: 665760969} 127 + m_Layer: 0 128 + m_Name: New Sprite (2) 129 + m_TagString: Untagged 130 + m_Icon: {fileID: 0} 131 + m_NavMeshLayer: 0 132 + m_StaticEditorFlags: 0 133 + m_IsActive: 1 134 + --- !u!114 &665760969 135 + MonoBehaviour: 136 + m_ObjectHideFlags: 0 137 + m_PrefabParentObject: {fileID: 0} 138 + m_PrefabInternal: {fileID: 0} 139 + m_GameObject: {fileID: 665760968} 140 + m_Enabled: 1 141 + m_EditorHideFlags: 0 142 + m_Script: {fileID: 11500000, guid: 0970af4f8d9661e4fa80861c5bb48775, type: 3} 143 + m_Name: 144 + m_EditorClassIdentifier: 145 + --- !u!212 &665760970 146 + SpriteRenderer: 147 + m_ObjectHideFlags: 0 148 + m_PrefabParentObject: {fileID: 0} 149 + m_PrefabInternal: {fileID: 0} 150 + m_GameObject: {fileID: 665760968} 151 + m_Enabled: 1 152 + m_CastShadows: 0 153 + m_ReceiveShadows: 0 154 + m_DynamicOccludee: 1 155 + m_MotionVectors: 1 156 + m_LightProbeUsage: 1 157 + m_ReflectionProbeUsage: 1 158 + m_RenderingLayerMask: 4294967295 159 + m_Materials: 160 + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} 161 + m_StaticBatchInfo: 162 + firstSubMesh: 0 163 + subMeshCount: 0 164 + m_StaticBatchRoot: {fileID: 0} 165 + m_ProbeAnchor: {fileID: 0} 166 + m_LightProbeVolumeOverride: {fileID: 0} 167 + m_ScaleInLightmap: 1 168 + m_PreserveUVs: 0 169 + m_IgnoreNormalsForChartDetection: 0 170 + m_ImportantGI: 0 171 + m_StitchLightmapSeams: 0 172 + m_SelectedEditorRenderState: 0 173 + m_MinimumChartSize: 4 174 + m_AutoUVMaxDistance: 0.5 175 + m_AutoUVMaxAngle: 89 176 + m_LightmapParameters: {fileID: 0} 177 + m_SortingLayerID: 0 178 + m_SortingLayer: 0 179 + m_SortingOrder: 0 180 + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} 181 + m_Color: {r: 1, g: 1, b: 1, a: 1} 182 + m_FlipX: 0 183 + m_FlipY: 0 184 + m_DrawMode: 0 185 + m_Size: {x: 0.16, y: 0.16} 186 + m_AdaptiveModeThreshold: 0.5 187 + m_SpriteTileMode: 0 188 + m_WasSpriteAssigned: 1 189 + m_MaskInteraction: 0 190 + --- !u!61 &665760971 191 + BoxCollider2D: 192 + m_ObjectHideFlags: 0 193 + m_PrefabParentObject: {fileID: 0} 194 + m_PrefabInternal: {fileID: 0} 195 + m_GameObject: {fileID: 665760968} 196 + m_Enabled: 1 197 + m_Density: 1 198 + m_Material: {fileID: 0} 199 + m_IsTrigger: 0 200 + m_UsedByEffector: 0 201 + m_UsedByComposite: 0 202 + m_Offset: {x: 0, y: 0} 203 + m_SpriteTilingProperty: 204 + border: {x: 0.049999997, y: 0.049999997, z: 0.049999997, w: 0.049999997} 205 + pivot: {x: 0.5, y: 0.5} 206 + oldSize: {x: 0.16, y: 0.16} 207 + newSize: {x: 0.16, y: 0.16} 208 + adaptiveTilingThreshold: 0.5 209 + drawMode: 0 210 + adaptiveTiling: 0 211 + m_AutoTiling: 0 212 + serializedVersion: 2 213 + m_Size: {x: 0.15, y: 0.15} 214 + m_EdgeRadius: 0 215 + --- !u!4 &665760972 216 + Transform: 217 + m_ObjectHideFlags: 0 218 + m_PrefabParentObject: {fileID: 0} 219 + m_PrefabInternal: {fileID: 0} 220 + m_GameObject: {fileID: 665760968} 221 + m_LocalRotation: {x: 0, y: 0, z: 0.76604444, w: 0.64278764} 222 + m_LocalPosition: {x: -18.2, y: 1.6, z: 23.99378} 223 + m_LocalScale: {x: 335.9406, y: 20.803476, z: 1} 224 + m_Children: [] 225 + m_Father: {fileID: 0} 226 + m_RootOrder: 4 227 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 100} 116 228 --- !u!1 &872241319 117 229 GameObject: 118 230 m_ObjectHideFlags: 0 ··· 249 361 m_EditorClassIdentifier: 250 362 Bounds: 251 363 m_Center: {x: 0, y: 0, z: 0} 252 - m_Extent: {x: 50, y: 50, z: 2} 364 + m_Extent: {x: 500, y: 500, z: 2} 365 + --- !u!1 &1319110070 366 + GameObject: 367 + m_ObjectHideFlags: 0 368 + m_PrefabParentObject: {fileID: 0} 369 + m_PrefabInternal: {fileID: 0} 370 + serializedVersion: 5 371 + m_Component: 372 + - component: {fileID: 1319110074} 373 + - component: {fileID: 1319110073} 374 + - component: {fileID: 1319110072} 375 + - component: {fileID: 1319110071} 376 + m_Layer: 0 377 + m_Name: New Sprite (1) 378 + m_TagString: Untagged 379 + m_Icon: {fileID: 0} 380 + m_NavMeshLayer: 0 381 + m_StaticEditorFlags: 0 382 + m_IsActive: 1 383 + --- !u!114 &1319110071 384 + MonoBehaviour: 385 + m_ObjectHideFlags: 0 386 + m_PrefabParentObject: {fileID: 0} 387 + m_PrefabInternal: {fileID: 0} 388 + m_GameObject: {fileID: 1319110070} 389 + m_Enabled: 1 390 + m_EditorHideFlags: 0 391 + m_Script: {fileID: 11500000, guid: 0970af4f8d9661e4fa80861c5bb48775, type: 3} 392 + m_Name: 393 + m_EditorClassIdentifier: 394 + --- !u!212 &1319110072 395 + SpriteRenderer: 396 + m_ObjectHideFlags: 0 397 + m_PrefabParentObject: {fileID: 0} 398 + m_PrefabInternal: {fileID: 0} 399 + m_GameObject: {fileID: 1319110070} 400 + m_Enabled: 1 401 + m_CastShadows: 0 402 + m_ReceiveShadows: 0 403 + m_DynamicOccludee: 1 404 + m_MotionVectors: 1 405 + m_LightProbeUsage: 1 406 + m_ReflectionProbeUsage: 1 407 + m_RenderingLayerMask: 4294967295 408 + m_Materials: 409 + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} 410 + m_StaticBatchInfo: 411 + firstSubMesh: 0 412 + subMeshCount: 0 413 + m_StaticBatchRoot: {fileID: 0} 414 + m_ProbeAnchor: {fileID: 0} 415 + m_LightProbeVolumeOverride: {fileID: 0} 416 + m_ScaleInLightmap: 1 417 + m_PreserveUVs: 0 418 + m_IgnoreNormalsForChartDetection: 0 419 + m_ImportantGI: 0 420 + m_StitchLightmapSeams: 0 421 + m_SelectedEditorRenderState: 0 422 + m_MinimumChartSize: 4 423 + m_AutoUVMaxDistance: 0.5 424 + m_AutoUVMaxAngle: 89 425 + m_LightmapParameters: {fileID: 0} 426 + m_SortingLayerID: 0 427 + m_SortingLayer: 0 428 + m_SortingOrder: 0 429 + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} 430 + m_Color: {r: 1, g: 1, b: 1, a: 1} 431 + m_FlipX: 0 432 + m_FlipY: 0 433 + m_DrawMode: 0 434 + m_Size: {x: 0.16, y: 0.16} 435 + m_AdaptiveModeThreshold: 0.5 436 + m_SpriteTileMode: 0 437 + m_WasSpriteAssigned: 1 438 + m_MaskInteraction: 0 439 + --- !u!61 &1319110073 440 + BoxCollider2D: 441 + m_ObjectHideFlags: 0 442 + m_PrefabParentObject: {fileID: 0} 443 + m_PrefabInternal: {fileID: 0} 444 + m_GameObject: {fileID: 1319110070} 445 + m_Enabled: 1 446 + m_Density: 1 447 + m_Material: {fileID: 0} 448 + m_IsTrigger: 0 449 + m_UsedByEffector: 0 450 + m_UsedByComposite: 0 451 + m_Offset: {x: 0, y: 0} 452 + m_SpriteTilingProperty: 453 + border: {x: 0.049999997, y: 0.049999997, z: 0.049999997, w: 0.049999997} 454 + pivot: {x: 0.5, y: 0.5} 455 + oldSize: {x: 0.16, y: 0.16} 456 + newSize: {x: 0.16, y: 0.16} 457 + adaptiveTilingThreshold: 0.5 458 + drawMode: 0 459 + adaptiveTiling: 0 460 + m_AutoTiling: 0 461 + serializedVersion: 2 462 + m_Size: {x: 0.15, y: 0.15} 463 + m_EdgeRadius: 0 464 + --- !u!4 &1319110074 465 + Transform: 466 + m_ObjectHideFlags: 0 467 + m_PrefabParentObject: {fileID: 0} 468 + m_PrefabInternal: {fileID: 0} 469 + m_GameObject: {fileID: 1319110070} 470 + m_LocalRotation: {x: 0, y: 0, z: 0.08715578, w: 0.9961947} 471 + m_LocalPosition: {x: -2.2, y: 20, z: 23.99378} 472 + m_LocalScale: {x: 335.9406, y: 20.803476, z: 1} 473 + m_Children: [] 474 + m_Father: {fileID: 0} 475 + m_RootOrder: 3 476 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 10} 253 477 --- !u!1 &1481724626 254 478 GameObject: 255 479 m_ObjectHideFlags: 0 ··· 315 539 m_UseColorTemperature: 0 316 540 m_ShadowRadius: 0 317 541 m_ShadowAngle: 0 542 + --- !u!1 &1724076295 543 + GameObject: 544 + m_ObjectHideFlags: 0 545 + m_PrefabParentObject: {fileID: 0} 546 + m_PrefabInternal: {fileID: 0} 547 + serializedVersion: 5 548 + m_Component: 549 + - component: {fileID: 1724076299} 550 + - component: {fileID: 1724076298} 551 + - component: {fileID: 1724076297} 552 + - component: {fileID: 1724076296} 553 + m_Layer: 0 554 + m_Name: New Sprite (3) 555 + m_TagString: Untagged 556 + m_Icon: {fileID: 0} 557 + m_NavMeshLayer: 0 558 + m_StaticEditorFlags: 0 559 + m_IsActive: 1 560 + --- !u!114 &1724076296 561 + MonoBehaviour: 562 + m_ObjectHideFlags: 0 563 + m_PrefabParentObject: {fileID: 0} 564 + m_PrefabInternal: {fileID: 0} 565 + m_GameObject: {fileID: 1724076295} 566 + m_Enabled: 1 567 + m_EditorHideFlags: 0 568 + m_Script: {fileID: 11500000, guid: 0970af4f8d9661e4fa80861c5bb48775, type: 3} 569 + m_Name: 570 + m_EditorClassIdentifier: 571 + --- !u!212 &1724076297 572 + SpriteRenderer: 573 + m_ObjectHideFlags: 0 574 + m_PrefabParentObject: {fileID: 0} 575 + m_PrefabInternal: {fileID: 0} 576 + m_GameObject: {fileID: 1724076295} 577 + m_Enabled: 1 578 + m_CastShadows: 0 579 + m_ReceiveShadows: 0 580 + m_DynamicOccludee: 1 581 + m_MotionVectors: 1 582 + m_LightProbeUsage: 1 583 + m_ReflectionProbeUsage: 1 584 + m_RenderingLayerMask: 4294967295 585 + m_Materials: 586 + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} 587 + m_StaticBatchInfo: 588 + firstSubMesh: 0 589 + subMeshCount: 0 590 + m_StaticBatchRoot: {fileID: 0} 591 + m_ProbeAnchor: {fileID: 0} 592 + m_LightProbeVolumeOverride: {fileID: 0} 593 + m_ScaleInLightmap: 1 594 + m_PreserveUVs: 0 595 + m_IgnoreNormalsForChartDetection: 0 596 + m_ImportantGI: 0 597 + m_StitchLightmapSeams: 0 598 + m_SelectedEditorRenderState: 0 599 + m_MinimumChartSize: 4 600 + m_AutoUVMaxDistance: 0.5 601 + m_AutoUVMaxAngle: 89 602 + m_LightmapParameters: {fileID: 0} 603 + m_SortingLayerID: 0 604 + m_SortingLayer: 0 605 + m_SortingOrder: 0 606 + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} 607 + m_Color: {r: 1, g: 1, b: 1, a: 1} 608 + m_FlipX: 0 609 + m_FlipY: 0 610 + m_DrawMode: 0 611 + m_Size: {x: 0.16, y: 0.16} 612 + m_AdaptiveModeThreshold: 0.5 613 + m_SpriteTileMode: 0 614 + m_WasSpriteAssigned: 1 615 + m_MaskInteraction: 0 616 + --- !u!61 &1724076298 617 + BoxCollider2D: 618 + m_ObjectHideFlags: 0 619 + m_PrefabParentObject: {fileID: 0} 620 + m_PrefabInternal: {fileID: 0} 621 + m_GameObject: {fileID: 1724076295} 622 + m_Enabled: 1 623 + m_Density: 1 624 + m_Material: {fileID: 0} 625 + m_IsTrigger: 0 626 + m_UsedByEffector: 0 627 + m_UsedByComposite: 0 628 + m_Offset: {x: 0, y: 0} 629 + m_SpriteTilingProperty: 630 + border: {x: 0.049999997, y: 0.049999997, z: 0.049999997, w: 0.049999997} 631 + pivot: {x: 0.5, y: 0.5} 632 + oldSize: {x: 0.16, y: 0.16} 633 + newSize: {x: 0.16, y: 0.16} 634 + adaptiveTilingThreshold: 0.5 635 + drawMode: 0 636 + adaptiveTiling: 0 637 + m_AutoTiling: 0 638 + serializedVersion: 2 639 + m_Size: {x: 0.15, y: 0.15} 640 + m_EdgeRadius: 0 641 + --- !u!4 &1724076299 642 + Transform: 643 + m_ObjectHideFlags: 0 644 + m_PrefabParentObject: {fileID: 0} 645 + m_PrefabInternal: {fileID: 0} 646 + m_GameObject: {fileID: 1724076295} 647 + m_LocalRotation: {x: 0, y: 0, z: 0.76604444, w: 0.64278764} 648 + m_LocalPosition: {x: -18.2, y: 1.6, z: 23.99378} 649 + m_LocalScale: {x: 335.9406, y: 20.803476, z: 1} 650 + m_Children: [] 651 + m_Father: {fileID: 0} 652 + m_RootOrder: 5 653 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 100} 318 654 --- !u!1 &1882949158 319 655 GameObject: 320 656 m_ObjectHideFlags: 0
+59 -12
Assets/src/Core/DanmakuCollider.cs
··· 7 7 8 8 public class DanmakuCollider : MonoBehaviour { 9 9 10 + struct ColliderData { 11 + public Bounds Bounds; 12 + public int LayerMask; 13 + } 14 + 10 15 static readonly List<DanmakuCollider> Colliders; 16 + static readonly List<Bounds>[] Data; 17 + static Bounds GlobalBounds; 18 + static int GlobalLayerMask; 19 + static int HighestLayer; 11 20 12 21 static DanmakuCollider() { 13 22 Colliders = new List<DanmakuCollider>(); 23 + Data = new List<Bounds>[sizeof(int) * 8]; 24 + for (var i = 0; i < Data.Length; i++) { 25 + Data[i] = new List<Bounds>(); 26 + } 14 27 } 15 28 16 29 public static int ColliderCount => Colliders.Count; 17 30 31 + public static void RebuildSpatialHashes() { 32 + for (var i = 0; i < Data.Length; i++) { 33 + Data[i].Clear(); 34 + } 35 + GlobalLayerMask = 0; 36 + HighestLayer = -1; 37 + bool globalInit = false; 38 + foreach (var collider in Colliders) { 39 + if (collider != null && collider.isActiveAndEnabled) { 40 + var layer = collider.gameObject.layer; 41 + Data[layer].Add(collider.data.Bounds); 42 + GlobalLayerMask |= 1 << layer; 43 + HighestLayer = Mathf.Max(layer + 1, HighestLayer); 44 + if (globalInit) { 45 + GlobalBounds.Encapsulate(collider.data.Bounds); 46 + } else { 47 + GlobalBounds = collider.data.Bounds; 48 + globalInit = true; 49 + } 50 + } 51 + } 52 + var center = GlobalBounds.center; 53 + center.z = 0; 54 + GlobalBounds.center = center; 55 + } 56 + 18 57 Collider2D[] colliders; 19 - Bounds totalBounds; 20 - int layerMask; 58 + ColliderData data; 21 59 22 60 /// <summary> 23 61 /// Awake is called when the script instance is being loaded. 24 62 /// </summary> 25 63 void Awake() { 26 - colliders = GetComponentsInChildren<Collider2D>(); 27 - totalBounds = BuildBounds(); 64 + colliders = GetComponents<Collider2D>(); 65 + data = BuildData(); 28 66 } 29 67 30 68 /// <summary> ··· 41 79 /// This function is called every fixed framerate frame, if the MonoBehaviour is enabled. 42 80 /// </summary> 43 81 void FixedUpdate() { 44 - totalBounds = BuildBounds(); 45 - layerMask = 1 << gameObject.layer; 82 + data = BuildData(); 46 83 } 47 84 48 85 internal static int TestCollisions(Bounds bounds) { 86 + if (!GlobalBounds.Intersects(bounds)) return 0; 49 87 int collisions = 0; 50 - foreach (var collider in Colliders) { 51 - if (!collider.totalBounds.Intersects(bounds)) continue; 52 - collisions |= collider.layerMask; 88 + for (var i = 0; i < HighestLayer; i++) { 89 + var mask = 1 << i; 90 + if ((GlobalLayerMask & mask) == 0) continue; 91 + var layerColliders = Data[i]; 92 + for (var j = 0; j < layerColliders.Count; j++) { 93 + if (!layerColliders[j].Intersects(bounds)) continue; 94 + collisions |= mask; 95 + break; 96 + } 53 97 } 54 98 return collisions; 55 99 } 56 100 57 - public Bounds BuildBounds() { 101 + ColliderData BuildData() { 58 102 Bounds? bounds = null; 59 103 foreach (var collider in colliders) { 60 104 if (collider != null && collider.enabled && collider.gameObject.activeInHierarchy) { ··· 67 111 } 68 112 var fullBounds = bounds ?? new Bounds(transform.position, Vector3.zero); 69 113 var extents = fullBounds.extents; 70 - extents.z = float.PositiveInfinity; 114 + extents.z = float.MaxValue; 71 115 fullBounds.extents = extents; 72 - return fullBounds; 116 + return new ColliderData { 117 + Bounds = fullBounds, 118 + LayerMask = 1 << gameObject.layer 119 + }; 73 120 } 74 121 75 122 }
+12 -3
Assets/src/Core/Jobs/MoveDanmaku.cs
··· 18 18 19 19 public void Execute(int index) { 20 20 var rotation = (Rotations[index] + AngularSpeeds[index] * DeltaTime) % (Mathf.PI * 2); 21 - var position = Positions[index] + (Speeds[index] * RotationUtil.ToUnitVector(rotation) * DeltaTime); 21 + var direction = RotationUtil.ToUnitVector(rotation); 22 + var position = Positions[index] + (Speeds[index] * direction * DeltaTime); 22 23 23 - var rotationQuat = Quaternion.Euler(0, 0, rotation * Mathf.Rad2Deg); 24 + var transform = new Matrix4x4(); 25 + transform[0, 0] = direction.x; 26 + transform[0, 1] = -direction.y; 27 + transform[1, 0] = direction.y; 28 + transform[1, 1] = direction.x; 29 + transform[2, 2] = 1.0f; 30 + transform[3, 3] = 1; 31 + transform[0, 3] = position.x; 32 + transform[1, 3] = position.y; 24 33 25 34 Times[index] += DeltaTime; 26 - Transforms[index] = Matrix4x4.TRS(position, rotationQuat, Vector3.one); 35 + Transforms[index] = transform; 27 36 Positions[index] = position; 28 37 Rotations[index] = rotation; 29 38 }
+1 -1
ProjectSettings/Physics2DSettings.asset
··· 41 41 m_QueriesHitTriggers: 1 42 42 m_QueriesStartInColliders: 1 43 43 m_CallbacksOnDisable: 1 44 - m_AutoSyncTransforms: 1 44 + m_AutoSyncTransforms: 0 45 45 m_AlwaysShowColliders: 0 46 46 m_ShowColliderSleep: 1 47 47 m_ShowColliderContacts: 0