При каких обстоятельствах системный процесс (PID 4) сохраняет дескриптор открытого файла?

public class Rule : MonoBehaviour{}
Rule rule2 = new Rule();

Вы не можете использовать ключевое слово new для создания нового экземпляра, если вы наследуете его из MonoBehaviour.

Вы должны получить исключение, говорит :

Вы пытаетесь создать MonoBehaviour, используя ключевое слово 'new'. Это запрещено. MonoBehaviours можно добавлять только с помощью AddComponent (). Кроме того, ваш скрипт может наследовать от ScriptableObject или вообще никакого базового класса

. Ваш код работал бы, если у вас public class Rule {}, но у вас есть public class Rule : MonoBehaviour {}.

Создание нового экземпляра класса, полученного из MonoBehaviour:

Пример класса:

public class Rule : MonoBehaviour
{
    public Rule(int i)
    {

    }
}

Если вы наследуете MonoBehaviour, вы должны либо используйте GameObject.AddComponent или Instantiate для создания нового экземпляра.

Rule rule2 = null;
void Start()
{
  rule2 = gameObject.AddComponent<Rule>();
}

ИЛИ

public Rule rulePrefab;
Rule rule2;
void Start()
{
    rule2 = Instantiate(rulePrefab) as Rule;
}

Если скрипт Rule уже существуют и прикреплены к GameObject, вам не нужно создавать / добавлять / создавать новые экземпляры этого сценария. Просто используйте функцию GetComponent, чтобы получить экземпляр скрипта из GameObject, к которому он присоединен.

Rule rule2;
void Start()
{
    rule2 = GameObject.Find("NameObjectScriptIsAttachedTo").GetComponent<Rule>();
}

Вы заметите, что вы не можете использовать параметр в конструкторе, когда вы выводите свой скрипт из MonoBehaviour .



Создание нового экземпляра класса, который НЕ выводится из MonoBehaviour:

Пример класса: (Обратите внимание, что он не является результатом " MonoBehaviour "

public class Rule
{
    public Rule(int i)
    {

    }
}

Если вы не наследуете от MonoBehaviour, вы должны использовать ключевое слово new для создания нового экземпляра. Теперь вы можете использовать параметр в конструкторе, если вы хотите.

Rule rule2 = null;

void Start()
{
    rule2 = new Rule(3);
}

EDIT:

В последней версии Unity создается новый экземпляр скрипта, который наследует от MonoBehaviour с помощью new может не дать вам ошибку и не может быть null слишком , но все функции обратного вызова не будут выполняться . К ним относятся функции Awake, Start, Update и другие. , вы все равно должны сделать это правильно, как указано в начале этого ответа.

27
задан Daniel Rikowski 18 August 2009 в 12:20
поделиться

2 ответа

Для меня это звучит как проблема уровня драйвера с дырявым дескриптором.

Если вы используете антивирусный пакет, попробуйте выполнить обновление, отключить (временно!) Или переключиться на другой бренд.

7
ответ дан 28 November 2019 в 04:16
поделиться

Ваш сервер настроен на периодическое резервное копирование файлов?

Если да, то выполняется ли резервное копирование как система, возможно, запрашивая заблокированный файл при возникновении конфликта?

1
ответ дан 28 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: