Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 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 /
  • Help Room /
avatar image
0
Question by bgwalke2 · Feb 05, 2016 at 04:21 PM · c#raycastraycasthit2dreflectionshit.point

2D Raycast reflection only changes hit.normal

When I run the program the second 2D Raycast only changes the hit.normal. This creates a ray that I display through LineRenderer that has multiple vertexes, but all on the same point.

What makes the 2D Raycast not output the values needed to reflect off of the boxes. (using Unity 5.3.1f1)

 using UnityEngine;
 using System.Collections;
 
 public class MultiRayMaker : MonoBehaviour {
     public Vector2 mousePosition2D;
     public Vector3 mousePosition3D;
     public Vector2 currentPosition;
     //max distance of the ray/liine
     public float distance = 20.0f;
 
     public Vector2 inDirection;
     public Vector3 reflectionDirection;
 
     //limit of number of reflections
     int limit = 7;
     public string Mirror;
     public int insideLimit = 0;
     public int vertexCount;
     //-1 so that we can increment from 0 -> 100
     public int whichVertex;
     LineRenderer line;
     public RaycastHit2D hit;
 
     void Start () {
         line = GetComponent<LineRenderer> ();
         line.enabled = false;
         line.useWorldSpace = true;
     }
         
     void Update () {
         mousePosition2D = Camera.main.ScreenToWorldPoint (Input.mousePosition);
         mousePosition3D = Camera.main.ScreenToWorldPoint (Input.mousePosition);
         currentPosition = new Vector2 (transform.position.x, transform.position.y);
         //when click create ray/line toward click point
         if (Input.GetMouseButtonDown (0)) {
             // reset insideLimit
             insideLimit = 0;
             LineRendererStart ();
         }
     }
 
     void LineRendererStart ()
     {
         //local variables and initial process work
         line.enabled = true;
         inDirection = mousePosition3D;
         vertexCount = 2;
         whichVertex = 0;
         line.SetPosition (whichVertex++, currentPosition);
 
         hit = Physics2D.Raycast (currentPosition, mousePosition2D, distance, 1 << LayerMask.NameToLayer ("LightSensitive"));
         //Check if something to reflect off of
         if (null != hit.collider) {
             while (insideLimit < limit) {
                 //add vertex at point of connection; Starts with whichVertex = 1 - > 2; vertexCount = 2 -> 3
                 line.SetVertexCount (vertexCount++);
                 line.SetPosition (whichVertex++, hit.point);
 
                 //creating the reflecting vector
                 reflectionDirection = Vector3.Reflect (mousePosition3D, hit.normal);
                 //OR the math below
                 //reflectionDirection = inDirection + ((Vector3.Dot(inDirection, hit.normal) * -2) * hit.normal);
 
                 //raycast from the point of connection, in the direction from reflecitionDirection
                 hit = Physics2D.Raycast (hit.point, reflectionDirection, distance, 1 << LayerMask.NameToLayer ("LightSensitive"))
                 if (null != hit.collider) {
                     //hit another reflector until it reaches limit
                     insideLimit++;
                 } else {
                     //hit nothing; out of while
                     insideLimit = limit;
                 }
             } 
         } else {
             //hit nothting
             line.SetVertexCount (vertexCount++);
             line.SetPosition (whichVertex++, mousePosition3D);
         }
     }
 }

Main Question: Why is it not reflecting? Is it because of hit.point?

Additional Questions: (if you have the time I would appreciate it, but the main question is more important): Why is Vector3.Reflect() creating a vector that does not have the same angle relative to the normal of the side the ray is hitting? Could this be due to 3D confusion since I had to use the Vector3 reflect?

Is this an efficient way to create a reflect-able light line for 2D puzzle game?

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

0 Replies

· Add your reply
  • Sort: 

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

3 People are following this question.

avatar image avatar image avatar image

Related Questions

Is there any way how to do raycasts like this? 0 Answers

Strange Raycast problem 0 Answers

One 2D Raycast Not Stopping Even Though Others Do? 0 Answers

For my tile puzzle game, how can i have the player cube only step on a tile once and if they step on the tile a second time the game will be lost? 2 Answers

Need help making a ledge climber. The problem, transform.position always returns to vector( 0, 0) 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