Лучшее решение:
function getViewportSize(w) {
var w = w || window;
if(w.innerWidth != null) return {w:w.innerWidth, h:w.innerHeight};
var d = w.document;
if (document.compatMode == "CSS1Compat") {
return {
w: d.documentElement.clientWidth,
h: d.documentElement.clientHeight
};
}
return { w: d.body.clientWidth, h: d.body.clientWidth };
}
function isViewportVisible(e) {
var box = e.getBoundingClientRect();
var height = box.height || (box.bottom - box.top);
var width = box.width || (box.right - box.left);
var viewport = getViewportSize();
if(!height || !width) return false;
if(box.top > viewport.h || box.bottom < 0) return false;
if(box.right < 0 || box.left > viewport.w) return false;
return true;
}
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
и другие. , вы все равно должны сделать это правильно, как указано в начале этого ответа.
Просто следите за тем, как я это сделал и почему:
Rule
из MonoBehaviour
, чтобы избежать отслеживания создания и удаления объектов gameObjects, которая оказалась болью. Invoke
не существует в родовых классах, я заменил его отражением, как описано здесь здесь