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
и другие. , вы все равно должны сделать это правильно, как указано в начале этого ответа.
Существует различие между компиляцией и предназначением.
При компиляции кода с (например), компилятор C# 3.0 будет, вероятно, стимулировать Вас на производительности (очень мало один так или иначе), поскольку некоторая оптимизация для сгенерированного кода IL, возможно, была включена. Это также позволяет Вам использовать некоторые новые функции как автоматические свойства или лямбда-выражения.
Быть предназначением для данной платформы гарантирует Ваши сборки для той платформы (и последующее поколение) и перестанет работать, если Вы будете нацелены для 2,0 и будете пользоваться 3,5 библиотеками. Никакие повышения производительности не будут непосредственно связаны со что если Ваша замена классом от одной платформы с другим "самым быстрым" классом. Например, предназначение для.NET 1.1 не позволит Вам использовать дженерики, и поэтому необходимо будет использовать ArrayList, который значительно медленнее, чем Список (из-за упаковки и распаковывания).
Существует две вещи помнить в отношении.NET 2.0 и.NET 3.5.
Я не нашел никого. Очевидный недостаток, если Вам не нужны 3,5 определенных функции, то, что 3,5 кодовых базы моложе и поэтому возможны, хотя вряд ли, что существует некоторая ошибка, скрывающаяся вокруг.
Нет никакого преимущества для компиляции в 3,5 платформы, если Вы не используете классов от той версии платформы.
Я предполагаю, что необходимо означать быть нацеленными на.NET 3,5 платформы для компиляции? Раз так затем, поскольку другие сказали, что я не полагаю, что Вы будете видеть много различия.
Однако, если Вы говорите об использовании обновленных компиляторов затем существуют различные изменения и изменения повреждения, описанные и для C# и для VB в следующих ссылках:
Я полагаю, что другой компилятор поставлется с каждой версией Visual Studio. Например, в случае C# 2,0 компилятора, поставленные с Visual Studio 2005 и C# 3.0, поставленный с Visual Studio 2008. В зависимости от которой версии Visual Studio Вы используете Вас, заканчиваются с другим компилятором.
Предназначение для платформы относится к конкретно, для какой версии платформы Вы хотите быть нацеленными во время процесса компиляции; предназначение для платформ является новой возможностью Visual Studio 2008. Например, я мог иметь решение, открытое в Visual Studio 2008, и нацелен на v2.0 .NET. Результат состоял бы в том, что у меня не будет ни одной из 3,0 или 3,5 функций .NET доступной мне во время той компиляции, например, WPF.
3.5 имеет классы, который 2.0 не делает. Func <...>, например. Если Вы стремитесь 2.0, Вы не можете использовать их.
Если Ваш блок.NET будет предназначаться для.NET 3.5, то получающееся приложение будет искать и требовать.NET 3,5 библиотеки, и это - это. Эти библиотеки идут многочисленный дополнительный классифицируемый не найденный в.NET 2,0 платформы, так, чтобы было бы преимущество для предназначения для тех библиотек.
Если Вы однако скомпилируете код C# с компилятором C# 3.0, поставлющимся с, например, Visual Studio 2008 и удовлетворенный для.NET 3.5, но иметь Вашу цель блока.NET 2.0, то Вам все еще только будет нужна регулярная.NET, 2,0 библиотеки, и несмотря на это на самом деле используют определенную.NET 3,5 функции компилятора, поскольку много тех функций только используют.NET 2,0 кода в конце. Читайте больше об этом здесь: http://weblogs.asp.net/shahar/archive/2008/01/23/use-c-3-features-from-c-2-and-net-2-0-code.aspx