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
и другие. , вы все равно должны сделать это правильно, как указано в начале этого ответа.
Я не использовал VB.NET начиная с перемещения в C# 3.0, но кажется, что это могла быть проблема вывода типа. Ошибка немного нечетна, так как Список реализует IList, таким образом, присвоение должно работать. Можно сказать "p. Идентификатор = 123" для лямбды и вещей, кажется, работает.
Для кого-либо еще заинтересованного изучением его, вот код, который можно вставить в новый проект консоли VB.NET продемонстрировать эту проблему:
Module Module1
Sub Main()
End Sub
End Module
Class AccountGroup
Public parent_id As Integer
Public id As Integer
Public sub_account_groups As List(Of AccountGroup)
End Class
Class AccountRepository
Private _repository As AccountRepository
Public Function GetAccountGroups() As IList(Of AccountGroup)
Dim raw_account_groups As IList(Of AccountGroup)
raw_account_groups = _repository.GetAccountGroups().ToList()
Dim parents = (From ag In raw_account_groups _
Where ag.parent_id = 0 _
Select ag).ToList()
parents(0).sub_account_groups = (From sag In raw_account_groups _
Where sag.parent_id = 0 _
Select sag).ToList()
Dim sql_func As Func(Of AccountGroup, List(Of AccountGroup)) = Function(p) _
(From sag In raw_account_groups _
Where sag.parent_id = p.id _
Select sag).ToList()
parents.ForEach(Function(p) p.sub_account_groups = sql_func(p))
Return parents
End Function
End Class
Принятый здесь ответ, вероятно, неверен из-за вашего кода. chyne дал верную подсказку: лямбда-выражения в VB всегда имеют возвращаемые значения (в отличие от C #), лямбда-выражения операторов вводятся в следующей версии.
Между тем, вы просто не можете использовать этот код в VB. Вместо этого используйте обычный цикл:
For Each p In parents
p.sub_account_groups = sql_func(p)
Next
Следующая версия VB (доступная со вчерашнего дня в виде бета-версии) позволила бы написать следующий код:
parents.ForEach(Sub (p) p.sub_account_groups = sql_func(p))
Lambda в VB.Net должны возвращать значение, поэтому ваш знак равенства ('=') интерпретируется как сравнение (так что лямбда возвращает логическое значение), а не присваивание.
Думаю, ag.parent_id = 0
должно быть Где ag.parent_id == 0
?
Используйте Sub для оператора присваивания:
parents.ForEach(Sub(p) p.sub_account_groups = sql_func(p))