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. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice
  3. Join us on November 16th, 2023, between 1 pm and 9 pm CET for Ask the Experts Online on Discord and on Unity Discussions.
    Dismiss Notice

Error CS0120: Object reference is required to access non-static member...

Discussion in 'Scripting' started by Larpushka, Jun 16, 2015.

  1. Larpushka

    Larpushka

    Joined:
    Jan 6, 2015
    Posts:
    214
    Hi guys. I'm following a youtube tutorial and I tried using his script to move an object, but I get an error saying:

    Assets/movement.cs(18,27): error CS0120: An object reference is required to access non-static member `UnityEngine.Rigidbody.AddForce(UnityEngine.Vector3, UnityEngine.ForceMode)'

    Here is the script

    Code (CSharp):
    1. using UnityEngine;
    2. using System.Collections;
    3.  
    4. public class movement : MonoBehaviour {
    5.     public float moveSpeed;
    6.     private float maxSpeed = 5f;
    7.  
    8.     private Vector3 input;
    9.  
    10.     // Use this for initialization
    11.     void Start () {
    12.    
    13.     }
    14.    
    15.     // Update is called once per frame
    16.     void Update () {
    17.         input = new Vector3(Input.GetAxis ("Horizontal"), 0, Input.GetAxis ("Vertical"));
    18.         Rigidbody.AddForce(input);
    19.    
    20.     }
    21. }
    22.  
    Help?
     
  2. Ecocide

    Ecocide

    Joined:
    Aug 4, 2011
    Posts:
    293
    This should help you:
    http://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html

    You can only call AddForce() on a concrete rigidbody object.

    For example declare a public variable on top of the script

    Code (csharp):
    1.  public Rigidbody rb;
    and in the Update method call:

    Code (csharp):
    1.  rb.AddForce(input);
     
  3. LeftyRighty

    LeftyRighty

    Joined:
    Nov 2, 2012
    Posts:
    5,148
    pre unity 5 you could use

    Code (csharp):
    1.  
    2. rigidbody
    3.  
    as a shortcut accessor to the Rigidbody on the gameobject
    with unity 5 they removed the majority of these short cut accessors.

    note the use of lowercase and uppercase here, uppercase is the class, lowercase is the variable


    if you try

    Code (csharp):
    1.  
    2. Rigidbody.someFunction();
    3.  
    you are trying to call a static class level function.

    if you try
    Code (csharp):
    1.  
    2. rigidbody.someFunction();
    3.  
    you are calling a function on the specific instance referred to by the variable "rigidbody" (which you need to declare and initilise manually since 5)
     
  4. Limeoats

    Limeoats

    Joined:
    Aug 6, 2014
    Posts:
    104
    As was said above me, you need to store the rigidbody that is attached to the object in a variable.

    Code (CSharp):
    1. public class Movement : MonoBehaviour {
    2.     private Rigidbody _rigidbody;
    3.  
    4.     void Start() {
    5.         this._rigidbody = GetComponent<Rigidbody>();
    6.     }
    7.  
    8.     void Update() {
    9.         //Do whatever you'd like with the rigidbody
    10.         this._rigidbody.AddForce(new Vector3(2.0f, 0.0f, 0.0f));
    11.     }
    12. }
     
  5. Larpushka

    Larpushka

    Joined:
    Jan 6, 2015
    Posts:
    214
    Yea, the rigidbody component wasn't added to the object, and apparently I used the old notation that didn't apply for Unity 5. Thank you!