• 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 /
  • Help Room /
avatar image
0
Question by wideeyenow_unity · Jun 26 at 11:22 PM · c#listcacheoptimizeabstract

Code Optimizing - Cache an Iteration From a List


Is it possible to call the component/class/script from an object within a list of another class, Without using GetComponent() (for performance reasons), and without using an Interface?

 knownResources[i].state != Resources.State.Carried


The Worker.cs finds the resources via sight/collision. And then determines from out of the found objects, which to declare the workLoad , or object to focus on.


 public class Worker : MonoBehaviour
 {
     public List<GameObject> knownResources;
     
     public GameObject workLoad; 
     
     void FindWorkLoad()
     {
         for (int i = 0; i < knownResources.Count; i++)
         {
             if (knownResources[i].GetComponent<Resources>().state != Resources.State.Carried &&
                 knownResources[i].GetComponent<Resources>().state != Resources.State.Inventoried)
             {
                 workLoad = knownResources[i];
                 state = State.Working;
                 return;
             }
         }
     }
 }


Multiple edits.. Answer finally found..

Comment
Add comment · Show 8
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 wideeyenow_unity · Jun 28 at 02:59 PM 0
Share

Spent all day yesterday pulling my hair out on this still. So far I have conceded that it's just not possible. And with any game referencing other objects while not using Interfaces or static variables, it is impossible to cache a call while the call is null at Start. Looks like GetComponent = 1, i = 0 .. lol

avatar image andrew-lukasik · Jun 28 at 04:26 PM 0
Share

Yes, use List<Resources> instead.

avatar image wideeyenow_unity andrew-lukasik · Jun 29 at 06:01 PM 0
Share

The amount of resources or RawResources on the map is quite large. The worker only finds it while in his sight collider, then it gets added to his list of knownResources. But either way, while it's State is in another class, GetComponent seems to be the only way

avatar image wideeyenow_unity andrew-lukasik · Jul 09 at 11:38 AM 0
Share

@andrew-lukasik thank you for your comment, as it helped me figure all this out. One day your comment popped up in my head, lol, and made all the sense in the world once I put 2 and 2 together. ty ty

avatar image pinkehelga · Jun 28 at 06:46 PM 0
Share

Is the Ressources class under your control? Why does it change? Do you add/remove it yourself at some point?

avatar image pinkehelga · Jun 28 at 06:56 PM 0
Share

There are several solutions, however, your question is poor. It depends on the behaviour of your architecture how objects are added and removed. Guessing some inappropriate solution would not be very helpful. Then you come and say: Does not work because... You've got to provide more information about your software mechanics.

avatar image wideeyenow_unity pinkehelga · Jun 29 at 05:58 PM 0
Share

There is a worker class, a parented resources class, child class of say Log. The worker only finds the object Log when in his sight range. Once he does, it gets added to his List of Resources. In order for him to carry it, he needs to know that the State of the log is loose, or still, and not being carried already. So for him to iterate through his list of known resources, and get that state, I had to use GetComponent.

avatar image wideeyenow_unity pinkehelga · Jul 09 at 11:40 AM 0
Share

@pinkehelga Thank you as well for your comment, that there are other ways to do it. As this helped me continue to test, and finally find my answer

1 Reply

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

Answer by wideeyenow_unity · Jul 01 at 12:37 AM

After much researching, testing, and headaches.. I finally found the answer, to not using GetComponent() in runtime as it is slow, and multiple calls increase the slowness. And to avoid using Interfaces as they are even slower than GetComponent(). The answer is to use static variables, and quite frankly to use static lists of the Instance of the script. Not the object. As the script can easily call the Object, but the Object cannot easily reference the script. Object Oriented Programming my but.. cough*


