Files
HauntedBloodlines/Assets/Scripts/Scripted Events/ObjectForceController.cs
2025-05-29 22:31:40 +03:00

82 lines
2.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectForceController : MonoBehaviour
{
[SerializeField] private List<Rigidbody> objects; // Η λίστα με τα αντικείμενα
[SerializeField] private float forceAmount = 10f; // Πόσο force να βάλουμε
private Dictionary<Rigidbody, (Vector3, Quaternion)> startTransforms = new Dictionary<Rigidbody, (Vector3, Quaternion)>();
void Start()
{
// Αποθηκεύουμε τις αρχικές θέσεις και περιστροφές
foreach (var obj in objects)
{
startTransforms[obj] = (obj.position, obj.rotation);
}
}
public void AddForceToObjects()
{
// Εφαρμόζουμε force στον τοπικό Z άξονα
foreach (var obj in objects)
{
obj.AddForce(obj.transform.forward * forceAmount, ForceMode.Impulse);
}
}
// Μέθοδος για reset των αντικειμένων στις αρχικές τους θέσεις και περιστροφές
[System.Obsolete]
public void ResetObjects()
{
foreach (var obj in objects)
{
if (startTransforms.ContainsKey(obj))
{
obj.position = startTransforms[obj].Item1;
obj.rotation = startTransforms[obj].Item2;
obj.velocity = Vector3.zero; // Σταματάμε την κίνηση
obj.angularVelocity = Vector3.zero;
}
}
}
// Μέθοδος για ομαλή επιστροφή στη θέση με Lerp
public void LerpToStart(float duration)
{
StartCoroutine(LerpCoroutine(duration));
}
private IEnumerator LerpCoroutine(float duration)
{
float elapsedTime = 0f;
Dictionary<Rigidbody, (Vector3, Quaternion)> initialTransforms = new Dictionary<Rigidbody, (Vector3, Quaternion)>();
foreach (var obj in objects)
{
initialTransforms[obj] = (obj.position, obj.rotation);
}
while (elapsedTime < duration)
{
elapsedTime += Time.deltaTime;
float t = elapsedTime / duration;
foreach (var obj in objects)
{
if (startTransforms.ContainsKey(obj))
{
obj.position = Vector3.Lerp(initialTransforms[obj].Item1, startTransforms[obj].Item1, t);
obj.rotation = Quaternion.Lerp(initialTransforms[obj].Item2, startTransforms[obj].Item2, t);
}
}
yield return null;
}
ResetObjects(); // Σιγουρεύουμε ότι γυρνάνε ακριβώς στην αρχική τους θέση
}
}