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 /
avatar image
0
Question by fede1324 · Jun 11, 2016 at 07:11 PM · unity 5collision3dtriggerontriggerenter

My trigger is called twice

Hey, I have a problem. In my game you have a player (Character controller with capsule collider) that picks up objects like logs to build stuff in a crafting table. The crafting table has got a trigger and with an onCollisionEnter that detects what kind of object is. Example: if it is a log it will increase the array log index and when the object leaves the trigger area, with an OnCollissionExit it decreases the array index of the log. Then the player interacts with the crafting table and it checks what materials are near the crafting and it crafts what is possible. The problem is that the onTriggerEnter and onTriggerExit behaves strangely, sometimes it launches twice so the counter does not work. I want it to launch only once:

 void OnTriggerEnter(Collider other) {
         switch (other.tag)
         {
             case "PickUp":
                 object[0]++;
                 Debug.Log(object[0]);
                 break;
         }
 }

 void OnTriggerExit(Collider other){
         switch (other.tag) {
         case "PickUp":
             object [0]--;
             Debug.Log(object[0]);
             break;
     }
 }
 

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

1 Reply

· Add your reply
  • Sort: 
avatar image
1

Answer by DRsabadash · Mar 17, 2017 at 08:01 AM

A usual approach is to set a boolean value to check whether or not the collider has been activated, and flipping it once it has so it can not activate multiple times. (bool b = true, OnColliderEnter only executes code if b = true, then sets it to false in the code so it cannot run twice, OnColliderExit sets it back to true so the collider can be re-collided with) For some reason, setting a boolean check for colliders can sometimes cause the boolean value to either flip, or to turn on/off the OnTriggerEnter/OnTriggerExit methods while remaining in the trigger area, like opening a door and closing it repeatedly while in the trigger area, or flipping the boolean value so it closes when you approach and opens when you walk away.

using a simple variable iterator prevents the actual method from being called repeatedly, guaranteeing only one execution per collision.

 //previous code in class
 //using a door opening and closing as an example
 [SerializeField] private GameObject device;
     private int i = 0;
 
 
     void OnTriggerEnter(Collider other){
         DoorScript door = device.GetComponent<DoorScript>();
         if (i == 0) {
             if (door != null) {
                 door.Operate ();
                 i++;
             }
         }
 
     }
     void OnTriggerExit(Collider other){
         DoorScript door = device.GetComponent<DoorScript>();
         if (i == 1) {
             if (door != null) {
                 door.Operate ();
                 i = 0;
             }
         }
 
     }
 /* All DoorScript contains is a function Operate() and a boolean for if the door is open, and an if/else statement in Operate() for moving door to open if bool is false (set to closed) and moving door to closed if bool is true (set to open)


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

4 People are following this question.

avatar image avatar image avatar image avatar image

Related Questions

OnTrigger event when colliders are already touching eachother 1 Answer

OnCollisionEnter and OnTriggerEnter not working 1 Answer

Detect when a trigger has entered a collider 1 Answer

How can i look for collisions of the bulidngs in may array ? how can i use OnTRiggerEnter/exit ? 0 Answers

Trigger Spawning? 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