Within the Worker.cs this is what the FindWorkLoad() looks like now:

 void FindWorkLoad()
     {
         if (knownEntities > 0)
         {
             if (knownResources.Count > 0)
             {
                 Vector3 pos = knownResources[0].transform.position;
                 if (pos.y < Global.carryHeight)
                 {
                     if (DistanceTo(pos) > 1) { TurnAndMoveTo(pos); }
                     else
                     {
                         if (Resources.SharedInstance.CanSetAsCarrier(gameObject, knownResources[0]))
                         {
                             workLoad = knownResources[0];
                             state = State.Returning;
                         }
                         else { knownResources.RemoveAt(0); }
                     }
                 }
                 else { knownResources.RemoveAt(0); }
             }
             else
             {
                 if (knownRawResources[0].activeInHierarchy)
                 {
                     Vector3 pos = knownRawResources[0].transform.position;
                     if (DistanceTo(pos) > 1) { TurnAndMoveTo(pos); }
                     else
                     {
                         patienceCounter++;
                         if (patienceCounter > patience / 4)
                         {
                             throwPunch = true;
                             patienceCounter = 0;
                         }
                     }
                 }
                 else
                 {
                     energyPerc--;
                     knownRawResources.RemoveAt(0);
                 }
             }
         }
         else { state = State.Explore; }
     }

The one thing I was able to do, in my case, was to use the height of the position.Y value of the resource in question, as when it is carried it is at a set height. So no calls were needed to check if another worker is carrying the resource. Since my game changes no height on the huge map, this was easily possible. But calling and referencing the object was still needed. The Resources.cs is a parent class of the child-ed object scripts, which was also put into an empty gameObject which serves as a container for all the resources on the map. And while debugging/editor view they are hidden in it, and only show when un-collapsed. This is what Resources.cs looks like now:

 // Static values do not show in inspector
     public static Resources SharedInstance; // needed to call non-static functions/methods
     public static int maxMeatsSpawn = 1;    // needed for initial instantiation
     public static List<Resources> allResources = new List<Resources>();
     public static List<Log> logs = new List<Log>();
     public static int activeLogs;
     public static List<Meat> meats = new List<Meat>();
     public static int activeMeats;
     
      private void Awake()
     {
         SharedInstance = this;
     }
     
     public bool CanSetAsCarrier(GameObject me, GameObject it)
     {
         for (int i = 0; i < allResources.Count; i++)
         {
             if (allResources[i].gameObject == it)
             {
                 if (allResources[i].carrier == null)
                 {
                     allResources[i].carrier = me;
                     return true;
                 } else { return false; }
             }
         }
         return false;
     }

And then the resource itself, which is Log.cs only needs this:

 void Start()
     {
         logs.Add(this);
         allResources.Add(this);
         gameObject.SetActive(false);
     }


After getting rid of all the GetComponent() checks I had before, to do this simple transaction of code, My game runs much smoother, and only loses roughly 2 fps, versus the original value of up to and over 15 fps. If you are able to use static values like this, this is considered caching, and it is definitely faster. Thankfully I found an answer to this, as my game can include much much more now, before being hindered by standard coding limits. :D

Comment
Add comment · Show 1 · 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 wideeyenow_unity · Aug 03 at 03:48 PM 0
Share

The code has been since further refined:

 public void FindResource()
     {
         if (!knownResources[0].activeInHierarchy) { knownResources.RemoveAt(0); return; }
         
         GameObject work = knownResources[0];
         Vector3 pos = work.transform.position;
 
         if (HasNoCarrier(work))
         {
             if (DistanceTo(pos) > 1) { TurnAndMoveTo(pos); }
         } else { knownResources.Remove(work); }
     }

with the main usage of that being:

 public bool HasNoCarrier(GameObject obj)
     {
         /// Resource.100: = 12 + 1 = 13
         string number = obj.name.Substring(13);
         int index = Global.StringToInt(number);
         GameObject carrier = Resources.allResources[index].carrier;
 
         if (carrier == null && DistanceTo(obj.transform.position) > 1)
         { return true; }
         else 
         {
             if (DistanceTo(obj.transform.position) <= 1 && carrier == null)
             { Resources.allResources[index].carrier = gameObject; workLoad = obj; return false; }
             else { return false; }
         }
     }

^ As you can see I no longer call a method within the Resources.cs, and simply function off the name of the resource in question, to get it's index of where it is within the static List of allResources. Then simply reference that List's index, and easily Get and Set anything from another class. Basically a portal to access the Log.cs script.


If you are interested and wish to learn more I will soon be putting my link to Discord within my profile. And you can contact me there, All are welcome, and no question is too stupid :)

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.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

794 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 avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image 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

List keeps losing items. 0 Answers

list.contains problem 1 Answer

Call a coroutine from a list multiple times 0 Answers

Add object of specific width to a List 0 Answers

C# How to convert a struct type list into a string? 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