• 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 LeftyTwoGuns · Jun 30, 2014 at 06:35 AM · raycastdestroytag

What am I doing wrong with this collision code?

 public class BulletScript : MonoBehaviour {
 
     public GameObject hitEffect;
 
     private Transform myTransform;
 
     public float bulletSpeed = 0.1f;
 
     private bool spent = false;
 
     private RaycastHit hit;
 
     public float rayRange = 1.5f;
 
 
 
     // Use this for initialization
     void OnEnable () {
 
         myTransform = transform;
 
     }
     
     // Update is called once per frame
     void Update () {
 
         myTransform.Translate(Vector3.up * bulletSpeed * Time.deltaTime);
 
         if(Physics.Raycast(myTransform.position, myTransform.up, out hit, rayRange)&&
            spent == false){
 
             if(hit.transform.tag == "Floor"){
 
                 GameObject newHitEffect = (GameObject)Instantiate(hitEffect, hit.point, Quaternion.identity);
 
                 Destroy(newHitEffect, 2);
 
                 spent = true;
 
                 GetComponent<PoolObject>().ReturnToPool();
 
             }
 
             spent = false;
 
         }else if(hit.transform.tag == "Target"){
 
             Destroy(this.gameObject);
         }
     
     }
 
 
 }
 

Getting an error for the hit on the Target tag (line 46)

"Object reference not set to an instance of an object"

The projectile passes right through the cube tagged Target and I get that error. What did I do wrong here?

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 VIPINSIRWANI · Jun 30, 2014 at 06:46 AM 0
Share

I also face this problem(Object reference not set to an instance of an object) but in my case i was destroying the object on which script is added, then i create reference of that object and i deleted reference object.

4 Replies

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

Answer by Visal · Jun 30, 2014 at 07:00 AM

The reason because hit is null. You tried to check hit.transform.tag while the raycast might not hit any object. I think you putted the else if in the wrong block. It should be after if(hit.transform.tag == "Floor") block which is:

             if(hit.transform.tag == "Floor"){
  
                 GameObject newHitEffect = (GameObject)Instantiate(hitEffect, hit.point, Quaternion.identity);
  
                 Destroy(newHitEffect, 2);
  
                 spent = true;
  
                 GetComponent<PoolObject>().ReturnToPool();
  
             }

             else if(hit.transform.tag == "Target"){
  
                 Destroy(this.gameObject);
             }



Hope it'll help.

Comment
Add comment · Show 2 · 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 LeftyTwoGuns · Jul 01, 2014 at 01:18 AM 0
Share

Thanks, this solved the error but the object tagged Target still isn't destroyed. I added a Debug.Log message on hit, which pops up when the projectile hits the target, but the target remains.

Is Destroy(this.gameObject) not the proper way to destroy the object the projectile hits?

avatar image LeftyTwoGuns · Jul 01, 2014 at 04:55 AM 0
Share

Also added an AddForceAtPosition for a rigibody hit, which works. So I'm assu$$anonymous$$g Destroy(this.gameObject) is incorrect in this context. But you solved my error, so thank you! And thank you to all the other answers, too.

avatar image
1

Answer by dumbat · Jun 30, 2014 at 06:52 AM

In your conditional at line 29, it is evaluating spent==false first, and not getting to the Physics.Raycast call. Your hit variable is uninitialised

Comment
Add comment · 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
1

Answer by Huacanacha · Jun 30, 2014 at 06:53 AM

The ELSE IF can execute if there is no collision, in which case "hit" is not populated. Just check the collision in the first IF, then use an "if (spent == false)" / "else if (hit.transform.tag == "Target")" branch within the first IF.

 if(Physics.Raycast(myTransform.position, myTransform.up, out hit, rayRange)) {
     if (spent == false){
         if(hit.transform.tag == "Floor"){
             GameObject newHitEffect = (GameObject)Instantiate(hitEffect, hit.point, Quaternion.identity);
             Destroy(newHitEffect, 2);
             spent = true;
             GetComponent<PoolObject>().ReturnToPool();
         }
         spent = false;
     } else if(hit.transform.tag == "Target"){
         Destroy(this.gameObject);
     }
 }
Comment
Add comment · 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
1

Answer by HarshadK · Jun 30, 2014 at 06:58 AM

The problem is with your placement of if...else loop.

Your else loop is for your if(Physics.Raycast...) loop which makes your hit object unavailable in your else loop since your hit object is for Raycast loop only.

I think your want to put your else loop for if(hit.transform.tag == "Floor"){ line of code.

Comment
Add comment · 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

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.

Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.



Follow this Question

Answers Answers and Comments

25 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 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

How to get a rayhit to detect tags? 1 Answer

Destory() on Collision if Tag = Lazer [SOLVED] 1 Answer

Make Raycast ignore anything that "Isn't" my player(Solved) 1 Answer

How do I detect if there's an object at the same position and destroy ONLY ONE of them? 1 Answer

Destroy(gameObject) destroys entire scene 1 Answer


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