Search code examples
c#unity-game-enginerider

cannot access non static method "GetComponent" in static context, despite me not declaring the class as static


I am currently working on making a class accessible from other scripts. Below is what I have coded.

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

[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(BoxCollider2D))]
// Start is called before the first frame update
    public class _move
    {

        private float _sizex;
        private float _sizey;
        public _move(float sizx, float sizy....etc)
        {        


            _sizex = sizx;
            _sizey = sizy;
        }


        public  void regularmove(float sizex, float sizey...etc)
        {
            GameObject _player;
            _player =  GameObject.GetComponent<GameObject>();
            BoxCollider2D bc2d;
            bc2d = _player.GetComponent <BoxCollider2D>();
            bc2d.offset = new Vector2(locationx + 1, locationy);
        }
    }

however, when I try to compile it, it gives me an error.

cannot access non-static method"GetComponent"

on this line of code

_player =  GameObject.GetComponent<GameObject>();

I do not know why this is happening because I have not declared the class as static, and do not really know the properties of GetComponent that well. Can someone tell me what is happening and how I can solve this? Also, when I change

GameObject _player; 
to
public GameObject player;

the scripts below suddenly cease to work, giving me errors like

cannot resolve symbol _player 

what exactly is happening here? Thanks in advance!


Solution

  • Whatever script creating the instance of the _move class (This is bad naming btw, it should be Move) should also pass its gameObject to the constructor.

    // attributes here are not valid if your class is not a MonoBehaviour
    public class Move
    {
        GameObject m_object;
        public Move(GameObject obj, ...)
        {
            m_object = obj;
        }
    }
    

    if your class is meant to be a MonoBehaviour component, then it has a GameObject member already and you can use the attributes:

    [RequireComponent(typeof(BoxCollider2D),typeof(Rigidbody2D))]
    // Start is called before the first frame update
    public class Move : MonoBehaviour
    {
         void Start()
         {
             Debug.Log(gameObject.name);
         }
    }