using System; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using static CommunicationEvents; public class FactSpawner : MonoBehaviour { private GameObject FactRepresentation; void Start() { AddFactEvent.AddListener(FactAction); RemoveFactEvent.AddListener(DeleteObject); //Default FactRepresenation = Sphere-Prefab for Points this.FactRepresentation = (GameObject) Resources.Load("Prefabs/Sphere", typeof(GameObject)); } public void FactAction(Fact fact) { switch (fact) { case PointFact pointFact: SpawnPoint(pointFact); break; case LineFact lineFact: SpawnLine(lineFact); break; } } public void SpawnPoint(PointFact fact) { PointFact pointFact = fact; this.FactRepresentation = (GameObject)Resources.Load("Prefabs/Sphere", typeof(GameObject)); GameObject point = GameObject.Instantiate(FactRepresentation); point.transform.position = pointFact.Point; point.transform.up = pointFact.Normal; string letter = ((Char)(64+fact.Id+1)).ToString(); point.GetComponentInChildren<TextMeshPro>().text = letter; point.GetComponent<FactObject>().Id = fact.Id; pointFact.Representation = point; //If a new Point was spawned -> We are in MarkPointMode -> Then we want the collider to be disabled //Hint: Thats why by now, if we mark a Point in an other mode than MarkPointMode, the //Collider will be set disabled if(CommunicationEvents.ActiveToolMode != ToolMode.ExtraMode) point.GetComponentInChildren<SphereCollider>().enabled = false; } public void DeleteObject(Fact fact) { Debug.Log("delete obj"); GameObject point = fact.Representation; GameObject.Destroy(point); } public void SpawnLine(LineFact lineFact) { Vector3 point1 = (Facts[lineFact.Pid1] as PointFact).Point; Vector3 point2 = (Facts[lineFact.Pid2] as PointFact).Point; //Change FactRepresentation to Line this.FactRepresentation = (GameObject)Resources.Load("Prefabs/Line2", typeof(GameObject)); GameObject line = GameObject.Instantiate(FactRepresentation); //Place the Line in the centre of the two points //and change scale and rotation, so that the two points are connected by the line line.transform.position = Vector3.Lerp(point1, point2, 0.5f); var v3T = line.transform.localScale; v3T.y = (point2 - point1).magnitude; //x and z of the line/Cube-GameObject here hard coded = ratio of sphere-prefab v3T.x = 0.1f; v3T.z = 0.1f; line.transform.localScale = v3T; line.transform.rotation = Quaternion.FromToRotation(Vector3.up, point2 - point1); string letter = ((Char)(64 + lineFact.Id + 1)).ToString(); line.GetComponentInChildren<TextMeshPro>().text = letter; line.GetComponent<FactObject>().Id = lineFact.Id; //If a new Line was spawned -> We are in CreateLineMode -> Then we want the collider to be disabled if (CommunicationEvents.ActiveToolMode != ToolMode.ExtraMode) line.GetComponentInChildren<BoxCollider>().enabled = false; lineFact.Representation = line; } }