Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEditor;
- using System.Linq;
- public class PhysicsSimulation: Editor {
- public static int maxIterations = 1000;
- private static SimulatedBody[] simulatedBodies;
- private static List<Rigidbody> selectedRigidbodies = new List<Rigidbody>();
- private static List<Rigidbody> generatedRigidbodies;
- private static List<Collider> generatedColliders;
- [MenuItem("Tools/Physics Simulation/Run Simulation _g")]
- public static void RunSimulation() {
- selectedRigidbodies.Clear();
- foreach (GameObject i in Selection.gameObjects) {
- Undo.RecordObject(i.transform, "Physics Simulation");
- }
- AutoGenerateComponents();
- foreach (GameObject i in Selection.gameObjects) {
- if (i.GetComponent<Rigidbody>()) {
- selectedRigidbodies.Add(i.GetComponent<Rigidbody>());
- }
- }
- simulatedBodies = FindObjectsOfType<Rigidbody>().Select(rb => new SimulatedBody(rb, selectedRigidbodies.Contains(rb))).ToArray();
- Physics.autoSimulation = false;
- for (int i = 0; i < maxIterations; i++){
- Physics.Simulate(Time.fixedDeltaTime);
- if (simulatedBodies.All(body => body.rigidBody.IsSleeping() || !body.isSelected)) {
- Debug.Log("Total Iterations: " + i);
- break;
- }
- }
- Physics.autoSimulation = true;
- foreach (SimulatedBody body in simulatedBodies) {
- if (!body.isSelected) {
- body.Reset();
- }
- }
- RemoveAutoGeneratedComponents();
- }
- [MenuItem("Tools/Physics Simulation/Run Simulation _g", true)]
- public static bool ValidateRunSimulation() {
- if (EditorWindow.focusedWindow.titleContent.text == "Scene") {
- return true;
- }
- EditorWindow.focusedWindow.SendEvent(Event.KeyboardEvent("g"));
- return false;
- }
- private static void AutoGenerateComponents() {
- generatedRigidbodies = new List<Rigidbody>();
- generatedColliders = new List<Collider>();
- foreach (GameObject i in Selection.gameObjects) {
- if (!i.GetComponent<Rigidbody>()) {
- generatedRigidbodies.Add(i.AddComponent<Rigidbody>());
- }
- if (!i.GetComponent<Collider>()) {
- generatedColliders.Add(i.AddComponent<BoxCollider>());
- }
- else {
- if (i.GetComponent<MeshCollider>()) {
- i.GetComponent<MeshCollider>().convex = true;
- }
- }
- }
- }
- private static void RemoveAutoGeneratedComponents() {
- foreach (Rigidbody rb in generatedRigidbodies) {
- DestroyImmediate(rb);
- }
- foreach (Collider c in generatedColliders) {
- DestroyImmediate(c);
- }
- }
- [MenuItem("Tools/Physics Simulation/Find Objects Under -1000")]
- public static void CheckForGameobjectsBelow1000() {
- int objectCount = 0;
- GameObject[] allObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
- foreach (GameObject go in allObjects) {
- if (go.activeInHierarchy) {
- if (go.transform.position.y < -1000f) {
- objectCount++;
- Debug.Log("GameObject below -1000: " + go.name);
- }
- }
- }
- Debug.Log("Total Gameobjects below -1000: " + objectCount);
- }
- [MenuItem("Tools/Physics Simulation/Reset Previous Simulation")]
- public static void ResetAllBodies() {
- if (simulatedBodies != null) {
- foreach (SimulatedBody body in simulatedBodies) {
- body.Reset();
- }
- }
- }
- struct SimulatedBody {
- public readonly Rigidbody rigidBody;
- public readonly bool isSelected;
- readonly Vector3 originalPosition;
- readonly Quaternion originalRotation;
- readonly Transform transform;
- public SimulatedBody(Rigidbody rigidBody, bool isSelected){
- this.rigidBody = rigidBody;
- this.isSelected = isSelected;
- transform = rigidBody.transform;
- originalPosition = rigidBody.position;
- originalRotation = rigidBody.rotation;
- }
- public void Reset() {
- transform.position = originalPosition;
- transform.rotation = originalRotation;
- if (rigidBody != null) {
- rigidBody.velocity = Vector3.zero;
- rigidBody.angularVelocity = Vector3.zero;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement