129 lines
3.0 KiB
C#
129 lines
3.0 KiB
C#
using Ktyl.Util;
|
|
using System.Collections;
|
|
using PathCreation;
|
|
using UnityEngine;
|
|
using UnityEngine.Serialization;
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
#endif
|
|
|
|
public class RollingBoulder : MonoBehaviour
|
|
{
|
|
// how long it takes to travel the length of the path
|
|
[SerializeField] private float speed;
|
|
[FormerlySerializedAs("boulder")] [SerializeField] private Transform boulderMove;
|
|
[SerializeField] private Transform boulderSpin;
|
|
[SerializeField] private SerialFloat objectTimeScale;
|
|
[SerializeField] private PathCreator path;
|
|
[SerializeField] private Killbox _killbox;
|
|
[SerializeField] private string _fmodKey;
|
|
[SerializeField] private float _resetTime;
|
|
[SerializeField] private float _rotationSpeed;
|
|
|
|
private bool _triggered = false;
|
|
private bool _stopped;
|
|
|
|
private void Update()
|
|
{
|
|
_killbox.gameObject.SetActive(!_stopped && objectTimeScale > 0.5f);
|
|
|
|
if (!_stopped)
|
|
{
|
|
var dt = Time.deltaTime * objectTimeScale;
|
|
boulderSpin.transform.Rotate(new Vector3(0,0,_rotationSpeed) * dt);
|
|
}
|
|
}
|
|
|
|
private void OnTriggerEnter(Collider other)
|
|
{
|
|
// Checks to make sure other collider is the Player using tag.
|
|
if (other.gameObject.CompareTag("Player"))
|
|
{
|
|
Trigger();
|
|
}
|
|
}
|
|
|
|
public void Trigger()
|
|
{
|
|
if (_triggered) return;
|
|
|
|
FMODUnity.RuntimeManager.PlayOneShot(_fmodKey);
|
|
|
|
StartCoroutine(RollingStone());
|
|
}
|
|
|
|
private IEnumerator RollingStone()
|
|
{
|
|
_triggered = true;
|
|
|
|
var d = 0f;
|
|
var pathLength = path.path.length;
|
|
|
|
while (_triggered && d < pathLength)
|
|
{
|
|
d += Time.deltaTime * objectTimeScale * speed;
|
|
|
|
var pos = path.path.GetPointAtDistance(d);
|
|
|
|
boulderMove.transform.position = pos;
|
|
|
|
yield return null;
|
|
}
|
|
|
|
if (_triggered)
|
|
{
|
|
_stopped = true;
|
|
boulderMove.position = path.path.GetPointAtTime(0.999f);
|
|
}
|
|
|
|
var resetElapsed = 0f;
|
|
|
|
while (resetElapsed < _resetTime)
|
|
{
|
|
resetElapsed += Time.deltaTime * objectTimeScale;
|
|
yield return null;
|
|
}
|
|
|
|
Reset();
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
boulderMove.transform.position = path.path.GetPointAtTime(0);
|
|
_triggered = false;
|
|
_killbox.enabled = true;
|
|
_stopped = false;
|
|
}
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
[CustomEditor(typeof(RollingBoulder))]
|
|
public class RollingBoulderEditor : Editor
|
|
{
|
|
private RollingBoulder _data;
|
|
|
|
private void OnEnable()
|
|
{
|
|
_data = target as RollingBoulder;
|
|
}
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
base.OnInspectorGUI();
|
|
|
|
if (!Application.isPlaying) return;
|
|
|
|
if (GUILayout.Button("Trigger"))
|
|
{
|
|
_data.Trigger();
|
|
}
|
|
|
|
if (GUILayout.Button("Reset"))
|
|
{
|
|
_data.Reset();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|