2023-06-11 23:31:54 +02:00

61 lines
1.7 KiB
C#

using System.Collections.Generic;
using UnityEngine;
// Kann sein das das nur für statische Objekte funktioniert
public class DimShiftBlockable : MonoBehaviour
{
private GameObject dim1;
private GameObject dim2;
private LinkedList<GameObject> collisions = new LinkedList<GameObject>();
void Start()
{
dim1 = GameObject.Find("Dim1");
dim2 = GameObject.Find("Dim2");
dim1.SetActive(true);
dim2.SetActive(false);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.LeftShift) && CanSwitchDims())
{ // CanSwitchDims ist rel. "teuer", wird aber nur ausgeführt wenn die erste condition true ergibt
ChangeDim();
}
}
bool CanSwitchDims()
{
// eine "günstigere" methode ist mir nicht eingefallen
// sollte aber in betracht der länge der liste kein problem sein
foreach (var collision in collisions)
{
if (collision.tag.Equals("DimShiftBlocker")) { return false; }
}
// falls kein dimension shift blocker unter den kollisionen ist, dann yallah abfahrt
return true;
}
void ChangeDim()
{
// invertiert den aktuellen active state der dimensionen
// spart die ganzen if statements
dim1.SetActive(!dim1.activeSelf);
dim2.SetActive(!dim2.activeSelf);
}
private void OnTriggerEnter2D(Collider2D other)
{
// addFirst weil on exit die verlassene collision im average case schneller gefunden wird
collisions.AddFirst(other.gameObject);
}
private void OnTriggerExit2D(Collider2D other)
{
collisions.Remove(other.gameObject);
}
}