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);
}
}
}