using System.Collections; using System.Collections.Generic; using UnityEngine; namespace ObjectScripts { /// ///
Handels the Movement and also triggers Animation
///
Uses Input from DataObject
///
public class Movement : MonoBehaviour { /// ///
Schnittstelle über welche die Daten and das GameObject übergeben und ausgelsen werden können.
///
private DataObject DataObject; /// ///
Left, Right wird gesetzt wenn ein EntityType.CAR oder EntityType.TRUCK ist.
///
Falls es sich um ein ein EntityType.BIKE handelt wird Left gesetzt, was der Lenker ist.
///
SensorTransform ist die Referenz zum Sensor in der Scene, welcher in der Realen Welte gerade das Object sieht.
///
private Transform Left, Right, SensorTransform; /// ///
Refrenz zum Kopf, wird nur gesetzt wenn es sich um eine EntityType.PERSON handelt.
///
public GameObject Head; // Letzte Position als ein neues Update reinkam. private Vector3 LastStartPos; // Start is called before the first frame update void Start() { DataObject = GetComponent(); switch (DataObject.Type) { case CSVReader.EntityType.TRUCK: //Left and Right Front Wheel Left = transform.GetChild(0).transform.GetChild(2); Right = transform.GetChild(0).transform.GetChild(4); break; case CSVReader.EntityType.CAR: Left = transform.GetChild(0).transform.GetChild(1); Right = transform.GetChild(0).transform.GetChild(3); break; case CSVReader.EntityType.BIKE: Left = transform.GetChild(0).transform.GetChild(1); break; case CSVReader.EntityType.PERSON: 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; break; } transform.SetParent(DataObject.Sensor.transform); SensorTransform = transform.parent; transform.localPosition = DataObject.TargetPos; LastStartPos = DataObject.StartPos; if (DataObject.Handler.UpdateRate == 0) { DataObject.Velocity = 0; } else { DataObject.Velocity = Vector3.Distance(DataObject.StartPos, DataObject.TargetPos) / DataObject.Handler.UpdateRate; } } // Update is called once per frame void Update() { // Setzte den Parent nur neu, wenn es sich um einen neuen Sensor handelt Transform sensorTransform = DataObject.Sensor.transform; if (this.SensorTransform != sensorTransform) { transform.SetParent(sensorTransform); this.SensorTransform = sensorTransform; } // StartPos ändert sich nur, wenn ein neues Update reinkam // Auf der Strecke zwischen StartPos und TargetPos ändert sich die Bewegungsgeschwindigkeit nicht if (!LastStartPos.Equals(DataObject.StartPos)) { DataObject.Velocity = Vector3.Distance(DataObject.StartPos, DataObject.TargetPos) / DataObject.Handler.UpdateRate; LastStartPos = DataObject.StartPos; } // Bewege Object einstück in Richtung der TargetPos mit Geschwindigkeit Velocity vom DataObject transform.localPosition = Vector3.MoveTowards(transform.localPosition, DataObject.TargetPos, (float)DataObject.Velocity * Time.deltaTime); } // Alle Veränderungen am Object die Optisch etwas ändern, müssen im LateUpdate passieren, da sonst der Animator greift void LateUpdate() { // Drehe Kopf bzw gesamtes Object Vector3 HeadRot = MapToLocalPoint(DataObject.HeadRot); Vector3 Rotation = MapToLocalPoint(DataObject.Rot); transform.LookAt(Rotation); switch (DataObject.Type) { case CSVReader.EntityType.PERSON: Head.transform.LookAt(HeadRot); Head.transform.Rotate(Vector3.back, 90); break; case CSVReader.EntityType.TRUCK: case CSVReader.EntityType.CAR: Left.transform.LookAt(HeadRot); Right.transform.LookAt(HeadRot); break; case CSVReader.EntityType.BIKE: Left.transform.LookAt(HeadRot); break; } } /// ///
Inline um Sensor relative Punkte in WorldPunkte zu mappen
///
private Vector3 MapToLocalPoint(Vector3 rotation) { return SensorTransform.TransformPoint(rotation); } } }