- Home /
Not allowed create MonoBehaviour using new keyword
Right now I have a simple weapon select. In the class WeaponSlot, I have a getSlotNumber method to return the currently selected weapon slot. How can I return this from another script? I want to have it in my ObjectPool class. So basically if I press 1, it shoots cubes, if I press 2 it shoots Spheres. So in the ObjectPool I will need to somehow use the getSlotNumber from WeaponSlots, but what is the best way of accessing the WeaponSlots class?
When I tried the following code:
WeaponSlots ws = new WeaponSlots(); int selectedWeapon = ws.getSlotNumber();
I get this warning
You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all UnityEngine.MonoBehaviour:.ctor() WeaponSlots:.ctor() ObjectPool:Start() (at Assets/Resources/Scripts/ObjectPool.cs:15)
Answer by Kiloblargh · Jan 03, 2014 at 08:24 PM
Maybe do like the error message says and use AddComponent? I don't really see what you're doing here (without you posting more scripts) but I can tell that you're doing it wrong.
You should have a specific instance of the WeaponSlot class attached to a GameObject in the scene, and reference it by a variable.
WeaponSlots ws;
void Awake() {
ws = GameObject.Find("WhateverObjectHasWeaponSlotsOnIt").GetComponent.<WeaponSlots>();
}
Once you've done that; ws.getSlotNumber
will work because ws
refers to a specific instance of WeaponSlots.
@$$anonymous$$iloblargh That worked thanks a lot, it got rid of the error. I'm new to Unity so not sure how accessing things etc works.
The way my script is meant to work is if you press 1 or 2 it sets a global variable in WeaponSlots to the number and using the GetNumber method from the ObjectPool class, it returns the number selected and will change to a sphere or cube depending on the number selected. However for reason it doesn't seem to be updating the number selected?
I do weaponSelect = ws.GetNumber in the Update() method too, but it doesn't seem to change. Is there something else I must do?
I don't know, but that sounds pretty convoluted. I would do it like this:
public GameObject[] weapons;
public GameObject currentWeapon;
void Update () {
if (Input.any$$anonymous$$eyDown) {
if (Input.Get$$anonymous$$eyDown ($$anonymous$$eyCode.Alpha1) ) {currentWeapon = weapons[1]; }
if (Input.Get$$anonymous$$eyDown ($$anonymous$$eyCode.Alpha2) ) {currentWeapon = weapons[2]; }
if (Input.Get$$anonymous$$eyDown ($$anonymous$$eyCode.Space) ) {FireWeapon (currentWeapon); }
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220613125448im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
PLease Help 1 Answer
GUI does not show my current ammo 0 Answers
How Can One Collider Recognize Contact With Another? 0 Answers
Method keeps looping when using waitForSeconds 1 Answer
Usage timer/weapon cooldown... 3 Answers