using System.Collections; using System.Collections.Generic; using NUnit.Framework; using TMPro; using Unity.Collections; using Unity.VisualScripting; using UnityEditor; using UnityEngine; using FontWeight = TMPro.FontWeight; public class Controller : MonoBehaviour { private List cables = new(); //Initialize void OnEnable() { var rotatableSprite = Resources.Load("Rotatable"); var fixedSprite = Resources.Load("Fixed"); var poweredSprite = Resources.Load("Powered"); var freeSprite = Resources.Load("Free"); //prepare rollers var gameObjects = FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None); foreach (GameObject go in gameObjects) { RollerProperties rp = go.GetComponent(); if (rp != null) { Rigidbody2D settings = go.GetOrAddComponent(); switch (rp.movement) { case RollerProperties.RotationType.Rotatable: go.GetComponent().sprite = rotatableSprite; break; case RollerProperties.RotationType.Fixed: go.GetComponent().sprite = fixedSprite; break; case RollerProperties.RotationType.Free: go.GetComponent().sprite = freeSprite; break; case RollerProperties.RotationType.Powered: go.GetComponent().sprite = poweredSprite; break; } if (rp.movement == RollerProperties.RotationType.Fixed) { settings.bodyType = RigidbodyType2D.Static; } if (rp.start) { cables.Add(new Cable { firstRoller = go }); } Debug.Log("Initialized roller: " + go.name); } } //create canvas to display information var canvas = FindAnyObjectByType(); //prepare joints foreach (var go in gameObjects) { RollerProperties rp = go.GetComponent(); if (rp != null) { if (rp.linkTo != null) { var dist = go.AddComponent(); dist.enableCollision = true; dist.connectedBody = rp.linkTo.GetComponent(); dist.maxDistanceOnly = true; var (left, right) = CableJointsAlgorithm.TangentCircleCircle(go, rp.linkTo); dist.anchor = left; dist.connectedAnchor = right; rp.currentDistance = dist.distance = dist.DistanceInWorld(left, right); } if (rp.movement == RollerProperties.RotationType.Rotatable || rp.movement == RollerProperties.RotationType.Powered) { var wheel = go.AddComponent(); wheel.anchor = Vector2.zero; if (rp.movement == RollerProperties.RotationType.Powered) { wheel.useMotor = true; wheel.motor = new JointMotor2D() { maxMotorTorque = 10000, motorSpeed = 10 }; } } //create names on objects GameObject text = new GameObject(go.name + "_text"); text.transform.parent = canvas.transform; var textMeshPro = text.AddComponent(); textMeshPro.text = go.name + "\n" + (rp.clockwise ? "cw" : "ccw") + " - " + rp.movement; textMeshPro.fontSize = .3f; textMeshPro.color = Color.red; textMeshPro.fontWeight = FontWeight.Bold; textMeshPro.outlineColor = Color.white; textMeshPro.outlineWidth = 1; textMeshPro.horizontalAlignment = HorizontalAlignmentOptions.Center; textMeshPro.verticalAlignment = VerticalAlignmentOptions.Middle; textMeshPro.transform.localScale = new Vector3(100, 100, 1); textMeshPro.fontSize = .03f; textMeshPro.autoSizeTextContainer = true; textMeshPro.fontSizeMin = 0; rp.text = text; } } } // Update is called once per frame void Update() { CableJointsAlgorithm.TimeStep(cables); } } public class Cable { public GameObject firstRoller; }