Advertisement
Selzier

PhysicsSimulation v2

Feb 12th, 2018
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.72 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. using System.Linq;
  6.  
  7. public class PhysicsSimulation: Editor {
  8.  
  9.     public static int maxIterations = 1000;
  10.     private static SimulatedBody[] simulatedBodies;
  11.     private static List<Rigidbody> selectedRigidbodies = new List<Rigidbody>();
  12.  
  13.     private static List<Rigidbody> generatedRigidbodies;
  14.     private static List<Collider> generatedColliders;
  15.  
  16.     [MenuItem("Tools/Physics Simulation/Run Simulation _g")]
  17.     public static void RunSimulation() {
  18.         selectedRigidbodies.Clear();
  19.  
  20.         foreach (GameObject i in Selection.gameObjects) {
  21.             Undo.RecordObject(i.transform, "Physics Simulation");
  22.         }        
  23.  
  24.         AutoGenerateComponents();
  25.  
  26.         foreach (GameObject i in Selection.gameObjects) {
  27.             if (i.GetComponent<Rigidbody>()) {
  28.                 selectedRigidbodies.Add(i.GetComponent<Rigidbody>());
  29.             }
  30.         }
  31.        
  32.         simulatedBodies = FindObjectsOfType<Rigidbody>().Select(rb => new SimulatedBody(rb, selectedRigidbodies.Contains(rb))).ToArray();
  33.  
  34.         Physics.autoSimulation = false;
  35.         for (int i = 0; i < maxIterations; i++){
  36.             Physics.Simulate(Time.fixedDeltaTime);
  37.             if (simulatedBodies.All(body => body.rigidBody.IsSleeping() || !body.isSelected)) {
  38.                 Debug.Log("Total Iterations: " + i);
  39.                 break;
  40.             }
  41.         }
  42.         Physics.autoSimulation = true;
  43.  
  44.         foreach (SimulatedBody body in simulatedBodies) {
  45.             if (!body.isSelected) {
  46.                 body.Reset();
  47.             }
  48.         }
  49.  
  50.         RemoveAutoGeneratedComponents();
  51.     }
  52.  
  53.     [MenuItem("Tools/Physics Simulation/Run Simulation _g", true)]
  54.     public static bool ValidateRunSimulation() {        
  55.         if (EditorWindow.focusedWindow.titleContent.text == "Scene") {            
  56.             return true;
  57.         }
  58.         EditorWindow.focusedWindow.SendEvent(Event.KeyboardEvent("g"));
  59.         return false;
  60.     }
  61.  
  62.     private static void AutoGenerateComponents() {
  63.         generatedRigidbodies = new List<Rigidbody>();
  64.         generatedColliders = new List<Collider>();
  65.  
  66.         foreach (GameObject i in Selection.gameObjects) {
  67.             if (!i.GetComponent<Rigidbody>()) {
  68.                 generatedRigidbodies.Add(i.AddComponent<Rigidbody>());
  69.             }
  70.             if (!i.GetComponent<Collider>()) {
  71.                 generatedColliders.Add(i.AddComponent<BoxCollider>());
  72.             }
  73.             else {
  74.                 if (i.GetComponent<MeshCollider>()) {
  75.                     i.GetComponent<MeshCollider>().convex = true;
  76.                 }
  77.             }
  78.         }
  79.     }
  80.  
  81.     private static void RemoveAutoGeneratedComponents() {
  82.         foreach (Rigidbody rb in generatedRigidbodies) {
  83.             DestroyImmediate(rb);
  84.         }
  85.         foreach (Collider c in generatedColliders) {
  86.             DestroyImmediate(c);
  87.         }
  88.     }
  89.  
  90.     [MenuItem("Tools/Physics Simulation/Find Objects Under -1000")]
  91.     public static void CheckForGameobjectsBelow1000() {
  92.         int objectCount = 0;
  93.         GameObject[] allObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
  94.         foreach (GameObject go in allObjects) {
  95.             if (go.activeInHierarchy) {
  96.                 if (go.transform.position.y < -1000f) {
  97.                     objectCount++;
  98.                     Debug.Log("GameObject below -1000: " + go.name);
  99.                 }
  100.             }
  101.         }
  102.         Debug.Log("Total Gameobjects below -1000: " + objectCount);
  103.     }
  104.  
  105.     [MenuItem("Tools/Physics Simulation/Reset Previous Simulation")]
  106.     public static void ResetAllBodies() {
  107.         if (simulatedBodies != null) {
  108.             foreach (SimulatedBody body in simulatedBodies) {
  109.                 body.Reset();
  110.             }
  111.         }
  112.     }
  113.  
  114.     struct SimulatedBody {
  115.         public readonly Rigidbody rigidBody;
  116.         public readonly bool isSelected;
  117.         readonly Vector3 originalPosition;
  118.         readonly Quaternion originalRotation;
  119.         readonly Transform transform;
  120.  
  121.         public SimulatedBody(Rigidbody rigidBody, bool isSelected){
  122.             this.rigidBody = rigidBody;
  123.             this.isSelected = isSelected;
  124.             transform = rigidBody.transform;
  125.             originalPosition = rigidBody.position;
  126.             originalRotation = rigidBody.rotation;
  127.         }
  128.  
  129.         public void Reset() {
  130.             transform.position = originalPosition;
  131.             transform.rotation = originalRotation;
  132.             if (rigidBody != null) {
  133.                 rigidBody.velocity = Vector3.zero;
  134.                 rigidBody.angularVelocity = Vector3.zero;
  135.             }
  136.         }
  137.     }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement