Optimizing Code
Hi I have some code for my game that checks what level you are on and if you are a certain level it enables the interactable component for the buttons one by one each level. I am new to programming so i was wondering if someone could help me optimize my code as i have to individually check each level in the update function at the moment Here is my code
public class LevelManager : MonoBehaviour {
public Click click;
public GameObject levelholder;
public float bargain;
public float researchpoints;
public float researchskill;
public float researchlevel;
public UpgradeManager ugpr;
public AudioSource audio1963;
public Button research;
public UnityEngine.UI.Text Rlevel;
public float rcost;
public float baseCost;
public UnityEngine.UI.Text Rcost;
public void Update()
{
Rlevel.text = "Research Level: " + researchlevel;
Rcost.text = "Cost to research: " + rcost;
PlayerPrefs.SetFloat("ResearchL", researchlevel);
PlayerPrefs.SetFloat("Rcost2", rcost);
if (researchlevel < 3f)
{
ugpr.item3.interactable = false;
ugpr.item4.interactable = false;
ugpr.item5.interactable = false;
ugpr.item6.interactable = false;
ugpr.item7.interactable = false;
ugpr.item8.interactable = false;
ugpr.item9.interactable = false;
ugpr.item10.interactable = false;
}
if(researchlevel == 4f)
{
ugpr.item3.interactable = true;
ugpr.item4.interactable = false;
ugpr.item5.interactable = false;
ugpr.item6.interactable = false;
ugpr.item7.interactable = false;
ugpr.item8.interactable = false;
ugpr.item9.interactable = false;
ugpr.item10.interactable = false;
}
if (researchlevel == 5f)
{
ugpr.item3.interactable = true;
ugpr.item4.interactable = true;
ugpr.item5.interactable = false;
ugpr.item6.interactable = false;
ugpr.item7.interactable = false;
ugpr.item8.interactable = false;
ugpr.item9.interactable = false;
ugpr.item10.interactable = false;
}
if (researchlevel == 6f)
{
ugpr.item3.interactable = true;
ugpr.item4.interactable = true;
ugpr.item5.interactable = true;
ugpr.item6.interactable = false;
ugpr.item7.interactable = false;
ugpr.item8.interactable = false;
ugpr.item9.interactable = false;
ugpr.item10.interactable = false;
}
if (researchlevel == 7f)
{
ugpr.item3.interactable = true;
ugpr.item4.interactable = true;
ugpr.item5.interactable = true;
ugpr.item6.interactable = true;
ugpr.item7.interactable = false;
ugpr.item8.interactable = false;
ugpr.item9.interactable = false;
ugpr.item10.interactable = false;
}
if (researchlevel == 8f)
{
ugpr.item3.interactable = true;
ugpr.item4.interactable = true;
ugpr.item5.interactable = true;
ugpr.item6.interactable = true;
ugpr.item7.interactable = true;
ugpr.item8.interactable = false;
ugpr.item9.interactable = false;
ugpr.item10.interactable = false;
}
if (researchlevel == 9f)
{
ugpr.item3.interactable = true;
ugpr.item4.interactable = true;
ugpr.item5.interactable = true;
ugpr.item6.interactable = true;
ugpr.item7.interactable = true;
ugpr.item8.interactable = true;
ugpr.item9.interactable = false;
ugpr.item10.interactable = false;
if (researchlevel == 10f)
{
ugpr.item3.interactable = true;
ugpr.item4.interactable = true;
ugpr.item5.interactable = true;
ugpr.item6.interactable = true;
ugpr.item7.interactable = true;
ugpr.item8.interactable = true;
ugpr.item9.interactable = true;
ugpr.item10.interactable = false;
if (researchlevel > 10f)
{
ugpr.item3.interactable = true;
ugpr.item4.interactable = true;
ugpr.item5.interactable = true;
ugpr.item6.interactable = true;
ugpr.item7.interactable = true;
ugpr.item8.interactable = true;
ugpr.item9.interactable = true;
ugpr.item10.interactable = true;
}
}
}
So i was wondering is there a better way to disable all buttons except for 3 when on level 4 and all buttons except for 3 and 4 when on level 5 and so on without a huge block of long code
Answer by UnityCoach · Apr 01, 2017 at 11:30 AM
Ok, first, careful with the bracketing, the code you posted will never go into the last branches, Unity console may even give you an "unreachable code" warning, as if research level can't be 9 and 10 at the same time.
Anyway, You don't want to do this in Update, you want to do this when researchlevel changes only. You can use an accessor for this, like :
private float _researchlevel;
public float researchlevel
{
get { return _researchlevel; }
set
{
if (_researchlevel != value) // if the value changed
{
_researchlevel = value; // update the variable
ugpr.item3.interactable = _researchlevel != 4f; // give the conditions to each
ugpr.item4.interactable = _researchlevel < 3f;
ugpr.item5.interactable = _researchlevel > 4f;
ugpr.item6.interactable = _researchlevel != 4f && _researchlevel < 7f;
ugpr.item7.interactable = _researchlevel != 4f;
ugpr.item8.interactable = _researchlevel == 4f;
ugpr.item9.interactable = _researchlevel != 4f;
ugpr.item10.interactable = _researchlevel != 4f;
}
}
}
I can't see from your code what changes the researchlevel variable, but whatever did will trigger this mechanics, if you replace it with this accessor.
Thanks for the answer I have implemented your code to the top of my script like so
public class Research$$anonymous$$anager : $$anonymous$$onoBehaviour {
public Click click;
public Upgrade$$anonymous$$anager upg;
public float rcost;
public float rlevel;
private float baseCost;
public AudioSource audiowait;
public AudioSource audiofunds;
public Button researchbutton;
private float rvalue;
public UnityEngine.UI.Text leveltext;
public UnityEngine.UI.Text buttoninfo;
private float _rlevel;
private float _researchlevel;
public float researchlevel
{
get { return _researchlevel; }
set
{
if (_researchlevel != researchlevel) // if the value changed
{
_researchlevel = researchlevel; // update the variable
upg.item3.interactable = _researchlevel < 4f; // give the conditions to each
upg.item4.interactable = _researchlevel < 5f;
upg.item5.interactable = _researchlevel < 6f;
upg.item6.interactable = _researchlevel < 7f;
upg.item7.interactable = _researchlevel < 8f;
upg.item8.interactable = _researchlevel < 9f;
upg.item9.interactable = _researchlevel < 10f;
upg.item10.interactable = _researchlevel < 11f;
}
}
but when the research level is below 4 the button does not become uninteractable. I dont think in this code you are telling the buttons to be interactable = false when the _researchlevel is what the condition is. Please excuse me if i sound stupid as i am new to program$$anonymous$$g I will now explain what i want to do in more detail:
so what i want to do is i have a panel of 10 gameobjects all of which are buttons when you first start the game 2 of those buttons should allready be interactable 1 and 2 then when your research level goes up to level 4 the third button should also become interactable then at level 5 the fourth should become interactable until level 11 when all buttons are interactable by the way you click a button to research level +1 so i need it to detect all 11 levels and enable the buttons one at a time making one more button interactable each level
Thanks in advance for the answer.
Well, you could make it very generic then, like :
public List<Buttons> items; // put this in your upgrade manager to manage buttons as a list
Then, in the property, you can simply do this :
private int _researchlevel;
public int researchlevel // make this an int, it's easier to manage
{
get { return _researchlevel; }
set
{
if (_researchlevel != researchlevel) // if the value changed
{
_researchlevel = researchlevel; // update the variable
for (int i = 2 ; i < upgrade.items.count ; i++) // for all items, starting at the 3rd
upg.items[i].interactable = _researchlevel > i+2; // lists are zero based, so 1st item is at 0, 2nd item at 1, etc.
}
}
}
Sorry but I still don't understand how to make the button,Interactable = true or = false using your code. I need the 4-10 buttons to be interactable = false when < level 5 and when < level 6 it needs buttons 5-10 to be interactable = false so when you go up a level the next button is interactable = true. Thanks for all your help so far really appreciate it.
Answer by Gtren456 · Apr 03, 2017 at 08:12 AM
@UnityCoach what code would I type to assign false to the left hand side of the operator, I have looked up some c# basics and tried some code but nothing works could you give me the line of code that will return false
Your answer
Follow this Question
Related Questions
Count colored pixels of RenderTexture and get this data on CPU. 0 Answers
Optimize mobile game with lot of Rigidbodies (Collisions) 0 Answers
Upcast vs GetComponent 1 Answer
Brainstorming Optimization 0 Answers
Less code for same thing 1 Answer