blockquote>public class Rule : MonoBehaviour{} Rule rule2 = new Rule();
Вы не можете использовать ключевое слово
new
для создания нового экземпляра, если вы наследуете его изMonoBehaviour
.Вы должны получить исключение, говорит :
Вы пытаетесь создать MonoBehaviour, используя ключевое слово 'new'. Это запрещено. MonoBehaviours можно добавлять только с помощью AddComponent (). Кроме того, ваш скрипт может наследовать от ScriptableObject или вообще никакого базового класса
blockquote>. Ваш код работал бы, если у вас
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
и другие. , вы все равно должны сделать это правильно, как указано в начале этого ответа.
Когда Вы говорите, что Диалоговое окно "Печати", я предполагаю, что Вы имеете в виду "Теперь печатающий xxx на" диалоговом окне, а не стандарт печатают диалоговое окно (избранный принтер, количество копий, и т.д.). Взятие Вашего примера выше и испытание его, который является поведением, которое я видел - "Теперь печатающий...", были отображены кратко и затем автозакрыты.
То, чем Вы пытаетесь управлять, не может быть связано с Excel, но вместо этого быть поведением уровня Windows. Если бы это управляемо, необходимо было бы a) было бы отключить его, b) было бы выполнить печать, c) было бы повторно включить. Если Ваш код перестал работать, существует риск, который это не повторно включено для других приложений.
Править: Попробуйте это решение: Как Вы предотвращаете диалоговое окно печати при использовании метода Excel PrintOut. Это, кажется, описывает точно, что Вы после.
Вызовы API в статье, связанной Kevin Haines, скрывают диалоговое окно Печати как так:
Это упрощено мягко говоря.
Вызовы API безопасны, но Вы, вероятно, захотите удостовериться, что экранное обновление для диалогового окна Печати имеет значение true, если Ваше приложение перестало работать.