- Home /
Spherecast returning false if character is too close to gameobject
Hi all,
So, I'm trying to be able to interact with objects in front of my player character by using SphereCast to check whether the object is within a Sphere that is in front of my player. The reason I dont want to use Raycast is because I want to check for objects below and above as well. It works, however If my player moves within "touching" distance of the object, the interaction no longer works.
From the Spherecast API:
Notes: SphereCast will not detect colliders for which the sphere overlaps the collider.
How does this work? Does the whole object collider have to overlap the sphere?
My character is using a character controller, and is on a Player Layer, and I am using a mask to filter it out, so I should not be colliding with myself.
I have attached my Interaction script below:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerInteraction : MonoBehaviour
{
//Serialized Vars
[SerializeField] private LayerMask interactionMask;
[SerializeField] private Transform playerTransform;
//--------------------------------------------------
// Other Vars
RaycastHit hitObject;
private bool interactQueued;
//--------------------------------------------------
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
//Check 'E' key
if (Input.GetKeyDown(KeyCode.E)) {
interactQueued = true;
}
}
//Called once per physics frame
void FixedUpdate() {
//Check for Interact bool
if (interactQueued) {
interactQueued = false;
//Cast a Sphere from the player mesh position, of radius Xf, going forward, stores a RaycastHit, goes for length Xf, and uses LayerMask
//returns true if it hits something
if (Physics.SphereCast(playerTransform.transform.position, 0.8f, playerTransform.forward, out hitObject, 1f, interactionMask))
{
Debug.Log("Interacting blyat");
}
}
}
//Debug to see SphereCast
void OnDrawGizmos()
{
Gizmos.color = Color.yellow;
Debug.DrawLine(playerTransform.transform.position, playerTransform.transform.position + playerTransform.forward * 1f);
Gizmos.DrawWireSphere(playerTransform.transform.position + playerTransform.forward * 1f, 0.8f);
}
}
Edit: If there is a better way to do this, I am open to ideas. I am trying to only interact with objects the player is facing, and within a certain distance of, that could be at ground level or slightly above the player.
A visualization of the SphereCast in question:
Your answer
Follow this Question
Related Questions
Using CheckSphere to affect another Game Object? 2 Answers
Pickup Script, Lerping to position needs to stay. 0 Answers
How do i start a game with Unity, what do i need first? 0 Answers
[Beginner] [C#] Modified Character Motor Script gives strange Parsing Error 2 Answers
"Object reference not set to an instance of an object" (Super simple) 1 Answer