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
1
Question by Coneman02 · Feb 02, 2014 at 08:02 PM · raycastlayermask

Using a raycast to get transform on specific layer

I'm building a simple drag and drop inventory using 2 type of cubes: Dragables and Slots. I want to get a reference of the Slot when I let go of a Dragable on top of it. This is the code that I can't get to work properly:

 RaycastHit hitInfo = new RaycastHit();
 bool hit = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo, 1 << LayerMask.NameToLayer("Slots"));
 if (hit) 
 {
     Debug.Log(hitInfo.collider.name);
 }

The layer mask doesn't seem to be working because it returns the first collider on all layers (in this case the Dragable) instead of only triggering on the Slots.

Here is my work around, which works great, but it seems like I shouldn't need this much code?

 RaycastHit[] hits;
 
 hits = Physics.RaycastAll(Camera.main.ScreenPointToRay(Input.mousePosition));
 int i = 0;
 while (i < hits.Length) {
     RaycastHit hit = hits[i];
             
     if( hit.collider.tag == "Slot" ){
         inSlot = true;
         Slot = hit.collider.transform;
         transform.position = new Vector3(hit.collider.transform.position.x, hit.collider.transform.position.y, -5f);
         return;
     }
     i++;
 }
Comment
Add comment
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

3 Replies

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

Answer by robertbu · Feb 02, 2014 at 08:37 PM

There is no form of Raycast() that takes a mask as the third parameter. This Raycast() is using the value you are passing for a mask as the distance parameter. Add a distance parameter and your Raycast() should work:

 bool hit = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo, Mathf.Infinity, 1 << LayerMask.NameToLayer("Slots"));

Note you don't have to do 'new RaycastHit()'. RaycastHit is a struct not a class.

Comment
Add comment · Show 1 · 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 Coneman02 · Feb 02, 2014 at 08:47 PM 0
Share

Thanks a bunch, that was the problem.

avatar image
0

Answer by highpockets · Feb 02, 2014 at 08:29 PM

Send a raycast from the Dragable downwards. I don't think raycasts can send rays through colliders to hit a collider on the other side.

Comment
Add comment · Show 1 · 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 Coneman02 · Feb 02, 2014 at 08:44 PM 0
Share

Hmm, I was under the impression that if you specify a layer mask, the raycast would ignore all colliders not on that layer ('Slots' in my example), but perhaps I'm not clear on how layer masks work. I'll give your idea a try, thanks.

avatar image
0

Answer by svendkiloo · May 03, 2016 at 09:38 AM

This might be new for Unity 5, but sounds like it should be possible to specify a layer mask, like you suggest:

http://docs.unity3d.com/ScriptReference/Physics.Raycast.html

In fact, here are some examples as well:

http://docs.unity3d.com/Manual/Layers.html

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.

Follow this Question

Answers Answers and Comments

20 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

Related Questions

RaycastHit returns object without collider, in wrong layer 1 Answer

Raycast should ignore everything but player, yet still gets interrupted 1 Answer

BoxCollider2D is not working as expected 1 Answer

Is it possible to allow a raycast to pass through a collider to hit things behind it? 6 Answers

How to create User layer that acts like the "Ignore Raycast" layer? 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