Movement.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace ObjectScripts
  5. {
  6. /// <summary>
  7. /// <br>Handels the Movement and also triggers Animation </br>
  8. /// <br>Uses Input from DataObject</br>
  9. /// </summary>
  10. public class Movement : MonoBehaviour
  11. {
  12. /// <summary>
  13. /// <br>Schnittstelle über welche die Daten and das GameObject übergeben und ausgelsen werden können.</br>
  14. /// </summary>
  15. private DataObject DataObject;
  16. /// <summary>
  17. /// <br>Left, Right wird gesetzt wenn ein EntityType.CAR oder EntityType.TRUCK ist.</br>
  18. /// <br>Falls es sich um ein ein EntityType.BIKE handelt wird Left gesetzt, was der Lenker ist.</br>
  19. /// <br>SensorTransform ist die Referenz zum Sensor in der Scene, welcher in der Realen Welte gerade das Object sieht.</br>
  20. /// </summary>
  21. private Transform Left, Right, SensorTransform;
  22. /// <summary>
  23. /// <br>Refrenz zum Kopf, wird nur gesetzt wenn es sich um eine EntityType.PERSON handelt.</br>
  24. /// </summary>
  25. public GameObject Head;
  26. // Letzte Position als ein neues Update reinkam.
  27. private Vector3 LastStartPos;
  28. // Start is called before the first frame update
  29. void Start()
  30. {
  31. DataObject = GetComponent<DataObject>();
  32. switch (DataObject.Type)
  33. {
  34. case CSVReader.EntityType.TRUCK:
  35. //Left and Right Front Wheel
  36. Left = transform.GetChild(0).transform.GetChild(2);
  37. Right = transform.GetChild(0).transform.GetChild(4);
  38. break;
  39. case CSVReader.EntityType.CAR:
  40. Left = transform.GetChild(0).transform.GetChild(1);
  41. Right = transform.GetChild(0).transform.GetChild(3);
  42. break;
  43. case CSVReader.EntityType.BIKE:
  44. Left = transform.GetChild(0).transform.GetChild(1);
  45. break;
  46. case CSVReader.EntityType.PERSON:
  47. Head = transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).gameObject;
  48. break;
  49. }
  50. transform.SetParent(DataObject.Sensor.transform);
  51. SensorTransform = transform.parent;
  52. transform.localPosition = DataObject.TargetPos;
  53. LastStartPos = DataObject.StartPos;
  54. if (DataObject.Handler.UpdateRate == 0)
  55. {
  56. DataObject.Velocity = 0;
  57. }
  58. else
  59. {
  60. DataObject.Velocity = Vector3.Distance(DataObject.StartPos, DataObject.TargetPos) / DataObject.Handler.UpdateRate;
  61. }
  62. }
  63. // Update is called once per frame
  64. void Update()
  65. {
  66. // Setzte den Parent nur neu, wenn es sich um einen neuen Sensor handelt
  67. Transform sensorTransform = DataObject.Sensor.transform;
  68. if (this.SensorTransform != sensorTransform)
  69. {
  70. transform.SetParent(sensorTransform);
  71. this.SensorTransform = sensorTransform;
  72. }
  73. // StartPos ändert sich nur, wenn ein neues Update reinkam
  74. // Auf der Strecke zwischen StartPos und TargetPos ändert sich die Bewegungsgeschwindigkeit nicht
  75. if (!LastStartPos.Equals(DataObject.StartPos))
  76. {
  77. DataObject.Velocity = Vector3.Distance(DataObject.StartPos, DataObject.TargetPos) / DataObject.Handler.UpdateRate;
  78. LastStartPos = DataObject.StartPos;
  79. }
  80. // Bewege Object einstück in Richtung der TargetPos mit Geschwindigkeit Velocity vom DataObject
  81. transform.localPosition = Vector3.MoveTowards(transform.localPosition, DataObject.TargetPos, (float)DataObject.Velocity * Time.deltaTime);
  82. }
  83. // Alle Veränderungen am Object die Optisch etwas ändern, müssen im LateUpdate passieren, da sonst der Animator greift
  84. void LateUpdate()
  85. {
  86. // Drehe Kopf bzw gesamtes Object
  87. Vector3 HeadRot = MapToLocalPoint(DataObject.HeadRot);
  88. Vector3 Rotation = MapToLocalPoint(DataObject.Rot);
  89. transform.LookAt(Rotation);
  90. switch (DataObject.Type)
  91. {
  92. case CSVReader.EntityType.PERSON:
  93. Head.transform.LookAt(HeadRot);
  94. Head.transform.Rotate(Vector3.back, 90);
  95. break;
  96. case CSVReader.EntityType.TRUCK:
  97. case CSVReader.EntityType.CAR:
  98. Left.transform.LookAt(HeadRot);
  99. Right.transform.LookAt(HeadRot);
  100. break;
  101. case CSVReader.EntityType.BIKE:
  102. Left.transform.LookAt(HeadRot);
  103. break;
  104. }
  105. }
  106. /// <summary>
  107. /// <br>Inline um Sensor relative Punkte in WorldPunkte zu mappen</br>
  108. /// </summary>
  109. private Vector3 MapToLocalPoint(Vector3 rotation)
  110. {
  111. return SensorTransform.TransformPoint(rotation);
  112. }
  113. }
  114. }