Files
DeviantMobile-Rohan/Assets/Scripts/Ground Check/GroundCheck.cs

76 lines
2.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GroundCheck : MonoBehaviour
{
public float groundDistance = 1.5f;
[Tooltip("Layers to check for ground. Must include environment/ground layers. If left at 0, auto-detects at startup.")]
public LayerMask groundLayer;
public Transform groundCheckTransform;
public bool isGrounded;
// Initialize a safe default for groundCheckTransform and auto-detect ground layer
private void Awake()
{
// AUTO-FIX: If groundLayer is 0 (Nothing), set it to detect everything EXCEPT
// characters. This prevents detecting character body colliders as "ground".
if (groundLayer.value == 0)
{
// Include Default layer and all non-character layers
// Exclude layers commonly used for characters: "Player", "Enemy", "Character"
// Start with everything, then exclude known character layers
groundLayer = ~0; // Everything
int playerLayer = LayerMask.NameToLayer("Player");
int enemyLayer = LayerMask.NameToLayer("Enemy");
int characterLayer = LayerMask.NameToLayer("Character");
int ignoreRaycastLayer = LayerMask.NameToLayer("Ignore Raycast");
if (playerLayer >= 0) groundLayer &= ~(1 << playerLayer);
if (enemyLayer >= 0) groundLayer &= ~(1 << enemyLayer);
if (characterLayer >= 0) groundLayer &= ~(1 << characterLayer);
if (ignoreRaycastLayer >= 0) groundLayer &= ~(1 << ignoreRaycastLayer);
Debug.Log($"[GroundCheck] Auto-configured groundLayer mask to {groundLayer.value} on '{gameObject.name}'");
}
if (groundCheckTransform == null)
{
// Prefer a child named "GroundCheck" if present
var child = transform.Find("GroundCheck");
if (child != null)
{
groundCheckTransform = child;
}
else
{
// Fallback to a scene object named "floor_limit" if it exists, else use this transform
var floor = GameObject.Find("floor_limit");
groundCheckTransform = floor != null ? floor.transform : transform;
}
}
}
private void Update()
{
if (groundCheckTransform == null)
{
// Still initializing or missing reference; do not attempt a check
isGrounded = false;
return;
}
// Use the chosen transform's position as the check origin
isGrounded = Physics.CheckSphere(groundCheckTransform.position, groundDistance, groundLayer, QueryTriggerInteraction.Ignore);
}
public bool IsGrounded()
{
return isGrounded;
}
}