Home > Mobile >  How to rotate multiple RigidBodies in a prefab based on user input
How to rotate multiple RigidBodies in a prefab based on user input

Time:10-28

I'm currently trying to rotate different Rigidbodys in a prefab based on separate inputs. I have it working when each Rigidbody has a separate script attached to it with the designated input, but I need to combine them into one "master control" script so I can eventually split the player character in half vertically so 1 player can control the left half and 1 player can control the right half of the body's limbs within the Mirror Networking API.

The working code is only attached to a single limb, in this case, the left bicep. The only thing that changes between limbs is the keyboard input and the multiplier variable.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LeftBicep : MonoBehaviour
{
    public float amount = 6000f;
    protected Rigidbody rb;
    public float multiplier = 4f;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float h = Input.GetAxis("leftbicep") * amount * Time.deltaTime;

        GetComponent<Rigidbody>().AddTorque(Vector3.right * h * multiplier); 
    }
}

And here's the "master control" script that is attached to the full body prefab that I can't get to work.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour
{
    public Rigidbody forearmL;
    public Rigidbody forearmR;
    public Rigidbody shoulderL;
    public Rigidbody shoulderR;
    public Rigidbody thighL;
    public Rigidbody thighR;
    public Rigidbody legL;
    public Rigidbody legR;

    public float amount = 6000f;
    public float multiplier = 4f;

    // Start is called before the first frame update
    void Start()
    {
        forearmL = (Rigidbody)GetComponent("LeftForearm2");
        forearmR = (Rigidbody)GetComponent("RightForearm2");
        shoulderL = (Rigidbody)GetComponent("LeftBicep2");
        shoulderR = (Rigidbody)GetComponent("RightBicep2");
        thighL = (Rigidbody)GetComponent("LeftThigh2");
        thighR = (Rigidbody)GetComponent("RightThigh2");
        legL = (Rigidbody)GetComponent("LeftLeg2");
        legR = (Rigidbody)GetComponent("RightLeg2");
        
    }
    
    void FixedUpdate()
    {
            float lBicep = Input.GetAxis("leftbicep") * amount * Time.deltaTime;
            shoulderL.AddTorque(Vector3.right * lBicep * multiplier);

            float lFArm = Input.GetAxis("leftforearm") * amount * Time.deltaTime;
            forearmL.AddTorque(Vector3.right * lFArm * multiplier);
            
            float lThigh = Input.GetAxis("leftthigh") * amount * Time.deltaTime;
            thighL.AddTorque(Vector3.right * lThigh * multiplier);
            
            float lLeg = Input.GetAxis("leftleg") * amount * Time.deltaTime;
            legL.AddTorque(Vector3.right * lLeg * multiplier);

            float rBicep = Input.GetAxis("rightbicep") * amount * Time.deltaTime;
            shoulderR.AddTorque(Vector3.right * rBicep * multiplier);
            
            float rFArm = Input.GetAxis("rightforearm") * amount * Time.deltaTime;
            forearmR.AddTorque(Vector3.right * rFArm * multiplier);
            
            float rThigh = Input.GetAxis("rightthigh") * amount * Time.deltaTime;
            thighR.AddTorque(Vector3.right * rThigh * multiplier);
            
            float rLeg = Input.GetAxis("rightleg") * amount * Time.deltaTime;
            legR.AddTorque(Vector3.right * rLeg * multiplier);

            
    }
}

The exception I get when running the game with the player prefab that has the "master control" script in the scene is

NullReferenceException: Object reference not set to an instance of an object
Movement.FixedUpdate () (at Assets/Scripts/test/Movement.cs:38)

How do I go about getting this to work?

CodePudding user response:

I'm pretty sure your issue is that all of these

forearmL = (Rigidbody)GetComponent("LeftForearm2");
forearmR = (Rigidbody)GetComponent("RightForearm2");
shoulderL = (Rigidbody)GetComponent("LeftBicep2");
shoulderR = (Rigidbody)GetComponent("RightBicep2");
thighL = (Rigidbody)GetComponent("LeftThigh2");
thighR = (Rigidbody)GetComponent("RightThigh2");
legL = (Rigidbody)GetComponent("LeftLeg2");
legR = (Rigidbody)GetComponent("RightLeg2");

will return null since the component you are looking for is called Rigidbody .. not LeftForearm2 etc. see GetComponent(string type)

type
The type of Component to retrieve.


Just make all references in the exposed fields via the Unity Inspector and remove your Start method entirely!

Or alternatively it sounds like what you passed into the GetComponent is actually the name of your child objects nested directly under the main controller so you could do (but I wouldn't as said)

// See https://docs.unity3d.com/ScriptReference/Transform.Find.html
forearmL = transform.Find("LeftForearm2").GetComponent<Rigidbody>();
forearmR = transform.Find("RightForearm2").GetComponent<Rigidbody>();
shoulderL = transform.Find("LeftBicep2").GetComponent<Rigidbody>();
shoulderR = transform.Find("RightBicep2").GetComponent<Rigidbody>();
thighL = transform.Find("LeftThigh2").GetComponent<Rigidbody>();
thighR = transform.Find("RightThigh2").GetComponent<Rigidbody>();
legL = transform.Find("LeftLeg2").GetComponent<Rigidbody>();
legR = transform.Find("RightLeg2").GetComponent<Rigidbody>();
  • Related