Hello,
I have a simple question but I can’t answer it. How to raycast always in direction of a gameobject or transform.
Again tanks for the answers i really appreciate it!
Hello,
I have a simple question but I can’t answer it. How to raycast always in direction of a gameobject or transform.
Again tanks for the answers i really appreciate it!
If you have a origin point you’re raycasting from, you create a vector pointing in the correct direction by subtracting the origin’s point from the target’s point. If you’re raycasting from the object that the script is attached to, it’s simply:
void RaycastTowardsThing(GameObject thing) {
Vector3 raycastDir = thing.transform.position - transform.position;
Physics.Raycast(transform.position, raycastDir, ...
}
private void Update()
{
RaycastHit hit;
// Cast from the objects position upwards
Physics.Raycast(transform.position, transform.up, out hit);
// Cast from the objects position right
Physics.Raycast(transform.position, transform.right, out hit);
// Cast from the objects position forward
Physics.Raycast(transform.position, transform.forward, out hit);
}
@baste’s solution should work. but I have a similar solution in my current game that is causing an issue
when i rotate my transform.
What I am going for is i want the game object to rotate in accordance with the surface normal of the cube, (basically I am trying to walk on all sides of a cube and rotate accordingly. ) My first rotation works beautifully, but the raycast always points out in a different direction and therefore never hits the gameobject again, which prevents me from being able to reorient properly.
Here is my code, if anyone has any ideas as to what I am doing wrong I would appreciate the help. Really scratching my head as to what I am missing.
using UnityEngine;
using System.Collections;
public class OrientToSurfaceNormal : MonoBehaviour
{
public Transform worldToStickTo;
public float gravity = -9.8f;
// Raycast stuff
public Vector3 playerNormal;
public Vector3 surfaceNormal;
public Vector3 fwd;
Vector3 direction;
// Use this for initialization
void Start()
{
playerNormal = transform.up;
surfaceNormal = playerNormal;
}
// Update is called once per frame
void FixedUpdate()
{
RaycastHit hitInfo;
fwd = transform.TransformDirection((worldToStickTo.transform.position - transform.position));
Physics.Raycast(transform.position, fwd, out hitInfo, 100); // THIS WORKS
Debug.DrawRay(transform.position, fwd, Color.green); // draw the debug;
playerNormal = hitInfo.normal;
}
void Update()
{
transform.rotation = Quaternion.FromToRotation(surfaceNormal, playerNormal) * transform.rotation; // Rotation without smoothing.
}