- Home /
Rotate RayCast/Object right on instantiation?
Hey, so I was wondering how I could rotate the direction of the raycast to the left or the projectile itself without effecting the flight direction. The problem I am facing is that the raycast is sticking out to the left, meaning that it wont ditect a hit when the particle flys towards something, only objects 1.5f to the right of it. If someone could help, I would be so grateful...thanks in advance!
//Variables Start___________________________________
//The explosion effect is attached to this
//in the inspector
public GameObject mudParticle;
//A quick reference.
private Transform myTransform;
//The projectiles flight speed.
private float projectileSpeed = 20;
//Prevent the projectile from causing
//further harm once it has hit something.
private bool expended = false;
//A ray projected in front of the projectile
//to see if it will hit a recognisable collider.
private RaycastHit hit;
//The range of that ray.
private float range = 1.5f;
//The life span of the projectile.
private float expireTime = 10;
//Variables End_____________________________________
// Use this for initialization
void Start()
{
myTransform = transform;
//As soon as the projectile is created start a countdown
//to destroy it.
Destroy (gameObject, expireTime);
}
// Update is called once per frame
void Update ()
{
//Translate the projectile in the up direction (the pointed
//end of the projectile).
myTransform.Translate(Vector3.left * projectileSpeed * Time.deltaTime);
//If the ray hits something then execute this code.
Debug.DrawRay( myTransform.position, myTransform.forward * range, Color.red );
if(Physics.Raycast(myTransform.position,myTransform.forward, out hit, range) && expended == false)
{
//If the collider has the tag of Floor then..
Debug.Log( "Ray Hit (floorMud) : " + hit.collider.transform.tag );
{
expended = true;
//Instantiate an explosion effect.
Instantiate(mudParticle, hit.point, Quaternion.identity);
//Make the projectile become invisible.
myTransform.renderer.enabled = false;
}
}
}
IEnumerator DestroyMyselfAfterSomeTime()
{
//Wait for the timer to count up to the expireTime
//and then destroy the projectile.
yield return new WaitForSeconds(expireTime);
Destroy(myTransform.gameObject);
}
}
Thank you for your reply! Im sorry Im new to Unity, what doe you mean with model re-authorization? I tried creating a game object and parenting the bullet to it, I changed the rotation of the bullet but unfortunately this did not solve the problem. For your information, my object is actually a sphere, which is why its hard to deter$$anonymous$$e the "front" of the object.
Answer by robertbu · May 17, 2013 at 02:06 PM
You are translating your object to the world left. See the 'Vector3.left':
myTransform.Translate(Vector3.left * projectileSpeed * Time.deltaTime);
But your Raycast is coming out of the forward of the object:
if(Physics.Raycast(myTransform.position,myTransform.forward, out hit, range)
So you have to bring these into alignment. You can solve this in several ways. Since projectile is a sphere, you can rotate the object so that the forward of the object is facing left. On line 80 right after the Instantiate() you can just Rotate it on the Y axis by 90 degrees so the forward of the vector is facing world left.
transform.Rotate(0.0, 90.0, 0.0);
Here is another way to face world left:
transform.LookAt(transform.position + Vector3.left);
An alternate solution is to change the Raycast() so that it points left:
if(Physics.Raycast(transform.position,Vector3.left, out hit, range)
And finally my favorite is to first use either of the two methods above to face the object left and then change the translate so that the object moves in the the forward direction.
transform.Translate(transform.forward * projectileSpeed * Time.deltaTime);
One quick way of determining what is forward on the sphere is to place a second child game object on the front of your sphere: 1) Add a new game object like a cube, 2) put in the same position as your sphere, 3) size it down, 4) move it forward on the Z axis until it just pokes out of the sphere, and 5) make it a child of the sphere.
Thanks man! But unfortunately, neither of these methods work (although to me, they should really). I started with the first method, but got compile errors after inserting them (I also believe line 80 is the wrong spot, shouldn't it be when the Object is instantiated not the particle?). Changing the raycast direction gets no errors but also doesnt seem to do anything. I did not know how to instert the third one. Could you show me how you would do it? Because I am clearly doing something wrong....would be very much appreciated.
You are right. It appears the object you are moving is created in the editor. You can just set the rotation to (0,90,0) in the inspector or you can put the transform.Rotate(0.0f, 90.0f, 0.0f);
in Start(). Note the compile errors you received were likely due to not adding the 'f' at the end of the floating point value in the Rotate() call. They are necessary for C# since the default data type for floating point number is a double, but Unity expects a lesser precision float value. The 'f' is not necessary for Javascript.
As for the raycast, did you change the Debug.DrawRay() on line 67 to see where the ray was pointing? And if so, you are saying changing this value did not change the direction of the Raycast?
[1]: http://docs.unity3d.com/Documentation/ScriptReference/Debug.DrawRay.html
Oh yeah I forgot to change the Debug.DrawRay() to left thanks! But actually it switches the ray to 180 degress to the right, not forward. I decided to use the transform rotation method, and this actually worked, except for the fact that transform.foward makes the bullet spawn in any crazy direction. I might be ai$$anonymous$$g forward, but the bullet will go out slightly to the right and never in the same direction. But the ray is going in the correct direction do you know why this could be?
P.S: I tried rotating it in the inspector but I don't think it works like that when instantiating prefabs.
This and some modification on the instantiation script did it:
using UnityEngine;
using System.Collections;
public class $$anonymous$$usketBullet : $$anonymous$$onoBehaviour {
//Variables Start___________________________________
//The explosion effect is attached to this
//in the inspector
public GameObject mudParticle;
//A quick reference.
private Transform myTransform;
//The projectiles flight speed.
private float projectileSpeed = 1000;
//Prevent the projectile from causing
//further harm once it has hit something.
private bool expended = false;
//A ray projected in front of the projectile
//to see if it will hit a recognisable collider.
private RaycastHit hit;
//The range of that ray.
private float range = 0.2f;
//The life span of the projectile.
private float expireTime = 10;
//Variables End_____________________________________
// Use this for initialization
void Start()
{
myTransform = transform;
//As soon as the projectile is created start a countdown
//to destroy it.
Destroy (gameObject, expireTime);
}
// Update is called once per frame
void Update ()
{
//Sends the projectile in the forward direction
myTransform.Translate(Vector3.forward * projectileSpeed * Time.deltaTime);
//If the ray hits something then execute this code.
Debug.DrawRay( myTransform.position, myTransform.forward * range, Color.red );
if(Physics.Raycast(myTransform.position, myTransform.forward, out hit, range) && expended == false)
{
//If the collider has the tag of Floor then..
Debug.Log( "Ray Hit (floor$$anonymous$$ud) : " + hit.collider.transform.tag );
{
expended = true;
//Instantiate an explosion effect.
Instantiate(mudParticle, hit.point, Quaternion.identity);
//$$anonymous$$ake the projectile become invisible.
myTransform.renderer.enabled = false;
}
}
}
IEnumerator Destroy$$anonymous$$yselfAfterSomeTime()
{
//Wait for the timer to count up to the expireTime
//and then destroy the projectile.
yield return new WaitForSeconds(expireTime);
Destroy(myTransform.gameObject);
}
}