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

Question how to get the speed of a gameobject foreach in an array?

Discussion in 'Scripting' started by Aviation_Simmer, Nov 6, 2022.

  1. Aviation_Simmer

    Aviation_Simmer

    Joined:
    Aug 30, 2021
    Posts:
    110
    for my wheels, i want for each wheel to rotate at the speed, the wheel gameobject is going. I have all wheel gameobjects in an array. now... how can I do that?
    Code (CSharp):
    1.     void Update()
    2.     {
    3.         foreach (GameObject wheel in wheels)
    4.         {
    5.             //i have to store the local var. lastposition in anyway in that foreach thing,
    6.             //because I want the rotation foreach wheel seperatly, so that the wheel always
    7.             //rotates at the correct speed eg. in curves.
    8.             float wheelspeed = (wheel.transform.position - lastPosition).magnitude / Time.deltaTime;
    9.             float lastPosition = wheel.transform.position;
    10.             float scope = WheelDiameter * Mathf.PI;
    11.             float wheelrotationspeed = wheelspeed / WheelDiameter;
    12.             wheel.transform.Rotate(-wheelrotationspeed * Time.deltaTime, 0, 0, Space.Self);
    13.         }  
    14.     }
     
  2. Kurt-Dekker

    Kurt-Dekker

    Joined:
    Mar 16, 2013
    Posts:
    36,762
    Since you neglect to say what is and isn't working, I'll assume you have a bug above.

    Make a small test scene with a sphere with a texture on it, then cut out the math above and get the rotation correct... I assume you know 2*pi*r == diameter so use that relationship to get the rotation correct in a tiny testbed scene, nothing else in it, until you get it right. Then move it back to the above.

    As you work, here is how to keep track of what is actually going on in your code versus what you think is going on:

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

    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 or 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/

    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)

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

    Aviation_Simmer

    Joined:
    Aug 30, 2021
    Posts:
    110
    It's not an error, I just dont know how to store a local variable in an array...
     
  4. spiney199

    spiney199

    Joined:
    Feb 11, 2021
    Posts:
    5,895
    Well, generally you move the values you need out of the array. As you're dealing with a collection, you want a collection of values.

    In this situation you can use a little encapsulation and have a collection of serialisable classes to represent both the wheel objects, and the data pertaining to them:
    Code (CSharp):
    1. [System.Serializable]
    2. public class WheelData
    3. {
    4.     public GameObject WheelObject;
    5.    
    6.     //more fields here
    7. }
    8.  
    9. //usage
    10. [SerializeField]
    11. private List<WheelData> wheels = new List<WheelData>();
    Then you can just loop through this collection. You also move the logic you need into the class too if that logic pertains exclusively to these class objects.