Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

[RELEASED] No Touch GUI for VR - Add interaction to your VR projects w/o a controller

Discussion in 'Assets and Asset Store' started by seansteezy, Jan 6, 2015.

  1. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    Well, I can say it's not my scripts, it's something to do with the Google Cardboard script. For some reason, it is getting a false from the System value for RenderTextures (....if (!SystemInfo.supportsRenderTextures && value != null)...), for some reason they're not supported on your setup right now, whether that's a unity thing or the version of cardboard, I can send you the older cardboard version I used, it may help since it never used render textures. It also may be that the newer cardboard sdk isn't compatible for Unity 4, the older one was.

    Maybe try downloading everything again and start a fresh project? I really don't think you should be getting those errors, that is a bummer!
     
  2. MS80

    MS80

    Joined:
    Mar 7, 2014
    Posts:
    346
    Good asset, but it really needs a urgent upgrade to Unity 5 and the new UI system!
    I assumed all those elements (buttons, info-windows, loading cirlces) are made with the new UI system, so I was a bit dissappointed as I recognized all is made with the old sprite renderer, it feels outdated and I cannot use it with my worldspace canvas ui's :( The asset-store description is not very clear in this case...

    Anyway, it definetly works with Unity5 and DK2. Do you have any plans to upgrade your asset in the near future?

    Looking forward for playmaker integration!
     
    Last edited: Nov 5, 2015
  3. mad-engineers

    mad-engineers

    Joined:
    May 8, 2014
    Posts:
    5
    for me asset works on Unity 5 :)
    just all ran from the beginning to the Unity 5, still see two crosshairs,
    no errors in the console
    in the screenshot the settings
     

    Attached Files:

  4. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    Send me a screenshot of the two crosshairs you are seeing and I will see what's going on. There should be one crosshair on either side, but since it's in VR, your eyes will only see one. Only a problem if there are two crosshairs on each side or 'eye'.
     
  5. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    Hey MS80,

    Yeah, sorry if the package isn't described properly. There was good reason for just using sprites, and that is because in Unity VR you have to position things in real space so with sprite game objects, it just saves you the hassle of creating all that UI junk and nesting and setting up the canvas for world space, also, that's all the UI image code is, a sprite renderer. You can replace the crosshairs with a RawImage texture set to world space in the UI, then just change the BNG_Zapper code to use UnityEngine.UI.RawImage instead of SpriteRenderer and the crosshairs will still change color when you hover something.

    I'll have updates coming soon that take full advantage of the Unity UI, but really, it's apples and apples when you talk about the UI. Unity UI is great if you are using controllers so you can scroll from one menu item to another, but with VR, it's more like using a mouse but your head is the mouse.

    Hope that helps!

    -ss
     
  6. ihueb

    ihueb

    Joined:
    Nov 28, 2015
    Posts:
    1
    Sir,
    i have this problem, could you tell me how to fix it

    thank you
     

    Attached Files:

  7. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    For this specific error, find the file it says is missing (FPSControllerForNoTouchGUI.cs) in No Touch GUI Assets --> Scripts --> External Scripts and place it in the standard assets folder. (It needs to be in what is called a 'prepass' folder so that the javascript will compile before the c# that is referencing it.)

    Hope that helps, let me know if there is anything else!

    -ss
     
  8. hacaro76

    hacaro76

    Joined:
    Oct 14, 2015
    Posts:
    25
    Hi,

    first of all Excellent Package ! a life saver.

    I’ve tested on Unity 5.3.2f1 & 5.3.2p4 and works really fine on Cardboard, Dive, and DK2.

    But I have a little question, At he moment i’m using it with the std VR Player for Google Cardboard prefab and all seems to go ok it walk rotate etc etc the only things is that the button to walk (at bottom) not follow my direction eg if i’m in starting position all it’s ok but if a rotate the head walking in this direction the button result behind me. Can you help me to solve this ?

    Another little things is that crosshair is not aligned because it seems to catch the action before enter the circle button.

    Thanks in advance for the support and best regards
     
  9. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122

    OK, I posted this on our website too, but just so everyone else can see it:

    The look down thing is kinda tough, if you center the button in the exact middle of the player, it won’t do that anymore (it needs to be dead center under the player!), the problem then becomes hurting your neck looking down to your feet all the time, so to fix that, you can make the walk buttons’s box collider even bigger so they don’t have to look all the way down to activate it, since the collider will pick up the interaction and not the actual button sprite.

    For the crosshairs, it's kinda the same thing, in the editor it will look offcenter, with the googles on, it's all good. I use the new uGUI to put a crosshair texture, then in the zapper script change SpriteRenderer to UnityEngine.UI.RawImage or whatever your crosshair is for uGUI. You can center it in world space and through the uGUI options.

    Hope that helps.

    I am developing the update as we speak and it is going to be a whole new experience, much more modular and easy to just get started without all the setup.

    ALSO NEW EMAIL: DEV @ PRODIGITALVR . COM
     
  10. markfrancombe

    markfrancombe

    Joined:
    May 26, 2009
    Posts:
    155
    Hi! New user here.... I think I wrote some questions to the old email, but never mind I figure most things out.

    I think I may have misunderstood something on the BNG_ZapperAction script.
    In the slot called Game Object To Activate I assumed that this will activate a DE-activated (turned off with the enable tick box)a game object. This would be GREAT for me, I am no programmer and do everything in PlayMaker. This way I just pile my stuff into a PlayMaker FSM that is placed on this game object, but then disable it... the Zapper Action script with then simply turn it on, and the PlayMaker FSM will play... lovely!
    However, when I try, I can see the button is working (the Circular fill plays) but the PlayMakerHolder gameobject does NOT turn on... is this simply a matter of naming it right, placing it in the right place (on the object , out of the object) or have I got this totally wrong...?

    loving this asset otherwise!

    Mark
     
  11. markfrancombe

    markfrancombe

    Joined:
    May 26, 2009
    Posts:
    155
    Damn it.. one more question already!
    In the demo, the character controller starts off disabled. and is enabled when you click the first info board. When I try to make my own scene, I ALSO have a disabled character controller, which I don't want. Im assuming this has something to do with the CharacterControllerObject Game Object and is attached script, but what... told you Im not programmer...
     
  12. markfrancombe

    markfrancombe

    Joined:
    May 26, 2009
    Posts:
    155
    Seems like no-ones replying here anymore... I seem to have figured out the issues i posted a while back right above...
    but now I have a more general question. Also relating to the WALK/STOP button. I have all but finished a game and the core of it has been No touch gui. So thanks...
    Theres 2 things that after some considerable testing, users have mentioned...

    1. Is there a way to get the stop and walk buttons NOT on the floor, but on a kind of "HUD" always visible and locked to screen, BUT still possible to hover over with the cursor.

    2. I KNOW this is No touch gui, but many of the cardboard solutions use the "magnet button". I would like to have the option of using that too. particularly for WALK/STOP. Then I kind of wouldnt mind taht we used teh floor based gui for a fall back abut users could use the magnet for walking and stopping...

    My game requires ALOT of stopping and starting, to get into position to click (hover) over buttons, and we´re getting neck ache here... !!!! Bacon Neck ache!!

    cheers!

    Mark
     
    Last edited: Mar 23, 2016
  13. Omnikam

    Omnikam

    Joined:
    Nov 26, 2014
    Posts:
    9
    You said this Asset will be Updated, When? It`s been over a year and still no new Gui support. Are you actually working on version 2 or is this abandon ware?
     
  14. Master-E

    Master-E

    Joined:
    Apr 15, 2013
    Posts:
    3
    Good day! I just purchased this package for a while. Some prefabs are quire handy.
    Thanks.

    BTW, just wondering any methods to trigger by hover?
    I have no ideas to activate specific function I wrote by hover event. Does any solutions here?

    Following are my expectation.
    1. hover gaze point (crosshair) onto one button.
    2. Trigger specific function immediately.

    Please help , thanks in advance.
     
  15. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122

    Hey Master-E, sorry for the delayed response, I never seem to get emails from this place except for yours recently.

    In the BNG_ZapperAction script you'll see where the tooltip stuff is activated (something like tooltip.gameObject.SetActive(true)). You can use that to pop in a call to another function. You could duplicate the public variables for callFundtionOnActivate/Deactivate and use them to call a function at the moment the tooltip is visible.

    Hope that helps!

    For everyone else - I do have an update on the way with some super advanced stuff but it's going to be a whole new package since trying to handle 4.6+ and 5+ was too much. New version will be uGUI ready!
     
  16. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    There is a v2 coming as a separate asset, sorry... things got crazy and an update of the original never happened. V2 will be totally worth it though. Too much changed from 4.6 to 5.+
     
  17. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    Email me at dev@prodigitalvr.com and I will send you the working code we have for a new waypoint based system. You can place waypoints on your level and walk between them, much easier than full walk/stop! For your first issue, I have some code that will put a menu in front of you and allow you to select things horizontally and vertically, but it's not quite there yet... it will work though, just gets weird when rotating fast 180's.

    Other than that, you can put the magnet button in cardboard to do an action, check this out: google developer using trigger. And just create a function called onCardboardTrigger() and use that to toggle the autowalk feature. If they don't have the button it won't trigger anything!

    Sorry for the pain in the [bacon] neck!
     
  18. pblnrao

    pblnrao

    Joined:
    Feb 10, 2014
    Posts:
    4
    We bought this plugin in 2015 summer and this made our task simple with its awesome functionality.
    Currently we are developing another app using Unity 5.5 which uses its UI slider. User must able to change the slider value with the plugin but its not happening. Hope it doesn't support, but atleast can yo suggest a work around to solve this issue, until we receive your next update.

    It means do we need to buy this new version to work on UI elements. Or it will be there for previous customers.
     
  19. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    Thanks! Here's some tips: If you put a box collider on a uGUI UI Element in World Space, and put the BNG_ZapperAction script on it, you can do anything with uGUI and No Touch GUI. For UI elements, there is a lot of things to hook into it, but here is some code that may help:

    Code (csharp):
    1.  
    2. using UnityEngine;
    3. using System.Collections;
    4. using UnityEngine.UI;
    5. using System;
    6.  
    7. //THIS IS ATTACHED TO THE SLIDER GAME OBJECT
    8. public class UISliderForVR : MonoBehaviour {
    9.  
    10.     public float sliderIncrement = 0.025f;
    11.     public string units = "";
    12.     public bool inFeet = false;
    13.     public bool inUnits = true;
    14.  
    15.     private Text tipText; //inside my tooltip is the tooltip text, we want to display the slider value here
    16.     private Slider slider;
    17.     private Transform sliderTip;
    18.     private Transform sliderLeft;
    19.     private Transform sliderRight;
    20.     private float sliderVal;
    21.     private float ftToM = 0.3048f; // (mToFt) * (m) = ft
    22.     private float mToFt = 3.28084f;
    23.     private UIManager uim; //this has connections to the options we're setting
    24.  
    25.  
    26.     void Start () {
    27.  
    28.         uim = transform.Find("/UI Manager").GetComponent<UIManager>();
    29.  
    30.         slider = GetComponent<Slider>();
    31.         sliderLeft = transform.Find("sliderLeft"); //a button to increment the slider down
    32.         sliderRight = transform.Find("sliderRight"); //a button to increment the slider up
    33.  
    34.         /*
    35.             I setup a tooltip in the handle of the slider,
    36.             put a box collider on it, and set it's activation time to 9999,
    37.             so it won't do anything but show the tool tip when I hover over it,
    38.             and over the left/right buttons
    39.         */
    40.         tipText = slider.transform.Find("Handle Slide Area/Handle/SLIDER TIP/SliderVal").GetComponent<Text>();
    41.  
    42.         if (inFeet)
    43.         {
    44.             tipText.text = Math.Round(slider.value * mToFt, 2).ToString() + units;
    45.         } else
    46.         {
    47.             tipText.text = Math.Round(slider.value, 2).ToString() + units;
    48.         }
    49.     }
    50.  
    51.     public void moveSliderRight()
    52.     {
    53.         if(slider.value < slider.maxValue) slider.value += sliderIncrement;
    54.  
    55.         if (inFeet)
    56.         {
    57.             tipText.text = Math.Round(slider.value * mToFt, 2).ToString() + units;
    58.         }
    59.         else
    60.         {
    61.             tipText.text = Math.Round(slider.value, 2).ToString() + units;
    62.         }
    63.  
    64.         //these are my two sliders, they have to do something when you move them, record a value, send it somewhere...
    65.         if (transform.parent.name == "PlayerHeight") uim.setPlayerHeight(slider.value);
    66.         else if (transform.parent.name == "WalkSpeed") uim.setMoveSpeed(slider.value);
    67.      
    68.     }
    69.  
    70.     public void moveSliderLeft()
    71.     {
    72.  
    73.         if (slider.value > slider.minValue) slider.value -= sliderIncrement;
    74.         if (inFeet)
    75.         {
    76.             tipText.text = Math.Round(slider.value * mToFt, 2).ToString() + units;
    77.         }
    78.         else
    79.         {
    80.             tipText.text = Math.Round(slider.value, 2).ToString() + units;
    81.         }
    82.  
    83.         //these are my two sliders, they have to do something when you move them, record a value, send it somewhere...
    84.         if (transform.parent.name == "PlayerHeight") uim.setPlayerHeight(slider.value);
    85.         else if (transform.parent.name == "WalkSpeed") uim.setMoveSpeed(slider.value);
    86.     }
    87. }
    88.  
    Hope that helps, here's an image of the slider setup, it's just using the basics of what's built in to No Touch GUI. You can even make keyboards this way. Cheers! -ss

    upload_2017-1-20_0-42-43.png
     
  20. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    Here's that code too, (switch the uncommented lines), you gotta mess around with the offset, smoothing and placement of the main panel. But this is to be placed on the World Canvas and it will move it around you, the smoothing will dampen the rotation speed so you can select stuff from it but it follows you. It's pretty janky, needs fine tuning....

    Code (csharp):
    1.  
    2. using UnityEngine;
    3. using System.Collections;
    4.  
    5. public class smoothUIForVR : MonoBehaviour {
    6.  
    7.     public Transform transformToChange;
    8.     public Transform transformToCopy; //head/cam rotation Y is what we want
    9.  
    10.     public Vector3 offsets;
    11.     public float smoothTime = 0.5F;
    12.     private Vector3 velocity = Vector3.zero;
    13.  
    14.     //public Transform target;
    15.  
    16.     void Update()
    17.     {
    18.         //this will make menu stay in front of you,
    19.         //you can also clone position this way so it follows you,
    20.          //if your transform to Copy was the same as the rotation transform you are copying
    21.         transformToChange.LookAt(transformToCopy, Vector3.up);
    22.  
    23.         //this is kinda broken but good luck, uncomment and tweak smoothing and offset settings at runtime to see if it stabilizes
    24.         /*
    25.        transformToChange.rotation = Quaternion.Euler(Vector3.SmoothDamp(transformToChange.rotation.eulerAngles, transformToCopy.localRotation.eulerAngles + offsets, ref velocity, smoothTime));
    26.     }*/
    27. }
    28.  
    29.  
     
    Last edited: Jan 20, 2017
  21. pblnrao

    pblnrao

    Joined:
    Feb 10, 2014
    Posts:
    4
    Than you for your quick reply. In you example you placed two items one on left and right. On which if we place point, the slider will move left or right. But in my case i will be directly pointing on to slider bar. and it should react to it.
     
  22. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    In that case, it is much more complicated! You'd create a function that would move the handle to where the bng zapper raycast is pointing, but first you will have to create a public variable to access the hit.point of the BNG_Zapper raycast. Go into BNG_Zapper and add the hitPoint line there:

    Code (csharp):
    1.  
    2. if (Physics.Raycast(transform.position, fwd, out hit, rayLength)) //if you have the tag, great, if not, check for BNG_Zapper Script
    3.         {
    4.             onButton = true;
    5.             currentGameObject = hit.transform.gameObject;
    6.             hitPoint = hit.point; <-- //ADD THIS LINE
    7.  
    then you can create a moveHandle function similar to this (you will need to add limits, so if the handle moves

    Code (csharp):
    1.  
    2.  void Update()
    3.     {
    4.         if (isMovingSliderHandle)
    5.         {
    6.                //slider handle is the thing you are moving on the x axis, zap is the reference to the BNG_Zapper script
    7.                 sliderHandle.position = new Vector3(zap.hitPoint.x, sliderHandle.position.y, sliderHandle.position.z);
    8.         }
    9.     }
    10.  
    And you would call the moveHandle function from the no touch gui button, this function will automatically drop the handle after 2 seconds

    Code (csharp):
    1.  
    2. public void moveHandle()
    3.     {
    4.         StartCoroutine(stopMovingHandle());
    5.         isMovingSliderHandle = true;
    6.     }
    7.  
    8. IEnumerator stopMovingHandle()
    9.     {
    10.         yield return new WaitForSeconds(2f);
    11.         isMovingSliderHandle= false;
    12.     }
    13.  
    Hope that helps!
     
    pblnrao likes this.
  23. Master-E

    Master-E

    Joined:
    Apr 15, 2013
    Posts:
    3
    Thanks for feedback.

    BTW, I need active something immediately.
    The method "callFundtionOnActivate" you said that is not triggered "immediately".
    Tool tips is more likely I want, but not customize function. Tooptips is only setActive true / false only.... I need hover object than trigger specific function immediately.
     
  24. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    Ok so if you use the tooltip functionality to trigger a function (it shows the tooltip when you hover), you can setup a bool like doOnce and if it = false, call the hover function you created, then set it to true right after that so it only gets called once when you hover. Cloning the callFunctionOnActivate will allow you to use this across all BNG_ZapperObjects by setting whatever functions on whatever game objects to trigger on hover events. Hope that helps, good luck!
     
  25. pblnrao

    pblnrao

    Joined:
    Feb 10, 2014
    Posts:
    4
    Hi i have tried you above suggestion...

    Added hitPoint to BNG_Zapper.sc in CastRay function. Its fine

    Code (CSharp):
    1.     void CastRay(Vector3 fwd) {
    2.  
    3.         //Debug.DrawRay(transform.position, fwd, Color.blue, 1f); //draws a line in the editor's scene window so you can see where the raycast is pointing
    4.  
    5.         if (Physics.Raycast(transform.position, fwd, out hit, rayLength)
    6.             && hit.transform.gameObject.GetComponent<BNG_ZapperAction>() != null) //if you have the tag, great, if not, check for BNG_Zapper Script
    7.         {
    8.             onButton = true;
    9.             currentGameObject = hit.transform.gameObject;
    10.             hitPoint = hit.point; // ADDED HERE
    11.             Debug.Log (hitPoint);
    12.             if (zappedObjects.Count < 1) zappedObjects.Add(currentGameObject);
    13.             za = zappedObjects[0].GetComponent<BNG_ZapperAction>();
    14.             if (za.canActivate && usingSprites) sr.color = colorOnHover; //change color of crosshairs
    15.             DoHit(hit, zappedObjects[0], za);
    created one sliderScript and added it to SliderObject. with you moveHandle() and update() snippet.

    Below is the script i have attached to Slider Object

    Code (CSharp):
    1.  
    2. using System.Collections;
    3. using System.Collections.Generic;
    4. using UnityEngine;
    5.  
    6. public class sliderController : MonoBehaviour {
    7.  
    8.     private bool isMovingSliderHandle = false;
    9.     private GameObject sliderHandle;
    10.     private BNG_Zapper zap;
    11.  
    12.     // Use this for initialization
    13.     void Start () {
    14.  
    15.         sliderHandle = GameObject.FindGameObjectWithTag ("sliderHandel");
    16.  
    17.     }
    18.  
    19.     // Update is called once per frame
    20.     void Update () {
    21.  
    22.         if (isMovingSliderHandle)
    23.         {
    24.             //slider handle is the thing you are moving on the x axis, zap is the reference to the BNG_Zapper script
    25.             sliderHandle.position = new Vector3(zap.hitPoint.x, sliderHandle.position.y, sliderHandle.position.z);
    26.         }
    27.  
    28.     }
    29.  
    30.     public void moveHandle()
    31.     {
    32.         StartCoroutine(stopMovingHandle());
    33.         isMovingSliderHandle = true;
    34.     }
    35.  
    36.     IEnumerator stopMovingHandle()
    37.     {
    38.         yield return new WaitForSeconds(2f);
    39.         isMovingSliderHandle= false;
    40.     }
    41. }
    Can you tell me what does sliderHandle holds. I tried to initilize it with Handel of Slider. And getting error. Attached the snap shot.

    As its not having transformation attributes i think. So changed it to
    Code (CSharp):
    1. sliderHandle.transform.position = new Vector3(zap.hitPoint.x, sliderHandle.transform.position.y, sliderHandle.transform.position.z);
    still not working.

    As we are developing a movie player app. I need to give VR user to go to desired position in the movie by selecting slider with your plugin.

    Capture.JPG
     
  26. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    Ok so looking at that error, that was caused by not having sliderHandle.transform.position, which you fixed, and it's still not working... Is the correct tag for the slider handle "sliderHandel" or "sliderHandle"? Double check that to make sure it's getting the handle reference. Also, make sure that the moveHandle function is being called by using the debug checkbox in the Zapper Action script. The other thing that may be happening is that the BNG_Zapper doesn't have a hit.point, or that it's not hitting a game object... in which case you can try to put a ui panel behind the slider with a box collider on it, so that it has something to hit in world space.

    Good luck!
     
  27. pblnrao

    pblnrao

    Joined:
    Feb 10, 2014
    Posts:
    4
    Rechecked the code, i am have debug using Debug.Log statement all break points. The function is getting triggered properly but handle is not moving properly. The value from BNG_Zapper and the value accessed in setting sliderHandle are matching. It makes sure that reference to the BNG_Zapper and retreving hit.point

    Is there anything i can do further to overcome the issue.

    Is it possible for you to create a small project with just slider and show me if it works for you.
     
  28. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122

    This is a complex programming issue, and I don't have time to create a project for it, but, you can try to manipulate the slider value in order to get it to move, instead of changing it's position directly. Create a function that would take the hitPoint value, and turn it into a normalized number between your slider's min and max values. You can get the distance of the hitPoint.position.x from the center of the slider handle's x position, and if the distance from the center is negative, move the slider to the left and if it's positive, move it to the right, or just set the slider value to the normalized number. It's very complex but you need to get the x position of the zapper's hitPoint and compare it to the x position of the handle, then you can update the slider's value based on the hitPoint's distance from the handle, instead of manipulating it's position directly. Try that and see if you can get it to work!

    So this line:

    Code (csharp):
    1. sliderHandle.position=newVector3(zap.hitPoint.x, sliderHandle.position.y, sliderHandle.position.z);
    Would become:

    Code (csharp):
    1.  
    2. if(zap.hitPoint.x < sliderHandle.position.x && Slider.value > Slider.minValue) {
    3. //you will want to move it left
    4. Slider.value -= 0.1f; //0.1f is the amount to move it increment
    5. } else if (zap.hitPoint.x > sliderHandle.position.x && Slider.value < Slider.maxValue) {
    6. Slider.value += 0.1f; //0.1f is the amount to move it increment
    7. }
    8.  
    That is still very rudimentary, but if that works, you can tweak it to your liking.
     
    Last edited: Jan 20, 2017
  29. seansteezy

    seansteezy

    Joined:
    Nov 28, 2013
    Posts:
    122
    This is totally because we need to set the z value of the reticle position based on what it's hitting. so the graphic you see should rest just in front of the object you're looking at. It's a factor of retinal focus. I completely overlooked this in the past. Best thing is to position the BNG_Reticle based on any object it is hitting and move it like 50% between the object and your face or whatever mix you prefer, but you also have to scale it according to how far away it is so it doesn't noticably shrink/expand... my bad!