2021-03-13 03:01:20 +01:00
|
|
|
using Ktyl.Util;
|
2021-03-05 17:24:50 +01:00
|
|
|
using System;
|
2021-02-25 00:41:33 +01:00
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
2021-03-17 19:31:33 +01:00
|
|
|
using DG.Tweening;
|
2021-02-25 00:41:33 +01:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
public class FallawayFloor : MonoBehaviour
|
|
|
|
{
|
2021-03-10 19:26:33 +01:00
|
|
|
// // Speed at which the object moves towards the ground.
|
2021-02-25 01:51:11 +01:00
|
|
|
public float speed;
|
2021-05-10 17:58:47 +02:00
|
|
|
|
2021-03-02 20:47:28 +01:00
|
|
|
// Time it takes for ogjecct to begin moving towards the ground.
|
|
|
|
public float fallAwayTime;
|
2021-05-10 17:58:47 +02:00
|
|
|
|
2021-03-17 19:04:31 +01:00
|
|
|
[SerializeField] private TrapSettings _settings;
|
2021-03-17 19:31:33 +01:00
|
|
|
[SerializeField] private GameObject _graphics;
|
2021-05-10 17:58:47 +02:00
|
|
|
|
2021-03-10 19:26:33 +01:00
|
|
|
private Vector3 initialPosition;
|
2021-05-10 17:58:47 +02:00
|
|
|
private Vector3 velocity;
|
2021-03-24 17:54:34 +01:00
|
|
|
|
|
|
|
public bool Falling => _triggered;
|
2021-03-17 19:04:31 +01:00
|
|
|
private bool _triggered = false;
|
2021-02-25 01:51:11 +01:00
|
|
|
|
|
|
|
private void Start()
|
|
|
|
{
|
2021-03-10 19:26:33 +01:00
|
|
|
initialPosition = transform.position;
|
2021-02-25 01:51:11 +01:00
|
|
|
}
|
|
|
|
|
2021-03-17 19:04:31 +01:00
|
|
|
private void LateUpdate()
|
|
|
|
{
|
2021-03-24 17:54:34 +01:00
|
|
|
if (!_triggered)
|
|
|
|
{
|
|
|
|
transform.position = initialPosition;
|
|
|
|
return;
|
|
|
|
}
|
2021-03-17 19:04:31 +01:00
|
|
|
|
2021-03-23 16:03:18 +01:00
|
|
|
if (_settings.SafeTime > _settings.FallawayFloor.SafeResetTime)
|
2021-03-17 19:04:31 +01:00
|
|
|
{
|
|
|
|
Reset();
|
2021-03-17 19:37:56 +01:00
|
|
|
|
|
|
|
// pop in animation
|
|
|
|
transform.localScale = Vector3.zero;
|
|
|
|
transform
|
|
|
|
.DOScale(Vector3.one, 0.5f)
|
|
|
|
.SetEase(_settings.FallawayFloor.PopInEase);
|
2021-03-17 19:04:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-10 17:58:47 +02:00
|
|
|
private void FixedUpdate()
|
|
|
|
{
|
|
|
|
transform.position += velocity * Time.fixedDeltaTime * _settings.ObjectTimeScale;
|
|
|
|
}
|
|
|
|
|
2021-02-25 01:51:11 +01:00
|
|
|
private void OnTriggerEnter(Collider other)
|
2021-02-25 00:41:33 +01:00
|
|
|
{
|
2021-03-17 19:04:31 +01:00
|
|
|
if (!_triggered && other.CompareTag("Player"))
|
2021-02-25 01:51:11 +01:00
|
|
|
{
|
2021-03-24 17:54:34 +01:00
|
|
|
Fall();
|
2021-03-13 03:01:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//The platform gets destroyed after the player resumes frozen time on a platform
|
|
|
|
private void OnTriggerStay(Collider other)
|
|
|
|
{
|
2021-03-24 13:45:19 +01:00
|
|
|
if (!_triggered && other.CompareTag("Player"))
|
2021-03-13 03:01:20 +01:00
|
|
|
{
|
2021-03-24 17:54:34 +01:00
|
|
|
Fall();
|
2021-02-25 01:51:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-24 17:54:34 +01:00
|
|
|
public void Fall()
|
2021-02-25 01:51:11 +01:00
|
|
|
{
|
2021-03-24 17:54:34 +01:00
|
|
|
// already falling
|
|
|
|
if (_triggered) return;
|
2021-05-10 17:58:47 +02:00
|
|
|
|
2021-03-24 17:54:34 +01:00
|
|
|
// time stop
|
2021-05-10 17:58:47 +02:00
|
|
|
if (_settings.ObjectTimeScale.AsBool) return;
|
|
|
|
|
2021-03-24 17:54:34 +01:00
|
|
|
StartCoroutine(FallCR());
|
|
|
|
}
|
2021-05-10 17:58:47 +02:00
|
|
|
|
2021-03-24 17:54:34 +01:00
|
|
|
private IEnumerator FallCR()
|
|
|
|
{
|
|
|
|
_triggered = true;
|
2021-05-10 17:58:47 +02:00
|
|
|
|
2021-05-16 02:22:50 +02:00
|
|
|
// var shake = _graphics.transform.DOShakePosition(
|
|
|
|
// fallAwayTime,
|
|
|
|
// _settings.FallawayFloor.ShakeStrength);
|
2021-03-17 19:31:33 +01:00
|
|
|
FMODUnity.RuntimeManager.PlayOneShot(_settings.FallawayFloor.FMODEvent);
|
2021-05-10 17:58:47 +02:00
|
|
|
|
2021-05-16 02:22:50 +02:00
|
|
|
if (_graphics.TryGetComponent(out BoxCollider box)) box.enabled = false;
|
|
|
|
|
2021-05-10 17:58:47 +02:00
|
|
|
float elapsed = 0f;
|
2021-05-16 02:22:50 +02:00
|
|
|
|
|
|
|
// wait a moment
|
|
|
|
// yield return new WaitForSeconds(fallAwayTime);
|
|
|
|
|
2021-05-10 17:58:47 +02:00
|
|
|
while (elapsed < fallAwayTime)
|
|
|
|
{
|
2021-05-16 02:22:50 +02:00
|
|
|
elapsed += Time.deltaTime * _settings.ObjectTimeScale;
|
2021-05-10 17:58:47 +02:00
|
|
|
yield return null;
|
|
|
|
}
|
2021-05-16 02:22:50 +02:00
|
|
|
|
2021-03-10 19:26:33 +01:00
|
|
|
// fall
|
2021-05-10 17:58:47 +02:00
|
|
|
velocity = Vector3.down * speed;
|
2021-03-10 18:41:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public void Reset()
|
|
|
|
{
|
2021-03-17 19:04:31 +01:00
|
|
|
_triggered = false;
|
2021-03-10 19:26:33 +01:00
|
|
|
transform.position = initialPosition;
|
2021-05-10 17:58:47 +02:00
|
|
|
velocity = Vector3.zero;
|
2021-05-16 21:00:39 +02:00
|
|
|
|
|
|
|
if (_graphics && _graphics.TryGetComponent(out BoxCollider box)) box.enabled = true;
|
2021-02-25 00:41:33 +01:00
|
|
|
}
|
2021-05-10 17:58:47 +02:00
|
|
|
}
|