Select Git revision
BallBehavior.cs
-
Sofiane Lasri authoredSofiane Lasri authored
BallBehavior.cs 3.26 KiB
using System;
using UnityEngine;
using UnityEngine.InputSystem;
public class BallBehavior : MonoBehaviour
{
private PlayerInput _playerInput;
private InputAction _horizontalAction;
private float _horizontalAxis;
public int moveForwardSpeed = 3;
public float keyboardMoveSpeed = 15f;
private int _isKeyboard;
private GameObject _ball;
private float _ballRadius;
private Vector3 _ballBottomPos;
private Boolean _gameOver = false;
private Boolean _hasTriggeredPlatform = false;
// Ground Checks
[Header("Ground Checks")]
[SerializeField] private bool isGrounded;
[SerializeField] private float groundCheckDistance = 0.17f;
[SerializeField] private LayerMask groundMask = 0;
void Awake()
{
_playerInput = GetComponent<PlayerInput>();
_horizontalAction = _playerInput.currentActionMap.FindAction("Horizontal");
_horizontalAction.performed += MoveActionPerformed;
_horizontalAction.canceled += _ => _horizontalAxis = 0;
}
void Start()
{
_ball = GameObject.Find("Ball");
_ballRadius = _ball.GetComponent<SphereCollider>().radius;
}
void Update()
{
if(!_gameOver)
{
Vector3 position = transform.position;
var deltaTime = Time.deltaTime;
position += Vector3.forward * (moveForwardSpeed * deltaTime);
position += Vector3.right * (deltaTime * _horizontalAxis);
transform.position = position;
}
_ballBottomPos = _ball.transform.position + Vector3.down * _ballRadius;
// isGrounded -> Weird condition because of the trigger check
if (!Physics.CheckSphere(_ballBottomPos, groundCheckDistance, groundMask))
{
if (isGrounded)
{
_hasTriggeredPlatform = false;
}
isGrounded = false;
}
else
{
isGrounded = true;
}
if(_ball.transform.position.y < 0.6f && !isGrounded)
{
Debug.Log("Game Over: " + _ball.transform.position.y + " " + isGrounded);
_gameOver = true;
}
if (!_hasTriggeredPlatform && isGrounded)
{
// We have to get the gameobject just below with a raycast
if (Physics.Raycast(_ballBottomPos, Vector3.down, out var hit, 1f))
{
if (hit.collider.gameObject.CompareTag("Platform"))
{
Debug.Log("Platform triggered");
hit.collider.gameObject.GetComponent<PlatformsBehavior>().setActive();
_hasTriggeredPlatform = true;
}
}
}
}
private void MoveActionPerformed(InputAction.CallbackContext context)
{
if (context.control.device.displayName.Contains("Keyboard"))
{
_isKeyboard = 1;
}
else
{
_isKeyboard = 0;
}
_horizontalAxis = context.ReadValue<float>() * (1 + keyboardMoveSpeed * _isKeyboard);
}
void OnDrawGizmosSelected()
{
// Dessine une boule rouge pour visualier goundCheckDistance
Gizmos.color = Color.red;
Gizmos.DrawSphere(_ballBottomPos, groundCheckDistance);
}
}