using Ktyl.Util; using System.Collections; using PathCreation; using UnityEngine; #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; [SerializeField] private Transform boulder; [SerializeField] private SerialFloat objectTimeScale; [SerializeField] private PathCreator path; [SerializeField] private Killbox _killbox; [SerializeField] private string _fmodKey; [SerializeField] private float _resetTime; private bool _triggered = false; private GameObject _endBoulder; private void Update() { _killbox.gameObject.SetActive(objectTimeScale > 0.5f); } 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); boulder.transform.position = pos; yield return null; } if (_triggered) { boulder.position = path.path.GetPointAtTime(0.999f); } var resetElapsed = 0f; while (resetElapsed < _resetTime) { resetElapsed += Time.deltaTime * objectTimeScale; yield return null; } Reset(); } public void Reset() { boulder.transform.position = path.path.GetPointAtTime(0); _triggered = 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