Skip to content
Snippets Groups Projects
Select Git revision
  • cda734c94023b880e7779a4b49023be6afc1517c
  • master default
  • JS-based-scroll-rendering
  • Paul_Marius_Level
  • Paul_Marius_2
  • Paul_Marius
  • Andi_Mark
  • be-UnityWebView
  • gitignoreFrameitServer
  • ZimmerBSc
  • Bugfix_StageLoading
  • stages
  • MAZIFAU_Experimental
  • tsc/coneworld
  • tsc/fact-interaction
  • marcel
  • MaZiFAU_TopSort
  • mergeHelper
  • zwischenSpeichern
  • tempAndrToMaster
  • SebBranch
  • 3.0
  • v2.1
  • v2.0
  • v1.0
25 results

FactSpawner.cs

Blame
  • FactSpawner.cs 6.33 KiB
    using System;
    using System.Collections;
    using TMPro;
    using UnityEngine;
    using UnityEngine.UIElements;
    using UnityStandardAssets.Vehicles.Car;
    using static CommunicationEvents;
    using static GlobalBehaviour;
    
    public class FactSpawner : MonoBehaviour
    {
        public GameObject
            Sphere,
            Line,
            Ray,
            Angle,
            Ring,
            Circle;
    
        void Start()
        {
            AddFactEvent.AddListener(SpawnFactRepresentation);
            RemoveFactEvent.AddListener(DeleteObject);
    
            AnimateNonExistingFactEvent.AddListener(animateNonExistingFactTrigger);
        }
    
        public void SpawnFactRepresentation(Fact fact)
        {
            switch (fact)
            {
                case PointFact PointFact:
                    SpawnPoint(PointFact); break;
                case LineFact LineFact:
                    SpawnLine(LineFact); break;
                //case RightAngleFact AngleFact: //needed for Hint System
                case AbstractAngleFact AngleFact:
                    SpawnAngle(AngleFact); break;
                case RayFact RayFact:
                    SpawnRay(RayFact); break;
                case CircleFact CircleFact:
                    SpawnRingAndCircle(CircleFact); break;
                case AttachedPositionFunction AttachedPositionFunction:
                    SpawnAttachedPositionFunction(AttachedPositionFunction); break;
                default: break;
            };
        }
    
        public void SpawnAttachedPositionFunction(AttachedPositionFunction fact)
        {
            var attachedBehaviour = fact.Fact.Representation.AddComponent<AttachedPositionFunctionBehaviour>();
            attachedBehaviour.URI = fact.Id;
    
            fact.Representation = attachedBehaviour.gameObject;
        }
    
        public void SpawnPoint(PointFact fact)
        {
            GameObject point = GameObject.Instantiate(Sphere);
            point.transform.position = fact.Position;
            point.transform.rotation = fact.Rotation;
            point.GetComponentInChildren<TextMeshPro>().text = fact.Label;
            point.GetComponent<FactObject>().URI = fact.Id;
            fact.Representation = point;
        }
    
        public void SpawnLine(LineFact fact)
        {
            //Change FactRepresentation to Line
            GameObject line = GameObject.Instantiate(Line);
            //Place the Line in the centre of the two points
            line.transform.position = fact.Position;
    
            //Change scale and rotation, so that the two points are connected by the line
            //and without affecting Scale of the Text
            line.transform.GetChild(0).localScale = fact.LocalScale;
            line.transform.GetChild(0).rotation = fact.Rotation;
    
            line.GetComponentInChildren<TextMeshPro>().text =
                fact.Label + " = " + Math.Round(fact.Distance, 2) + " m";
            line.GetComponentInChildren<FactObject>().URI = fact.Id;
    
            fact.Representation = line;
        }
    
        public void SpawnRay(RayFact fact)
        {
            //Change FactRepresentation to Line
            GameObject line = GameObject.Instantiate(Ray);
            //Place the Line in the centre of the two points
            line.transform.position = fact.Position;
    
            //Change scale and rotation, so that the two points are connected by the line
            //and without affecting Scale of the Text
            line.transform.GetChild(0).localScale = fact.LocalScale;
            line.transform.GetChild(0).rotation = fact.Rotation;
    
            line.GetComponentInChildren<TextMeshPro>().text = fact.Label;
            line.GetComponentInChildren<FactObject>().URI = fact.Id;
    
            fact.Representation = line;
        }
    
        //Spawn an angle: point with id = angleFact.Pid2 is the point where the angle gets applied
        public void SpawnAngle(AbstractAngleFact fact)
        {
            Vector3 Psotion = fact.Position;
            Quaternion Rotation = fact.Rotation;
            float angleValue = fact.angle;
    
            //Change FactRepresentation to Angle
            GameObject angle = GameObject.Instantiate(Angle);
    
            //Place the Angle at position of point2
            angle.transform.SetPositionAndRotation(Psotion, Rotation);
    
            //Set text of angle
            TextMeshPro[] texts = angle.GetComponentsInChildren<TextMeshPro>();
            foreach (TextMeshPro t in texts)
            {
                //Change Text not to the id, but to the angle-value (from both sides)
                t.text = Math.Round(angleValue, 2) + "°";
            }
    
            //Generate angle mesh
            CircleSegmentGenerator[] segments = angle.GetComponentsInChildren<CircleSegmentGenerator>();
            foreach (CircleSegmentGenerator c in segments)
                c.setAngle(angleValue);
    
            angle.GetComponentInChildren<FactObject>().URI = fact.Id;
            fact.Representation = angle;
        }
    
        public void SpawnRingAndCircle(CircleFact fact)
        {
            var ringAndCircleGO = new GameObject("RingAndCircle");
            SpawnRing(fact, ringAndCircleGO.transform);
            SpawnCircle(fact, ringAndCircleGO.transform);
    
            //Move Ring to middlePoint
            ringAndCircleGO.transform.position = fact.Position;
    
            fact.Representation = ringAndCircleGO;
        }
    
        public void SpawnRing(CircleFact circleFact, Transform parent = null)
        {
            GameObject ring = GameObject.Instantiate(Ring, parent);
            var tori = ring.GetComponentsInChildren<TorusGenerator>();
            var tmpText = ring.GetComponentInChildren<TextMeshPro>();
            var FactObj = ring.GetComponentInChildren<FactObject>();
    
            //Set radii
            foreach (var torus in tori)
                torus.torusRadius = circleFact.radius;
    
            tmpText.text = $"○{circleFact.Point1.Label}";
    
            FactObj.URI = circleFact.Id;
        }
    
        public void SpawnCircle(CircleFact circleFact, Transform parent = null)
        {
            GameObject circle = Instantiate(Circle, parent);
            var FactObj = circle.GetComponentInChildren<FactObject>();
    
            //Set radius
            circle.transform.localScale = Vector3.Scale(circle.transform.localScale, circleFact.LocalScale);
    
            FactObj.URI = circleFact.Id;
        }
    
    
        public void DeleteObject(Fact fact)
            => GameObject.Destroy(fact.Representation);
    
        public void animateNonExistingFactTrigger(Fact fact)
        {
            StartCoroutine(animateNonExistingFact(fact));
    
            IEnumerator animateNonExistingFact(Fact fact)
            {
                SpawnFactRepresentation(fact);
    
                ShinyThings.HighlightFact(fact, FactObject.FactMaterials.Hint);
    
                yield return new WaitForSeconds(GlobalBehaviour.hintAnimationDuration);
    
                GameObject.Destroy(fact.Representation);
            }
        }
    
    }