3using NaughtyAttributes;
6using System.Collections;
7using System.Collections.Generic;
9using System.Runtime.Serialization;
30 private List<KeyValuePair<string, Connection>> connections;
32 internal Dictionary<string, ActionObject> actions;
34 private string currentOutput =
"";
37 PointerEventData m_PointerEventData;
41 private bool rightClickMenu;
42 private Vector3 rightClickPos = Vector3.zero;
44 private string lastClickedOn =
"";
45 internal bool fastForwarding =
false;
46 private bool isShiftKeyDown =
false;
49 public void GetObjectData(SerializationInfo info, StreamingContext context)
51 info.AddValue(
"connections", connections);
57 public Controller(SerializationInfo info, StreamingContext context)
62 connections =
new List<KeyValuePair<string, Connection>>();
63 var dict = (Dictionary<string, Connection>)info.GetValue(
"connections", typeof(Dictionary<string, Connection>));
64 foreach (var kv
in dict)
66 connections.Add(
new KeyValuePair<string, Connection>(kv.Key, kv.Value));
72 (List<KeyValuePair<string, Connection>>)info.GetValue(
"connections", typeof(List<KeyValuePair<string, Connection>>));
75 actions = (Dictionary<string, ActionObject>)info.GetValue(
"actions", typeof(Dictionary<string, ActionObject>));
101 var translationTableActions =
new Dictionary<string, string>();
102 var translationTableInOutputs =
new Dictionary<string, string>();
104 foreach (var action
in controller.actions)
106 if (actionType && actionType.GetComponent<
ActionObject>())
107 if (action.Value.GetType() == actionType.GetComponent<
ActionObject>().GetType())
110 var newaction = actions.Last().Value;
111 var oldaction = GameObject.Find(action.Key);
115 newaction.transform.localPosition = oldaction.transform.localPosition;
116 newaction.
comment = action.Value.comment;
117 newaction.minimized = action.Value.minimized;
118 newaction.ApplyComment();
119 newaction.GetOriginalHeight();
120 if (newaction.minimized)
122 StartCoroutine(newaction.LateMinimize());
128 translationTableActions.Add(action.Key, actions.Last().Key);
132 var targetnum = (action.Value as
WaiterAction).savedInputCount;
133 (newaction as
WaiterAction).savedInputCount = targetnum;
134 (newaction as
WaiterAction).inputCount.text = targetnum.ToString();
137 newaction.inPuts.Clear();
138 foreach (var inID
in (newaction as
WaiterAction).inIDs) newaction.inPuts.Add(inID.Value);
172 pa.targetPosition = (action.Value as
PositionAction).targetPosition;
173 pa.targetRotation = (action.Value as
PositionAction).targetRotation;
176 pa.useObjectPositioning = (action.Value as
PositionAction).useObjectPositioning;
182 pa.selectedLocalHash = (action.Value as
PositionAction).selectedLocalHash;
184 pa.RefreshTargetDisplay();
196 hpa.RefreshTargetDisplay();
201 hta.targetPosition = (action.Value as
HoldToolAction).targetPosition;
202 hta.targetRotation = (action.Value as
HoldToolAction).targetRotation;
205 hta.customToolHash = (action.Value as
HoldToolAction).customToolHash;
208 hta.drop.SetValueWithoutNotify((action.Value as
HoldToolAction).toolIndex);
210 hta.SetupIfDigitalTW();
213 hta.SetGameObjectJob((action.Value as
HoldToolAction).selectedHash));
214 hta.RefreshTargetDisplay();
219 toola.targetPosition = (action.Value as
ToolAction).targetPosition;
220 toola.targetRotation = (action.Value as
ToolAction).targetRotation;
221 toola.toolIndex = (action.Value as
ToolAction).toolIndex;
223 toola.torqueNm = (action.Value as
ToolAction).torqueNm;
225 toola.taktTime = (action.Value as
ToolAction).taktTime;
226 toola.customToolHash = (action.Value as
ToolAction).customToolHash;
227 toola.drop.SetValueWithoutNotify((action.Value as
ToolAction).toolIndex);
229 toola.SetupIfDigitalTW();
232 toola.SetGameObjectJob((action.Value as
ToolAction).selectedHash));
234 toola.hasTwoObjects = (action.Value as
ToolAction).hasTwoObjects;
235 toola.secondPos = (action.Value as
ToolAction).secondPos;
236 toola.secondRot = (action.Value as
ToolAction).secondRot;
237 toola.secondGoHash = (action.Value as
ToolAction).secondGoHash;
239 toola.RefreshTargetDisplay();
244 ma.targetPosition = (action.Value as
MoveAction).targetPosition;
245 ma.targetRotation = (action.Value as
MoveAction).targetRotation;
246 ma.timeToMove = (action.Value as
MoveAction).timeToMove;
247 ma.HandMove = (action.Value as
MoveAction).HandMove;
248 ma.RefreshTargetDisplay();
253 ca.ActionChildCount = (action.Value as
CollectorAction).ActionChildCount;
254 ca.ActionChildrenList = (action.Value as
CollectorAction).ActionChildrenList;
255 ca.GameObjectChildrenList = (action.Value as
CollectorAction).GameObjectChildrenList;
256 ca.ActionChildCount = (action.Value as
CollectorAction).ActionChildCount;
262 ca.MoveTheChildren();
267 triggera.triggerPosition = (action.Value as
TriggerAction).triggerPosition;
268 triggera.triggerRotation = (action.Value as
TriggerAction).triggerRotation;
269 triggera.triggerScale = (action.Value as
TriggerAction).triggerScale;
270 triggera.showVisuals = (action.Value as
TriggerAction).showVisuals;
271 triggera.triggerOnce = (action.Value as
TriggerAction).triggerOnce;
272 triggera.bFollowGo = (action.Value as
TriggerAction).bFollowGo;
273 triggera.SetTriggerTransformNow();
286 ra.selectedAxis = (action.Value as
RotateAction).selectedAxis;
287 ra.selectedHash = (action.Value as
RotateAction).selectedHash;
288 ra.selectedToolHash = (action.Value as
RotateAction).selectedToolHash;
289 ra.rotateAmount = (action.Value as
RotateAction).rotateAmount;
290 ra.RefreshTargetDisplay();
295 la.ledIndex = (action.Value as
LedAction).ledIndex;
296 la.drop.SetValueWithoutNotify((action.Value as
LedAction).ledIndex);
301 sounda.selectedSound = (action.Value as
SoundAction).selectedSound;
302 sounda.triggerNextOnSoundEnd =
303 (action.Value as
SoundAction).triggerNextOnSoundEnd;
308 sctipta.selectedScript = (action.Value as
ScriptAction).selectedScript;
309 sctipta.autostart = (action.Value as
ScriptAction).autostart;
310 sctipta.FillScriptText();
315 va.selectedLanguage = (action.Value as
VoiceAction).selectedLanguage;
316 va.textToSpeak = (action.Value as
VoiceAction).textToSpeak;
320 qa.quizName = (action.Value as
QuizAction).quizName;
338 rta.targetPosition = (action.Value as
RealToolAction).targetPosition;
339 rta.targetRotation = (action.Value as
RealToolAction).targetRotation;
340 rta.selectedSerial = (action.Value as
RealToolAction).selectedSerial;
343 rta.RefreshTargetDisplay();
348 fa.FailAfter = (action.Value as
FinishAction).FailAfter;
349 fa.AlwaysFail = (action.Value as
FinishAction).AlwaysFail;
351 fa.failTime = failTime;
355 Mathf.FloorToInt(failTime / 60).ToString(
"D2") +
":" +
356 (failTime % 60).ToString(
"00.00").Replace(
',',
'.');
365 fa.alwaysFailToggle.isOn =
375 if (newaction.inPuts !=
null)
376 foreach (var inPut
in newaction.inPuts)
380 translationTableInOutputs.Add(action.Value.inIDs.ElementAt(i).Key, inPut.name);
390 if (newaction.outPuts !=
null)
391 foreach (var outPut
in newaction.outPuts)
393 if (action.Value.outIDs ==
null || action.Value.outIDs.Count == 0)
399 translationTableInOutputs.Add(action.Value.outIDs.ElementAt(i).Key, outPut.name);
408 if (oldaction && !oao) Destroy(oldaction);
409 if (oao) Destroy(oao);
414 var start1 =
new List<string>();
415 var start2 =
new List<string>();
416 var end1 =
new List<string>();
417 var end2 =
new List<string>();
418 foreach (var o
in controller.connections)
422 var newactionidFrom =
423 translationTableActions[
424 controller.actions.First(x =>
425 x.Value.GetOutputs().Any(y => y.Equals(conn.fromId)) ||
426 x.Value.GetInputs().Any(y => y.Equals(conn.fromId)))
429 translationTableActions[
430 controller.actions.First(x =>
431 x.Value.GetOutputs().Any(y => y.Equals(conn.toId)) ||
432 x.Value.GetInputs().Any(y => y.Equals(conn.toId)))
434 start1.Add(translationTableInOutputs[conn.fromId]);
435 start2.Add(newactionidFrom);
436 end1.Add(translationTableInOutputs[conn.toId]);
437 end2.Add(newactionidTo);
461 for (var i = 0; i < start1.Count; i++)
468 foreach (var inOutput
in translationTableInOutputs)
470 var target = GameObject.Find(inOutput.Key);
473 DestroyImmediate(GameObject.Find(inOutput.Key));
474 target = GameObject.Find(inOutput.Key);
489 var sa = FindObjectOfType<StartAction>();
490 if (sa) lastClickedOn = sa.action;
505 private static void CleanupV2()
509 var regex =
"^[{]?[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}[}]?$";
510 var filename =
"^.*\\....$";
511 var allroot =
UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects();
512 foreach (var go
in allroot)
514 if (go.name.EndsWith(
"(Clone)")) go.name = go.name.Replace(
"(Clone)",
"");
515 if (System.Text.RegularExpressions.Regex.IsMatch(go.name, regex))
519 else if (go.name ==
"New Game Object" || go.name ==
"movingPart")
523 else if (System.Text.RegularExpressions.Regex.IsMatch(go.name, filename))
528 Destroy(GameObject.Find(
"abortion"));
535 connections =
new List<KeyValuePair<string, Connection>>();
536 actions =
new Dictionary<string, ActionObject>();
541 if (!FindObjectOfType<StartAction>())
550 if (obj.GetComponent<
StartAction>() && FindObjectOfType<StartAction>())
552 var sa = FindObjectOfType<StartAction>();
558 var go = Instantiate(obj,
UIParent.transform);
559 if (
string.IsNullOrEmpty(
id))
561 go.name = Guid.NewGuid().ToString();
569 go.transform.position = rightClickPos;
570 rightClickMenu =
false;
574 RectTransformUtility.ScreenPointToLocalPointInRectangle(
UIParent.transform as RectTransform,
575 new Vector2(Screen.width / 2, Screen.height / 2),
576 null, out var point);
577 go.transform.localPosition = point;
588 var dnd = GameObject.Find(
"DoNOTDelete");
589 var saveButton = dnd.transform.Find(
"SaveButton");
591 var title = go.transform.Find(
"Window Title Bar");
595 title.GetComponent<
Image>().color =
596 saveButton.GetComponent<
Image>().color;
597 title.GetComponentInChildren<Text>().color =
598 saveButton.GetComponentInChildren<Text>().color;
602 var chelperIn = GameObject.Find(
"CHelper_in").GetComponent<
Image>();
603 var chelperOut = GameObject.Find(
"CHelper_out").GetComponent<
Image>();
604 Sprite InSprite = Resources.Load<Sprite>(
"InPut");
605 Sprite InSpriteBlue = Resources.Load<Sprite>(
"InPut_blue");
606 Sprite OutSprite = Resources.Load<Sprite>(
"OutPut");
607 Sprite OutSpriteBlue = Resources.Load<Sprite>(
"OutPut_blue");
610 inPut.GetComponent<RectTransform>().sizeDelta =
new Vector2(30f, 50f);
611 var xPos = inPut.GetComponent<RectTransform>().localPosition.x;
612 var yPos = inPut.GetComponent<RectTransform>().localPosition.y;
613 var zPos = inPut.GetComponent<RectTransform>().localPosition.z;
614 xPos = inPut.GetComponent<RectTransform>().localPosition.x - 15.0f;
615 inPut.GetComponent<RectTransform>().localPosition =
new Vector3(xPos, yPos, zPos);
616 var img = inPut.GetComponent<
Image>();
617 Color imgColor = img.color;
618 Color otherColor =
new Color(0f, 202f / 255f, 222f / 255f);
619 if (imgColor.Equals(otherColor))
621 img.sprite = InSpriteBlue;
622 img.color =
Color.white;
626 img.sprite = InSprite;
633 outPut.GetComponent<RectTransform>().sizeDelta =
new Vector2(30f, 50f);
634 var xPos = outPut.GetComponent<RectTransform>().localPosition.x;
635 var yPos = outPut.GetComponent<RectTransform>().localPosition.y;
636 var zPos = outPut.GetComponent<RectTransform>().localPosition.z;
637 xPos = outPut.GetComponent<RectTransform>().localPosition.x + 15.0f;
638 outPut.GetComponent<RectTransform>().localPosition =
new Vector3(xPos, yPos, zPos);
639 var img = outPut.GetComponent<
Image>();
640 Color imgColor = img.color;
641 Color otherColor =
new Color(0f, 202f / 255f, 222f / 255f);
642 if (imgColor.Equals(otherColor))
644 img.sprite = OutSpriteBlue;
645 img.color =
Color.white;
649 img.sprite = OutSprite;
655 var chelperIn = GameObject.Find(
"CHelper_in").GetComponent<
Image>();
656 var chelperOut = GameObject.Find(
"CHelper_out").GetComponent<
Image>();
659 var img = inPut.GetComponent<
Image>();
660 img.sprite = chelperIn.sprite;
664 var img = outPut.GetComponent<
Image>();
665 img.sprite = chelperOut.sprite;
668 var buttons = go.transform.GetComponentsInChildren<
Button>();
670 foreach (var button
in buttons)
675 if (button.name ==
"Remove" || button.name ==
"Minimize")
678 if (!button.gameObject.GetComponent<
Image>())
681 button.gameObject.GetComponent<
Image>().color = saveButton.GetComponent<
Image>().color;
683 if (!button.gameObject.GetComponent<
Image>().sprite.name.Contains(
"Audio"))
685 button.gameObject.GetComponent<
Image>().sprite = saveButton.GetComponent<
Image>().sprite;
686 button.gameObject.GetComponent<
Image>().pixelsPerUnitMultiplier = 3;
690 if (!button.gameObject.GetComponentInChildren<Text>())
693 button.gameObject.GetComponentInChildren<Text>().color =
694 saveButton.GetComponentInChildren<Text>().color;
714 go.name = Guid.NewGuid().ToString();
721 var actionObjects = actions.ToArray();
734 catch (NullReferenceException)
742 Destroy(actions[id].gameObject);
747 catch (NullReferenceException)
757 currentOutput = actionID;
762 var last = Input.GetKey(KeyCode.LeftAlt);
763 if (actions[actionID].LimitInputTypes())
765 var acceptedInput = actions[actionID].GetAcceptedInputTypes();
766 var outputType = actions[currentOutput].GetComponent<
ActionObject>();
769 foreach (var type
in acceptedInput)
770 if (type == outputType.GetType())
774 var input = actions[actionID].
GetInput(inputID);
776 actions[actionID].inPuts[0] == input;
779 actions[actionID].GetInput(inputID).GetComponent<RectTransform>(),
780 inputID, firstInWelder));
787 actions[actionID].InputAdded(inputID);
793 var input = actions[actionID].
GetInput(inputID);
795 actions[actionID].inPuts[0] == input;
796 if (last) firstInWelder =
true;
797 var inCount = actions[actionID].inPuts.Count;
799 actions[actionID].inPuts[inCount - 1] == input;
801 actions[actionID].GetInput(inputID).GetComponent<RectTransform>(),
802 inputID, firstInWelder));
803 actions[actionID].InputAdded(inputID);
827 c.connectionId = connection;
829 var last = Input.GetKey(KeyCode.LeftAlt);
831 connections.Insert(0,
new KeyValuePair<string, Connection>(connection, c));
833 connections.Add(
new KeyValuePair<string, Connection>(connection, c));
839 connections.RemoveAt(connections.IndexOf(connections.First(x => x.Key == connectionId)));
844 var last = Input.GetKey(KeyCode.LeftAlt);
846 RemoveConnection(last ? connections.Where(x => x.Value.fromId.Equals(
id) || x.Value.toId.Equals(
id)).Last().Value
847 .connectionId : connections.Where(x => x.Value.fromId.Equals(
id) || x.Value.toId.Equals(
id)).First().Value
853 return connections.Where(x => x.Value.fromId.Equals(
id)).Count() +
854 connections.Where(x => x.Value.toId.Equals(
id)).Count() > 0;
859 return connections.Where(x => x.Value.fromId.Equals(
id) || x.Value.toId.Equals(
id)).First().Value;
864 var retval =
new List<Connection>();
865 connections.Where(x => x.Value.fromId.Equals(
id) || x.Value.toId.Equals(
id)).ToList()
866 .ForEach(x => retval.Add(x.Value));
867 return retval.ToArray();
873 return connections.First(x => x.Key.Equals(
id)).Value;
878 var connectionIds =
new List<string>();
880 foreach (var conn
in connections)
881 if (actions[
id].GetInputs().Contains(conn.Value.toId) ||
882 actions[
id].GetOutputs().Contains(conn.Value.fromId))
883 connectionIds.Add(conn.Key);
885 return connectionIds;
890 var connectionIds =
new List<string>();
892 foreach (var conn
in connections)
893 if (actions[
id].GetInputs().Contains(conn.Value.toId))
894 connectionIds.Add(conn.Key);
896 return connectionIds;
901 var connectionIds =
new List<string>();
903 foreach (var conn
in connections)
904 if (actions[
id].GetOutputs().Contains(conn.Value.fromId))
905 connectionIds.Add(conn.Key);
907 return connectionIds;
912 foreach (var conn
in connections.Where(x => x.Value.fromId.Equals(
id)))
OnTrigger?.Invoke(conn.Value.toId);
922 return connections.Any(x => x.Value.fromId.Equals(
id));
928 .Where(x => x.Value.GetOutputs().Any(y => y.Equals(
id)) || x.Value.GetInputs().Any(y => y.Equals(
id)))
934 return actions.First(x => x.Value.GetInputs().Any(y => y.Equals(
id))).Value;
939 var retval =
new List<ActionObject>();
940 actions.Where(x => x.Value.GetOutputs().Any(y => y.Equals(
id))).ToList().ForEach(x => retval.Add(x.Value));
941 return retval.ToArray();
945 var retval =
new List<ActionObject>();
946 actions.Where(x => x.Value.GetInputs().Any(y => y.Equals(
id))).ToList().ForEach(x => retval.Add(x.Value));
947 return retval.ToArray();
957 Debug.Log(JsonConvert.SerializeObject(actions));
962 var currentAction = FindObjectOfType<StartAction>();
968 while (fastForwarding)
977 if (Input.GetKey(KeyCode.LeftAlt))
980 if (myAction is
MoveAction m) { m.GetInputGO(); m.FinalPosition(); }
984 if (myAction is
PositionAction p) { p.GetInputGO(); p.FinalPosition(); }
987 if (lastClickedOn ==
id)
989 fastForwarding =
true;
990 if (!isShiftKeyDown) StartCoroutine(SlowClickOn(
id));
997 var go = tA.GetGameObject();
1002 if (myAction is
MoveAction m) m.FinalPosition();
1012 fastForwarding =
false;
1016 private IEnumerator SlowClickOn(
string id)
1024 var go = ta.GetGameObject();
1030 var currentAction = FindObjectOfType<StartAction>();
1034 fastForwarding =
false;
1038 var actionList = BuildActionList(
id);
1039 actionList.Reverse();
1041 var allActionObject = FindObjectsOfType<ActionObject>();
1042 foreach (var o
in allActionObject)
1072 foreach (var o
in actionList)
1080 if (o is
WeldAction w) { w.Reparent(); yield
return null; }
1094 fastForwarding =
false;
1097 private List<ActionObject> BuildActionList(
string id)
1101 var actionList =
new List<ActionObject>();
1103 var action = myaction;
1105 if (action is
WeldAction) actionList.Add(action);
1107 if (action is
MoveAction) actionList.Add(action);
1110 var possibleSteps =
new Queue<ActionObject>();
1113 if (possibleSteps.Count > 0) action = possibleSteps.Dequeue();
1116 foreach (var inPut
in action.inPuts)
1121 foreach (var conn
in conns)
1125 if (lastAction != tmpaction)
1126 lastAction = tmpaction;
1130 if (actionList.Contains(tmpaction) && tmpaction is
WeldAction)
1135 if (tmpaction is
WeldAction) actionList.Add(tmpaction);
1137 if (tmpaction is
MoveAction) actionList.Add(tmpaction);
1139 possibleSteps.Enqueue(tmpaction);
1144 foreach (var outPut
in action.outPuts)
1149 foreach (var conn
in conns)
1153 if (lastAction != tmpaction)
1154 lastAction = tmpaction;
1158 if (actionList.Contains(tmpaction) && tmpaction is
WeldAction)
1163 if (action == myaction)
continue;
1170 if (possibleSteps.Count > 1000)
1174 }
while (possibleSteps.Count > 0);
1182 private List<ActionObject> BuildActionListForward(
string id)
1186 var actionList =
new List<ActionObject>();
1188 var action = myaction;
1191 var possibleSteps =
new Queue<ActionObject>();
1194 if (possibleSteps.Count > 0) action = possibleSteps.Dequeue();
1195 foreach (var outPut
in action.outPuts)
1201 if (tmpaction is
WeldAction) actionList.Add(tmpaction);
1203 if (tmpaction is
MoveAction) actionList.Add(tmpaction);
1204 possibleSteps.Enqueue(tmpaction);
1206 }
while (possibleSteps.Count > 0);
1215 isShiftKeyDown = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
1217 if (Input.GetMouseButtonUp(1) && FindObjectOfType<pb_StageManagerButton>().isOn)
1219 if (!RectTransformUtility.RectangleContainsScreenPoint(
StageWindow.GetComponent<RectTransform>(),
1220 Input.mousePosition))
return;
1221 rightClickMenu =
true;
1224 var ddl = GameObject.Find(
"Dropdown List");
1226 if (RectTransformUtility.ScreenPointToWorldPointInRectangle(
UIParent.transform as RectTransform,
1227 Input.mousePosition,
null, out var pos))
1229 rightClickPos = pos;
1230 ddl.transform.position =
1236 rightClickMenu =
false;
1239 else if (rightClickMenu && Input.GetMouseButtonUp(0))
1241 rightClickMenu =
false;
UnityEngine.UI.Button Button
System.Drawing.Image Image
List< GameObject > inPuts
List< GameObject > outPuts
List< string > GetConnectionsToObject(string id)
ActionObject[] GetActionsByIn(string id)
void LoadJson(Controller controller)
ActionObject[] GetActionsByOut(string id)
Connection[] GetConnectionsByEndPointId(string id)
IEnumerator RestoreOnly()
void DragConnection(Vector2 position)
GraphicRaycaster m_Raycaster
List< string > GetOutputConnectionsToObject(string id)
Connection GetConnectionByEndPointId(string id)
ActionObject GetActionByIn(string id)
void OnStageManagerToggle()
void EndConnection(string inputID, string actionID)
void RemoveConnection(string connectionId)
void GetObjectData(SerializationInfo info, StreamingContext context)
void AddConnection(LineObject lineObj)
void DirektTrigger(string id)
bool HasConnectionByEndpoint(string id)
delegate void TriggerHandler(string id)
Connection GetConnectionById(string id)
void AddAction(GameObject obj)
IEnumerator LoadControllerFromJSON(Controller controller)
ActionObject GetActionByInOut(string id)
ActionObject GetActionById(string id)
Controller(SerializationInfo info, StreamingContext context)
EventSystem m_EventSystem
GameObject AddAction(GameObject obj, string id)
void RemoveConnectionByEndPointId(string id)
List< string > GetInputConnectionsToObject(string id)
void AddConnection(string from, string to, string connection)
List< GameObject > actionPrefabs
static Controller Instance
void StartConnection(string outputID, string actionID)
bool HasConnection(string id)
void RemoveAction(string id)
void ClickedOn(string id)
static void SetSelection(IEnumerable< GameObject > selection)
static GameObject activeGameObject
static LineDrawer Instance
void DragConnection(Vector2 position)
LineObject EndConnection(RectTransform endRect, string inputID, bool weldParent=false)
void StartConnection(RectTransform startRect, string outputID, bool blue=false)
void RemoveLine(string lineId)
static Localization_SOURCE Instance
void ReloadLanguage(GameObject onlyThis=null)