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 dwhamz · Jul 20, 2017 at 05:16 PM · c#scripting problemprogrammingif-statements

How to shorten multiple if statements ?

Hi everyone, long time reader first-time poster. So I'm not a super experienced coder. I was wondering if there was any way I could condense multiple if statements that check the same thing at different values.

The player can put boards onto a door to reinforce the door and raise the health of the door. When the player adds a board, the door game object activates the board model that is a child of the main object. It will deactivate the board object if the door's health is within a certain range. if the health is less than 10 all the boards are deactivated In between 10 and 13 the first two boards are the only ones active.

I was just wondering if there was any way to condense these if statements into less code. Thanks ahead of time!

     void boardCheck()
     {
         doorHealth = doorHealthScript.CurrentHealth;
 
         int b = 0;
 
         if (doorHealth <= 10) 
         {
             for (b = 0; b < 5; b++) 
             {
                 boards [b].SetActive (false);
             }
         }
 
         if (doorHealth <= 13 && doorHealth > 10) 
         {
             for (b = 2; b < 5; b++) 
             {
                 boards [b].SetActive (false);
             }
         }
 
         if (doorHealth <= 16 && doorHealth > 13) 
         {
             for (b = 4; b <= 5; b++) 
             {
                 boards [b].SetActive (false);
             }
         }
 
     }
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

2 Replies

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

Answer by rageingnonsense · Jul 20, 2017 at 05:58 PM

For starters, you could use else if to simplify your logic:

      if (doorHealth <= 10)  {
          for (b = 0; b < 5; b++) 
          {
              boards [b].SetActive (false);
          }
      } else if (doorHealth <= 13) {
          for (b = 2; b < 5; b++) 
          {
              boards [b].SetActive (false);
          }
      } else if (doorHealth <= 16) {
          for (b = 4; b <= 5; b++) 
          {
              boards [b].SetActive (false);
          }
      }

Conceptually, you could change how you have this set up a bit. I don't know what "boards" is; but assuming just a game object. You could attach a script to each one like so:

 class board {
      public threshold;
 }

Then you set it in the editor (or via code) to either 10, 13, or 16. then you could reduce all of your code to this:

          for (b = 0; b < 5; b++) 
          {
              if(boards[b].GetComponent<board>().threshold <= doorHealth) {
                  boards [b].SetActive (false);
              }
          }

This gives you a lot more control if you wanted to expand to more boards at a future date as well. It might be slower to call GetComponent() too often though. I am unsure. If that is the case, you could always cache them within your master class where the loops happen, in the Start() method.

NOTE: This is untested pesudocode for the most part; just wanted to get the concept across.

Comment
Add comment · Show 4 · 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 dwhamz · Jul 20, 2017 at 06:13 PM 0
Share

That looks like it could totally work. I'm going to try that. Thanks!

avatar image EnokV · Jul 20, 2017 at 07:16 PM 0
Share

Obligatory LINQ one-liner:

 boards.First(item => item.Threshold <= doorHealth).SetActive(false);
avatar image Bunny83 EnokV · Jul 20, 2017 at 11:11 PM 0
Share

That does not the same. Have another look at the original code. Your code just disables the first object that matches the given condition. Also, even not specified explicitly, the collection could contain more than 5 elements and your Linq statement would cover all elements and not just the first 5. This might not be relevant here but is another difference. Don't use Linq if you do not fully understand it. It's better to write code that is easy to read / easy to follow.

If you really want a one-liner that does the same as the last example it would be:

 boards.Take(5).Where(i=>i.Threshold <= doorHealth).ToList().ForEach(i=> i.gameObject.SetActive(false));
avatar image EnokV Bunny83 · Jul 26, 2017 at 02:49 PM 0
Share

Oh shit, you're right. I just skimmed through the post, sorry.

avatar image
0

Answer by dpoly · Jul 21, 2017 at 12:44 AM

The general answer to this question is always to turn code into data. Data structures are almost always easier to read, understand and modify, but they may take a little longer to write.

Ultimately large parts of a game should be encoded into a range of data structures, which makes future customisation far easier. You have an answer to a the small question of how to shorten the code, but think instead about how best to improve the code.

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

374 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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

Multiple Cars not working 1 Answer

Using rect.contains to check if gameobject is inside in worldspace 1 Answer

C#, Problem with If Statements and GO Position Comparisons. 1 Answer

If statement randomly not working 2 Answers

How do I reference a class to pass on variables in that class? 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