131 lines
No EOL
5.5 KiB
C#
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;
|
|
} |