1
0
mirror of https://projects.caleb-brown.dev/UDRI-XRT/UDRIGEEKCup2024.git synced 2025-01-22 15:18:25 -05:00
UDRIGEEKCup2024/Assets/GolfControls/BallHitController.cs
2024-04-16 10:31:20 -04:00

89 lines
2.1 KiB
C#

using System;
using System.Collections;
using UnityAtoms.BaseAtoms;
using UnityEngine;
namespace GolfControls
{
public class BallHitController : MonoBehaviour
{
public VoidEvent ballHitEvent;
public Vector3Variable AngleVariable;
public FloatVariable PowerVariable;
public BoolVariable isMovingVariable;
public BoolVariable inHoleVariable;
public float baseForce;
private Rigidbody body;
private void Start()
{
body = gameObject.GetComponent<Rigidbody>();
}
private void OnEnable()
{
ballHitEvent.Register(OnHit);
}
private void OnDisable()
{
ballHitEvent.Unregister(OnHit);
}
private void OnHit()
{
if(isMovingVariable.Value) return;
Vector3 hitVector = AngleVariable.Value.normalized * (PowerVariable.Value * baseForce);
body.AddForce(hitVector);
StartCoroutine(TrackState());
}
private IEnumerator TrackState()
{
float minVelocityMagnitude = 0.1f;
float ballStopTime = 1.0f;
isMovingVariable.SetValue(true);
while (!inHoleVariable.Value)
{
yield return null;
if(body.velocity.magnitude >= minVelocityMagnitude) continue;
float timer = 0.0f;
bool isStopped = true;
while (timer < ballStopTime)
{
yield return null;
if (inHoleVariable.Value) break;
timer += Time.deltaTime;
if (body.velocity.magnitude > minVelocityMagnitude)
{
isStopped = false;
break;
}
}
if (isStopped) break;
}
body.velocity = Vector3.zero;
body.angularVelocity = Vector3.zero;
isMovingVariable.SetValue(false);
}
}
}