private void OnCollisionEnter(Collision col) { AsyncFractureResult[] results = new AsyncFractureResult[Explosives.Length]; for (int i = 0; i < Explosives.Length; i++) { if (Explosives[i] != null && Explosives[i].gameObject.activeSelf) { results[i] = Explosives[i].Fracture(); } } for (int i = 0; i < results.Length; i++) { if (results[i] != null) { while (!results[i].IsComplete) { #if !UNITY_METRO || UNITY_EDITOR Thread.Sleep(1); #endif } Explode(results[i].PiecesRoot, results[i].EntireMeshBounds); } } }
public void GenerateFractureMeshes(Vector3 localPoint, Action<PreFracturedGeometry> completedCallback) { if (Application.isPlaying) { Debug.LogWarning("DinoFracture: Creating pre-fractured pieces at runtime. This can be slow if there a lot of pieces."); } if (GeneratedPieces != null) { if (Application.isPlaying) { Destroy(GeneratedPieces); } else { DestroyImmediate(GeneratedPieces); } } FractureDetails details = new FractureDetails(); details.NumPieces = NumFracturePieces; details.NumIterations = NumIterations; details.UVScale = FractureUVScale.Piece; details.Asynchronous = !Application.isPlaying; // Async in editor to prevent hangs, sync while playing details.FractureCenter = localPoint; details.FractureRadius = FractureRadius; _runningFracture = Fracture(details, false); _completionCallback = completedCallback; if (Application.isPlaying) { if (!_runningFracture.IsComplete) { // Should never get here. Debug.LogError("DinoFracture: Prefracture task is not complete"); } OnPreFractureComplete(); } else { #if UNITY_EDITOR EditorApplication.update += EditorUpdate; #endif } }
protected override AsyncFractureResult FractureInternal(Vector3 localPos) { if (gameObject.activeSelf) { if (GeneratedPieces == null) { GenerateFractureMeshes(localPos, null); EnableFracturePieces(); } else { EnableFracturePieces(); OnFractureEventArgs args = new OnFractureEventArgs(this, GeneratedPieces); // Notify scripts on this object _ignoreOnFractured = true; gameObject.SendMessage("OnFracture", args, SendMessageOptions.DontRequireReceiver); _ignoreOnFractured = false; // Notify each fracture piece Transform trans = GeneratedPieces.transform; for (int i = 0; i < trans.childCount; i++) { trans.GetChild(i).gameObject.SendMessage("OnFracture", args, SendMessageOptions.DontRequireReceiver); } } gameObject.SetActive(false); AsyncFractureResult result = new AsyncFractureResult(); result.SetResult(GeneratedPieces, EntireMeshBounds); return result; } else { AsyncFractureResult result = new AsyncFractureResult(); result.SetResult(null, new Bounds()); return result; } }
private void OnPreFractureComplete() { GeneratedPieces = _runningFracture.PiecesRoot; EntireMeshBounds = _runningFracture.EntireMeshBounds; GeneratedPieces.SetActive(false); _runningFracture = null; if (_completionCallback != null) { _completionCallback(this); } }
public void StopRunningFracture() { #if UNITY_EDITOR EditorApplication.update -= EditorUpdate; #endif _runningFracture.StopFracture(); _runningFracture = null; StopFracture(); }