- Home /
Physics.SphereCast or a sphere trigger area?
Hey everyone :)
I'm currently working on the interaction in my game, however I have a small problem, since I thought it would be easier to just spherecast whenever I press the interaction button, however when I spherecast it seems to make the game lag quite a bit.
Now I'm wondering if it would be more optimal to have a sphere collider marked as trigger, then use the OnTriggerStay instead.
Which is the most optimal way? :3
Also, here is my code:
void Interaction(){
RaycastHit hit = new RaycastHit();
Physics.SphereCast(transform.position,0.5f,transform.forward, out hit);
interactionTimer = 0.0f;
if(hit.collider != null){
if(Vector3.Distance(hit.collider.gameObject.transform.position,transform.position) <= interactableDistance){
switch(hit.collider.gameObject.tag){
case "NPC":
hit.collider.gameObject.GetComponent<NPC>().Action();
print ("YEAH!");
break;
case "Chest":
hit.collider.gameObject.GetComponent<Chest>().Action();
break;
case "Interactable":
hit.collider.gameObject.GetComponent<Interactable>().Action();
break;
}
}
}
}
If you can avoid using GetComponent that will help a little bit, but as a one off call in response to user input it shouldn't introduce any noticeable lag.
You can try using a Layer$$anonymous$$ask so that the collider check only looks at objects you can interact with, rather than against all of the colliders in your scene.
Thanks Huacanacha :D I'd completely forgotten about layer masks <.<'
I changed the system to work with the sphere trigger again, which in any case works quite effective : P
No problem ;)
Do you want to check the path of a sphere, or just the sphere itself? If it's just a sphere check use:
Physics.CheckSphere(transform.position, 0.5f);
That should be a lot faster, and you can only check on demand.
Edit: Ahh except that doesn't give you the hit information, just a bool. OverlapSpehere() will return all colliders in the spheres radius.
Thanks mate :D
I solved it with the sphere trigger though :3
However, it might be nice to have a system like that which works with coroutines later :P
I think I'll be looking into getting objects on the screen for now though :3 Who knows what'll happen anyway XD
As an aside, GetComponent is sometimes largely unavoidable, but if possible, do it once then save it in a local class-level variable and use it from there ever after.
Your answer
Follow this Question
Related Questions
Can't click gameobject when over another trigger? 1 Answer
OnTriggerStay Question 0 Answers
Why can't quads be triggers? 0 Answers
Destroying objects within collision 1 Answer
changing gravity OnTriggerEnter 1 Answer