mirror of
https://github.com/m-lamonaca/dev-notes.git
synced 2025-04-07 03:16:41 +00:00
84 lines
3.2 KiB
Markdown
84 lines
3.2 KiB
Markdown
|
# Raycasting Notes
|
||
|
|
||
|
A raycast is conceptually like a laser beam that is fired from a point in space along a particular directuin. Any object making contact with the beam can be detected and reported.
|
||
|
|
||
|
## 3D Raycasting
|
||
|
|
||
|
```cs
|
||
|
void Update()
|
||
|
{
|
||
|
// constructor takes in a position end direction
|
||
|
Ray ray = new Ray(transform,position, transform.forward);
|
||
|
RaycastHit hitInfo; // struct, stores data on ray collision
|
||
|
|
||
|
hitInfo.distance // distance from origin to collision point
|
||
|
hitInfo.collider // collider of the hit object
|
||
|
hitInfo.transform // transform og the hit object
|
||
|
hitInfo.collider.gameObject // reference to the object hit by the ray
|
||
|
hitInfo.collider.gameObject // reference to the object hit by the ray
|
||
|
hitInfo.normal // normal bector og the hit surface
|
||
|
hitInfo.point // actual point of collision
|
||
|
|
||
|
// static method, object must haave a collider dot the collision to happen, returns a BOOL
|
||
|
Physics.Raycast(ray, out hitInfo); // update hitInfo based on ray collisions
|
||
|
Physics.Raycast(ray, out hitInfo, float maxRayDistance); // limit the ray length
|
||
|
Physics.Raycast(ray, out hitInfo, Mask mask); // specify with which layers the ray can interact, layer must be allpied to object's mask
|
||
|
Physics.Raycast(ray, out hitInfo, Mask mask, QueryTriggerInteraction.Ignore); // ignore collision if "is trigger" is enabled on other objects
|
||
|
|
||
|
// detect a collision
|
||
|
if (Physics.Raycast(ray, out hitInfo))
|
||
|
{
|
||
|
//collision happened
|
||
|
|
||
|
// draw the ray ingame for debuggng
|
||
|
Debug.DrawLine(ray.origin, hitInfo.point, Color.red); // draw red line if collision happens
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.blue); // draw blue line if collision happens, arrival point is 100 units from the origin sinche the ray goes to infinity
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Detect mouse pointed point in-game
|
||
|
|
||
|
```cs
|
||
|
public Camera gameCamera;
|
||
|
|
||
|
void Update()
|
||
|
{
|
||
|
// ray goint ftom cametra through a screen point
|
||
|
Ray ray = gameCamera.ScreenPointToRay(Input.mousePosition); // Input.mousePosition is the postion of the mouse in pixels (screen points)
|
||
|
RaycastHit hitInfo; // place pointed by the mouse
|
||
|
|
||
|
Physics.Raycast(ray, out hitInfo) // update pointed position
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## 2D Raycasting
|
||
|
|
||
|
```cs
|
||
|
|
||
|
void Start()
|
||
|
{
|
||
|
Physisc2D.queriesStartColliders = false; // avoid collision with collider of the ray generator gameObject
|
||
|
}
|
||
|
|
||
|
void Update()
|
||
|
{
|
||
|
// returns a RaycastHit2D, needs an origin and direction separatedly
|
||
|
Raycast2D hitInfo = Physics2D.Raycast(Vector2 origin, Vector2 direction);
|
||
|
Raycast2D hitInfo = Physics2D.Raycast(Vector2 origin, Vector2 direction, float maxRayDistance);
|
||
|
Raycast2D hitInfo = Physics2D.Raycast(Vector2 origin, Vector2 direction, float maxRayDistance);
|
||
|
Raycast2D hitInfo = Physics2D.Raycast(Vector2 origin, Vector2 direction, float minDepth, float maxDepth); // set range of z-coord values in which detect hits (sprites depth)
|
||
|
|
||
|
//! the ray starts from INSIDE the gameObject and can collider with it's collider
|
||
|
|
||
|
// detect collision
|
||
|
if (hitInfo.collider != null) {
|
||
|
// collision happened
|
||
|
Debug.DrawLine(transform.position, hitInfo.point)
|
||
|
}
|
||
|
}
|
||
|
```
|