Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Borzi · May 16, 2013 at 07:50 PM · raycastfpsraycastingprojectileparticle

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);
     }
 }
 
Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Borzi · May 17, 2013 at 11:55 AM 0
Share

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.

1 Reply

· Add your reply
  • Sort: 
avatar image
1
Best Answer

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.

Comment
Add comment · Show 4 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Borzi · May 18, 2013 at 10:38 AM 0
Share

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.

avatar image robertbu · May 18, 2013 at 02:06 PM 0
Share

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

avatar image Borzi · May 18, 2013 at 04:50 PM 0
Share

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.

avatar image Borzi · May 21, 2013 at 04:10 PM 0
Share

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);
     }
 }

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

13 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Question about FPS and Raycasting Javascript 2 Answers

Raycast shooting in the middle of the screen 1 Answer

How do I make a gun project a particle? 1 Answer

Raycasting not working as expected: rays are perpendicular to projectile's trajectory and collision doesn't occur 1 Answer

Handling Projectiles in a Multiplayer Environment 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges