Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using UnityEngine.Events;
- public class TableFlipper : MonoBehaviour {
- [SerializeField]
- float _power;
- [SerializeField]
- float _powerUpSpeed = 1;
- [SerializeField]
- float _forceMultiplier;
- [SerializeField]
- Vector3 _forcePoint = Vector3.back;
- [SerializeField]
- Vector3 _forceDirection = Vector3.up;
- [Header("Timer"), SerializeField]
- bool _timerEnabled;
- [SerializeField]
- float _timeBeforeForce = 2;
- [SerializeField]
- float _forceTimer;
- public PowerEvent OnPowerChanged;
- #region Properties
- public Vector3 ForceDirection {
- get { return _forceDirection; }
- set { _forceDirection = value; }
- }
- public float ForceMultiplier {
- get { return _forceMultiplier; }
- set { _forceMultiplier = value; }
- }
- public Vector3 ForcePoint {
- get { return _forcePoint; }
- set { _forcePoint = value; }
- }
- public float ForceTimer {
- get { return _forceTimer; }
- set { _forceTimer = value; }
- }
- public float Power {
- get { return _power; }
- set {
- float newValue = Mathf.Clamp01(value);
- if(newValue == Power) return;
- _power = newValue;
- if(OnPowerChanged != null) OnPowerChanged.Invoke(Power);
- }
- }
- public float PowerUpSpeed {
- get { return _powerUpSpeed; }
- set { _powerUpSpeed = value; }
- }
- Rigidbody RigidbodyComponent { get; set; }
- public float TimeBeforeForce {
- get { return _timeBeforeForce; }
- set { _timeBeforeForce = value; }
- }
- public bool TimerEnabled {
- get { return _timerEnabled; }
- set { _timerEnabled = value; }
- }
- #endregion
- void Awake() {
- RigidbodyComponent = GetComponent<Rigidbody>();
- }
- void Update() {
- UpdateInput();
- UpdateTimer();
- }
- void UpdateInput() {
- if(Input.GetKeyDown(KeyCode.Space)) {
- if(RigidbodyComponent.IsSleeping()) {
- StartTimer();
- Power += PowerUpSpeed * Time.deltaTime;
- }
- }
- }
- void UpdateTimer() {
- if(TimerEnabled) {
- if(ForceTimer > 0) {
- ForceTimer = Mathf.Max(ForceTimer - Time.deltaTime, 0);
- if(ForceTimer == 0) {
- TimerEnabled = false;
- ApplyForce();
- }
- }
- }
- }
- [ContextMenu("Apply Force")]
- public void ApplyForce() {
- RigidbodyComponent.AddForceAtPosition(ForceDirection * ForceMultiplier * Power, transform.TransformPoint(ForcePoint), ForceMode.VelocityChange);
- }
- [ContextMenu("Start Timer")]
- public void StartTimer() {
- if(!TimerEnabled && RigidbodyComponent.IsSleeping()) {
- ForceTimer = TimeBeforeForce;
- TimerEnabled = true;
- Power = 0;
- }
- }
- void OnDrawGizmos() {
- Gizmos.color = Color.blue;
- Gizmos.DrawSphere(transform.TransformPoint(ForcePoint), .125f);
- }
- [System.Serializable]
- public class PowerEvent : UnityEvent<float> { }
- }
Advertisement
Add Comment
Please, Sign In to add comment