Seminar_Cable_Joints_Unity/Assets/Controller.cs

131 lines
No EOL
5.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using TMPro;
using Unity.Collections;
using Unity.VisualScripting;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using FontWeight = TMPro.FontWeight;
public class Controller : MonoBehaviour {
private List<Cable> cables = new();
//Initialize
void Awake() {
var rotatableSprite = Resources.Load<Sprite>("Rotatable");
var fixedSprite = Resources.Load<Sprite>("Fixed");
var poweredSprite = Resources.Load<Sprite>("Powered");
var freeSprite = Resources.Load<Sprite>("Free");
//prepare rollers
var gameObjects = FindObjectsByType<GameObject>(FindObjectsInactive.Exclude, FindObjectsSortMode.None);
foreach (GameObject go in gameObjects) {
RollerProperties rp = go.GetComponent<RollerProperties>();
if (rp != null) {
if (!rp.useFixedAttachmentPoint) {
switch (rp.movement) {
case RollerProperties.RotationType.Rotatable:
go.GetComponent<SpriteRenderer>().sprite = rotatableSprite;
break;
case RollerProperties.RotationType.Fixed:
go.GetComponent<SpriteRenderer>().sprite = fixedSprite;
break;
case RollerProperties.RotationType.Free:
go.GetComponent<SpriteRenderer>().sprite = freeSprite;
break;
case RollerProperties.RotationType.Powered:
go.GetComponent<SpriteRenderer>().sprite = poweredSprite;
break;
}
}
//collisions and physics
Rigidbody2D rigidbody = go.GetOrAddComponent<Rigidbody2D>();
rigidbody.useAutoMass = true; // mass is based on size
if (rp.movement == RollerProperties.RotationType.Fixed) {
rigidbody.bodyType = RigidbodyType2D.Static;
}
go.AddComponent<PolygonCollider2D>();
if (rp.start) {
cables.Add(new Cable { firstRoller = go });
}
Debug.Log("Initialized roller: " + go.name);
}
}
//create canvas to display information
var canvas = gameObject.AddComponent<Canvas>();
//prepare joints
foreach (var go in gameObjects) {
RollerProperties rp = go.GetComponent<RollerProperties>();
if (rp != null) {
if (rp.linkTo != null) {
var dist = go.AddComponent<DistanceJoint2D>();
dist.enableCollision = true;
dist.connectedBody = rp.linkTo.GetComponent<Rigidbody2D>();
dist.maxDistanceOnly = true;
rp.distanceJoint2D = dist;
//set fixed points only once
if (rp.useFixedAttachmentPoint) {
dist.anchor = rp.attachmentPoint;
}
if (rp.linkTo.GetComponent<RollerProperties>().useFixedAttachmentPoint) {
dist.connectedAnchor = rp.linkTo.GetComponent<RollerProperties>().attachmentPoint;
}
//update roller tangent attachments
rp.updateDistanceJoints();
rp.currentDistance = dist.distance = dist.DistanceInWorld(dist.anchor, dist.connectedAnchor);
}
if (rp.movement is RollerProperties.RotationType.Rotatable or RollerProperties.RotationType.Powered) {
var wheel = go.AddComponent<HingeJoint2D>();
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>();
// textMeshPro.material.shader.GetComponent<Outline>().enabled = true;
// textMeshPro.material.shader.GetComponent<Outline>().useGraphicAlpha = false;
// textMeshPro.material.shader.GetComponent<Outline>().effectDistance = new Vector2(1, -1);
textMeshPro.fontSize = .3f;
textMeshPro.color = Color.black;
textMeshPro.fontStyle = FontStyles.Bold;
textMeshPro.outlineColor = new Color(0.6f, 0.7f, 1f);
textMeshPro.outlineWidth = 0.1f;
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;
}