Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Dismiss Notice

Discussion OnTriggerEnter not doing anything

Discussion in 'Editor & General Support' started by superdoesthings, Jul 17, 2023.

  1. superdoesthings

    superdoesthings

    Joined:
    May 17, 2023
    Posts:
    13
    Hi, I am using the gorilla tag locomotion system (its open source on Github). For one of the "hands" which you can control with your vr controllers (if you dont know how the locomotion system in gorilla tag works, just google gorilla tag gameplay) and i put a script on the right "primary" hand. Heres the script:


    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class DoorEnter : MonoBehaviour
    6. {
    7.     // Start is called before the first frame update
    8.  
    9.     // Update is called once per frame
    10.     void OnTriggerEnter(Collider maybedoor)
    11.     {
    12.         if (maybedoor.gameObject.name == "Teleport")
    13.         {
    14.             Debug.Log("open na noor"); //code to do the door stuff
    15.         }
    16.     }
    17. }
    18.  
    The script doesnt do anything when I touch the door. I have "Is Trigger" enabled on the primary hand, and i tried the door with and without it. It still did nothing, and other people have very similar scripts and they seem to work. Heres an example:


    I hope anyone can help me. Thanks :D
     
  2. spiney199

    spiney199

    Joined:
    Feb 11, 2021
    Posts:
    5,769
  3. superdoesthings

    superdoesthings

    Joined:
    May 17, 2023
    Posts:
    13
  4. Kurt-Dekker

    Kurt-Dekker

    Joined:
    Mar 16, 2013
    Posts:
    36,563
    We know these functions work and that the documentation has a very specific list of requirements.

    Once you exhaust those possibilities...

    Time to start debugging! Here is how you can begin your exciting new debugging adventures:

    You must find a way to get the information you need in order to reason about what the problem is.

    Once you understand what the problem is, you may begin to reason about a solution to the problem.

    What is often happening in these cases is one of the following:

    - the code you think is executing is not actually executing (or even attached?) at all
    - the code is executing far EARLIER or LATER than you think
    - the code is executing far LESS OFTEN than you think
    - the code is executing far MORE OFTEN than you think
    - the code is executing on another GameObject than you think it is
    - you're getting an error or warning and you haven't noticed it in the console window

    To help gain more insight into your problem, I recommend liberally sprinkling
    Debug.Log()
    statements through your code to display information in realtime.

    Doing this should help you answer these types of questions:

    - is this code even running? which parts are running? how often does it run? what order does it run in?
    - what are the names of the GameObjects or Components involved?
    - what are the values of the variables involved? Are they initialized? Are the values reasonable?
    - are you meeting ALL the requirements to receive callbacks such as triggers / colliders (review the documentation)

    Knowing this information will help you reason about the behavior you are seeing.

    You can also supply a second argument to Debug.Log() and when you click the message, it will highlight the object in scene, such as
    Debug.Log("Problem!",this);


    If your problem would benefit from in-scene or in-game visualization, Debug.DrawRay() or Debug.DrawLine() can help you visualize things like rays (used in raycasting) or distances.

    You can also call Debug.Break() to pause the Editor when certain interesting pieces of code run, and then study the scene manually, looking for all the parts, where they are, what scripts are on them, etc.

    You can also call GameObject.CreatePrimitive() to emplace debug-marker-ish objects in the scene at runtime.

    You could also just display various important quantities in UI Text elements to watch them change as you play the game.

    Visit Google for how to see console output from builds. If you are running a mobile device you can also view the console output. Google for how on your particular mobile target, such as this answer for iOS: https://forum.unity.com/threads/how-to-capturing-device-logs-on-ios.529920/ or this answer for Android: https://forum.unity.com/threads/how-to-capturing-device-logs-on-android.528680/

    If you are working in VR, it might be useful to make your on onscreen log output, or integrate one from the asset store, so you can see what is happening as you operate your software.

    Another useful approach is to temporarily strip out everything besides what is necessary to prove your issue. This can simplify and isolate compounding effects of other items in your scene or prefab.

    Here's an example of putting in a laser-focused Debug.Log() and how that can save you a TON of time wallowing around speculating what might be going wrong:

    https://forum.unity.com/threads/coroutine-missing-hint-and-error.1103197/#post-7100494

    "When in doubt, print it out!(tm)" - Kurt Dekker (and many others)

    Note: the
    print()
    function is an alias for Debug.Log() provided by the MonoBehaviour class.
     
  5. superdoesthings

    superdoesthings

    Joined:
    May 17, 2023
    Posts:
    13
    Okay I was finally able to get it to work by just remaking the object with the same components, and modifying the script a bit. The only thing is that it only teleports you once, and I can't figure out why. Debug.log doesnt work either. Here's the script:


    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class Door : MonoBehaviour
    6. {
    7.     void OnTriggerEnter(Collider other)
    8.     {
    9.         other.transform.parent.gameObject.transform.position = new Vector3(0, 10, 0);
    10.     }
    11. }
     
  6. Kurt-Dekker

    Kurt-Dekker

    Joined:
    Mar 16, 2013
    Posts:
    36,563
    Just so you know, this stuff is absolutely insupportable MADNESS:

    Just make a public reference to whatever you are futzing around with and set it to (0,10,0)

    That's The Unity Way(tm).

    Here's more reading:

    Keep in mind that using GetComponent<T>() and its kin (in Children, in Parent, plural, etc) to try and tease out Components at runtime is definitely deep into super-duper-uber-crazy-Ninja advanced stuff.

    This sort of coding is to be avoided at all costs unless you know exactly what you are doing.

    If you run into an issue with any of these calls, start with the documentation to understand why.

    There is a clear set of extremely-well-defined conditions required for each of these calls to work, as well as definitions of what will and will not be returned.

    In the case of collections of Components, the order will NEVER be guaranteed, even if you happen to notice it is always in a particular order on your machine.

    It is ALWAYS better to go The Unity Way(tm) and make dedicated public fields and drag in the references you want.

    In general, DO NOT use Find-like or GetComponent/AddComponent-like methods unless there truly is no other way, eg, dynamic runtime discovery of arbitrary objects. These mechanisms are for extremely-advanced use ONLY.

    If something is built into your scene or prefab, make a script and drag the reference(s) in. That will let you experience the highest rate of The Unity Way(tm) success of accessing things in your game.
     
  7. superdoesthings

    superdoesthings

    Joined:
    May 17, 2023
    Posts:
    13
    Alright, I made this but it still only teleports you once, here is the code:


    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class Door : MonoBehaviour
    6. {
    7.     public GameObject monke;
    8.     private void Start()
    9.     {
    10.     }
    11.     // Update is called once per frame
    12.     void OnTriggerEnter(Collider other)
    13.     {
    14.         monke.transform.position = new Vector3(0, 10, 0);
    15.     }
    16. }
    Here's a video of it, too: