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
и другие. , вы все равно должны сделать это правильно, как указано в начале этого ответа.
Вы потребуете помощи и большого доверия от Вашего системного администратора. Обычные пользователи не могут выполнить исполняемый файл своего выбора от имени на других пользователях, период.
Она может добавить Ваше приложение на /etc/sudoers
с надлежащими настройками и Вы сможете выполнить его как с sudo -u nobody
. Это будет работать на оба сценария и двоичные исполняемые файлы.
Другая опция состоит в том, что она сделает chown nobody
и chmod +s
на Вашем двоичном исполняемом файле и Вы сможете выполнить его непосредственно. Эта задача должна быть повторена каждый раз Ваши исполняемые изменения.
Это могло также работать на сценарии при создании крошечного исполняемого файла помощника, который просто делает exec("/home/you/bin/your-application")
. Этот исполняемый файл не может быть сделан suid-никем (см. выше), и можно свободно изменить your-application
.
Насколько я знаю, Вы не можете, если Вы не корень или имеете sudo, настроенный, чтобы позволить Вам переключать пользователей. Или, у Вас может быть свой исполняемый файл, имеют suid набор битов на нем и имеют принадлежавший никому. Но это требует корневого доступа также.
'Никто' пользователь не является все еще пользователем. Я не уверен, что Ваше обоснование находится в наличии прогона программы как никто, это не будет добавлением никакой дополнительной безопасности. Вы, более вероятно, откроете себя для других проблем.
Я следовал бы рекомендации squadette использования вспомогательного приложения.
calife
альтернатива sudo
.
Calife является небольшой программой, которые позволяют системному администратору UNIX стать корнем (или другой пользователь) на его машинах, не давая пароль root, но его собственное.