123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- namespace ObjectScripts
- {
- /// <summary>
- /// <br>Handels the Movement and also triggers Animation </br>
- /// <br>Uses Input from DataObject</br>
- /// </summary>
- public class Movement : MonoBehaviour
- {
- /// <summary>
- /// <br>Schnittstelle über welche die Daten and das GameObject übergeben und ausgelsen werden können.</br>
- /// </summary>
- private DataObject DataObject;
- /// <summary>
- /// <br>Left, Right wird gesetzt wenn ein EntityType.CAR oder EntityType.TRUCK ist.</br>
- /// <br>Falls es sich um ein ein EntityType.BIKE handelt wird Left gesetzt, was der Lenker ist.</br>
- /// <br>SensorTransform ist die Referenz zum Sensor in der Scene, welcher in der Realen Welte gerade das Object sieht.</br>
- /// </summary>
- private Transform Left, Right, SensorTransform;
- /// <summary>
- /// <br>Refrenz zum Kopf, wird nur gesetzt wenn es sich um eine EntityType.PERSON handelt.</br>
- /// </summary>
- 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<DataObject>();
- 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;
- }
- }
- /// <summary>
- /// <br>Inline um Sensor relative Punkte in WorldPunkte zu mappen</br>
- /// </summary>
- private Vector3 MapToLocalPoint(Vector3 rotation)
- {
- return SensorTransform.TransformPoint(rotation);
- }
- }
- }
|