Selzier

PhysicsSimulation

Feb 11th, 2018
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.21 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.     private static void AutoGenerateComponents() {
  54.         generatedRigidbodies = new List<Rigidbody>();
  55.         generatedColliders = new List<Collider>();
  56.  
  57.         foreach (GameObject i in Selection.gameObjects) {
  58.             if (!i.GetComponent<Rigidbody>()) {
  59.                 generatedRigidbodies.Add(i.AddComponent<Rigidbody>());
  60.             }
  61.             if (!i.GetComponent<Collider>()) {
  62.                 generatedColliders.Add(i.AddComponent<BoxCollider>());
  63.             }
  64.         }
  65.     }
  66.  
  67.     private static void RemoveAutoGeneratedComponents() {
  68.         foreach (Rigidbody rb in generatedRigidbodies) {
  69.             DestroyImmediate(rb);
  70.         }
  71.         foreach (Collider c in generatedColliders) {
  72.             DestroyImmediate(c);
  73.         }
  74.     }
  75.  
  76.     [MenuItem("Tools/Physics Simulation/Find Objects Under -1000")]
  77.     public static void CheckForGameobjectsBelow1000() {
  78.         int objectCount = 0;
  79.         GameObject[] allObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
  80.         foreach (GameObject go in allObjects) {
  81.             if (go.activeInHierarchy) {
  82.                 if (go.transform.position.y < -1000f) {
  83.                     objectCount++;
  84.                     Debug.Log("GameObject below -1000: " + go.name);
  85.                 }
  86.             }
  87.         }
  88.         Debug.Log("Total Gameobjects below -1000: " + objectCount);
  89.     }
  90.  
  91.     [MenuItem("Tools/Physics Simulation/Reset Previous Simulation")]
  92.     public static void ResetAllBodies() {
  93.         if (simulatedBodies != null) {
  94.             foreach (SimulatedBody body in simulatedBodies) {
  95.                 body.Reset();
  96.             }
  97.         }
  98.     }
  99.  
  100.     struct SimulatedBody {
  101.         public readonly Rigidbody rigidBody;
  102.         public readonly bool isSelected;
  103.         readonly Vector3 originalPosition;
  104.         readonly Quaternion originalRotation;
  105.         readonly Transform transform;
  106.  
  107.         public SimulatedBody(Rigidbody rigidBody, bool isSelected){
  108.             this.rigidBody = rigidBody;
  109.             this.isSelected = isSelected;
  110.             transform = rigidBody.transform;
  111.             originalPosition = rigidBody.position;
  112.             originalRotation = rigidBody.rotation;
  113.         }
  114.  
  115.         public void Reset() {
  116.             transform.position = originalPosition;
  117.             transform.rotation = originalRotation;
  118.             if (rigidBody != null) {
  119.                 rigidBody.velocity = Vector3.zero;
  120.                 rigidBody.angularVelocity = Vector3.zero;
  121.             }
  122.         }
  123.     }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment