Hello everyone I’ve been working on my first game and suddenly I got this error and cannot run the game, I already installed the new version of unity but it persists. I see it can be caused for several reasons but had no luck so far, do you know the most probable causes and how to fix it?
When I select the scripts the only one where I do not get this error is the following:
using UnityEngine;
using Assets.Code.States;
using Assets.Code.Interfaces;
public class StateManager : MonoBehaviour
{
private IStateBase activeState;
void Start ()
{
activeState = new BeginState (this);
}
void Update ()
{
if (activeState != null)
activeState.StateUpdate();
}
void OnGUI()
{
if (activeState != null)
activeState.ShowIt ();
}
public void SwitchState(IStateBase newState)
{
activeState = newState;
}
}
But for example here I get the error:
using UnityEngine;
using Assets.Code.Interfaces;
namespace Assets.Code.States
{
public class BeginState : IStateBase
{
private StateManager manager;
public BeginState (StateManager managerRef)
{
manager = managerRef;
Debug.Log ("Constructing BeginState");
Time.timeScale = 0;
}
public void StateUpdate()
{
if (Input.GetKeyUp(KeyCode.Space))
manager.SwitchState(new PlayState (manager));
}
public void ShowIt()
{
if (GUI.Button (new Rect (10, 10, 150, 100), "Press to Play"))
{
Time.timeScale = 1;
manager.SwitchState (new PlayState (manager));
}
}
}
}
And so on with every other script.
I’ve already installed a newer version of unity3d, uninstalled the antivirus, checked the file names but the error persists. I also do not have any class in a namespace..
Вот мой скрипт:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float speed;
private Rigidbody2D rb;
private Vector2 moveInput;
private Vector2 moveVelocity;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
moveInput = new Vector2(Input.GetAxisRaw(Horizontal)
moveVelocity = moveInput.normalized * speed;
}
void FixedUpdate()
{
rb.MovePosition(rb.position + moveVelocity * Time.fixedDeltaTime);
}
}
-
Вопрос заданболее двух лет назад
-
2524 просмотра
Пригласить эксперта
Если закинуть сообщение об ошибке в гугл переводчик, то всё становится понятно:
В файле нет скриптов MonoBehaviour или их имена не совпадают с именем файла
Это Unity-специфичная ошибка, по тому тег C# тут не нужен.
Напомню, что юнити непонятно почему называет классы скриптами
-
Показать ещё
Загружается…
05 июн. 2023, в 19:29
1000 руб./за проект
25 мая 2023, в 11:04
3000 руб./в час
22 мая 2023, в 18:02
120000 руб./за проект
Минуточку внимания
Писал я скриптик, большой, жирный, с кучей вспомогательных методов. Дальше перешел к тестированию, пытаюсь перетащить его на объект. И вот, я получил ошибку!
Вы просто не представляете как было сложно найти причину этой ошибки. Пришлось удалять по строчке, пока не нашел проблему.
Сперва думал, что проблема в наследовании интерфейса. Но… нет.
Использование пространства имен? Тоже, мимо.
В ходе дальнейших экспериментов выяснил, что проблема возникла в написанных функциях. А если быть точнее в такой вот строчке
public bool IsUseResource(ResourceType resourceType, ResourceAction resourceAction = ResourceAction.Count)
Казалось бы, что тут может быть не так? А косяк в параметре по умолчанию.
// Замена
ResourceAction resourceAction = ResourceAction.Count
// на
ResourceAction resourceAction
решило проблему… Неожиданно, не правда ли???
Теперь мы можем сделать следующий вывод:
Не используйте параметры по умолчанию в методах MonoBehaviour!
Creating a MonoBehaviour with the ‘new’ keyword in Unity may result in an error. This error is commonly encountered when a developer tries to create a new instance of a MonoBehaviour class in Unity. This guide will help you understand why this error occurs and provide a step-by-step solution on how to fix it.
Table of Contents
- Why does this Error Occur?
- How to Fix the Error
- Step 1: Remove the ‘new’ Keyword
- Step 2: Use GetComponent or AddComponent
- Step 3: Use ScriptableObject Instead
- FAQs
- Related Links
Why does this Error Occur?
When you try to create a new instance of a MonoBehaviour class using the ‘new’ keyword in Unity, you’ll encounter an error. This is because MonoBehaviour is a special type of class that derives from UnityEngine.Object. Unity manages the lifecycle of MonoBehaviour objects, and they are only meant to be attached to GameObjects.
Using the ‘new’ keyword to create a MonoBehaviour does not properly initialize the object and results in unexpected behavior or errors. Unity explicitly disallows the use of the ‘new’ keyword to prevent these issues.
How to Fix the Error
To fix this error, you can follow one of the three methods mentioned below:
Step 1: Remove the ‘new’ Keyword
The simplest solution is to remove the ‘new’ keyword when creating an instance of a MonoBehaviour. Instead of creating a new instance, you can use the GetComponent<T>
or AddComponent<T>
methods to attach the MonoBehaviour to an existing GameObject.
Example:
// Instead of this:
MyMonoBehaviour myMonoBehaviour = new MyMonoBehaviour();
// Do this:
MyMonoBehaviour myMonoBehaviour = gameObject.AddComponent<MyMonoBehaviour>();
Step 2: Use GetComponent or AddComponent
As mentioned earlier, you should use the GetComponent<T>
or AddComponent<T>
methods to create instances of MonoBehaviour classes. These methods ensure that the MonoBehaviour is correctly initialized and managed by Unity.
GetComponent<T>
is used to find and return an existing instance of the specified MonoBehaviour on the GameObject:
MyMonoBehaviour myMonoBehaviour = gameObject.GetComponent<MyMonoBehaviour>();
AddComponent<T>
is used to create a new instance of the specified MonoBehaviour and attach it to the GameObject:
MyMonoBehaviour myMonoBehaviour = gameObject.AddComponent<MyMonoBehaviour>();
Step 3: Use ScriptableObject Instead
If you do not need to attach your class to a GameObject, consider using ScriptableObject instead of MonoBehaviour. ScriptableObjects are similar to MonoBehaviours, but they do not need to be attached to GameObjects and can be created using the ‘new’ keyword.
public class MyScriptableObject : ScriptableObject
{
// Your code here
}
// Usage:
MyScriptableObject myScriptableObject = ScriptableObject.CreateInstance<MyScriptableObject>();
FAQs
1. Why can’t I use the ‘new’ keyword to create a MonoBehaviour?
Using the ‘new’ keyword to create a MonoBehaviour does not properly initialize the object, resulting in unexpected behavior or errors. Unity explicitly disallows the use of the ‘new’ keyword to prevent these issues.
2. What is the difference between MonoBehaviour and ScriptableObject?
MonoBehaviour is a base class for scripts that need to be attached to GameObjects, while ScriptableObject is a base class for scripts that do not need to be attached to GameObjects. Both are derived from UnityEngine.Object.
3. Can I use the ‘new’ keyword to create a ScriptableObject?
No, you should use ScriptableObject.CreateInstance<T>
to create an instance of a ScriptableObject. While the ‘new’ keyword can be used, it is not recommended as it may not properly initialize the object.
4. How do I create a MonoBehaviour without using the ‘new’ keyword?
Use the GetComponent<T>
method to find and return an existing instance of a MonoBehaviour on a GameObject, or use the AddComponent<T>
method to create a new instance and attach it to a GameObject.
5. Can I use the ‘new’ keyword to create a class that does not inherit from MonoBehaviour or ScriptableObject?
Yes, you can use the ‘new’ keyword to create instances of classes that do not inherit from MonoBehaviour or ScriptableObject.
- Unity — MonoBehaviour Documentation
- Unity — ScriptableObject Documentation
- Unity — GetComponent Method
- Unity — AddComponent Method
Unity Fast Tutorial: ошибка = невозможно добавить скрипт
Привет всем, я работал над своей первой игрой, и внезапно я получил эту ошибку и не могу запустить игру. Я уже установил новую версию unity, но она не исчезла. Я вижу, что это может быть вызвано несколькими причинами, но пока не повезло. Вы знаете наиболее вероятные причины и как их исправить?
Когда я выбираю сценарии, единственная ошибка, в которой я не получаю эту ошибку, — следующая:
using UnityEngine; using Assets.Code.States; using Assets.Code.Interfaces; public class StateManager : MonoBehaviour { private IStateBase activeState; void Start () { activeState = new BeginState (this); } void Update () { if (activeState != null) activeState.StateUpdate(); } void OnGUI() { if (activeState != null) activeState.ShowIt (); } public void SwitchState(IStateBase newState) { activeState = newState; } }
Но, например, здесь я получаю ошибку:
using UnityEngine; using Assets.Code.Interfaces; namespace Assets.Code.States { public class BeginState : IStateBase { private StateManager manager; public BeginState (StateManager managerRef) { manager = managerRef; Debug.Log ('Constructing BeginState'); Time.timeScale = 0; } public void StateUpdate() { if (Input.GetKeyUp(KeyCode.Space)) manager.SwitchState(new PlayState (manager)); } public void ShowIt() { if (GUI.Button (new Rect (10, 10, 150, 100), 'Press to Play')) { Time.timeScale = 1; manager.SwitchState (new PlayState (manager)); } } } }
И так далее со всеми остальными сценариями.
Я уже установил более новую версию unity3d, удалил антивирус, проверил имена файлов, но ошибка не исчезла. У меня также нет класса в пространстве имен ..
- Если какой-либо из ответов сработал для вас, было бы полезно для других, если вы примете этот ответ. Если нет, не стесняйтесь комментировать полученные ответы или обновлять свой вопрос.
Убедитесь, что ваш файл сценария назван точно так же, как класс MonoBehaviour, который он содержит.
MyScript.cs:
using UnityEngine; public class MyScript : MonoBehaviour { }
Кроме того, если ваш файл сценария содержит вспомогательные классы, убедитесь, что они размещены внизу файла, а не над подклассом MonoBehaviour.
Кроме того, Unity иногда будет иметь проблемы, когда ваши классы MonoBehaviour находятся в пространствах имен. Я не знаю, когда именно это происходит, это просто время от времени. Удаление класса из пространства имен устраняет ошибку.
- BeginState не является сценарием MonoBehaviour, поэтому сообщение «в файле нет сценариев MonoBehaviour» является допустимым. Это действительно ошибка или просто информация? Когда возникает ошибка?
- Я понимаю о чем вы, но игры не запускаются, при нажатии play ничего не происходит
- Для этого должна быть другая причина. Убедитесь, что вы очистили консоль. Если ошибки по-прежнему отображаются, значит, вам необходимо исправить их. Если их нет, можно будет начать. Если ничего не происходит, возникают проблемы во время выполнения, которые могут вызывать или не вызывать сообщения об ошибках. Тогда вам придется отлаживать.
- Если у вас нет ошибок и ничего не происходит, я бы посоветовал вам подключить отладчик, установить точки останова и посмотреть, что именно не работает должным образом.
Tweet
Share
Link
Plus
Send
Send
Pin