Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.
В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:
rb = GetComponent<Rigidbody>();
. Эта строка кода работает лучше всего под ваши функции Start()
или Awake()
. rb = AddComponent<RigidBody>();
Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))]
над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!
Простым способом создания круговой ссылки является наличие объекта, который ссылается на себя в свойстве:
function Foo() {
this.abc = "Hello";
this.circular = this;
}
var foo = new Foo();
alert(foo.circular.circular.circular.circular.circular.abc);
Здесь объект foo
содержит ссылку на себя.
С закрытием это обычно более неявное, просто имея круговую ссылку в области видимости, а не как явное свойство некоторого объекта:
var circular;
circular = function(arg) {
if (arg) {
alert(arg);
}
else {
// refers to the |circular| variable, and by that to itself.
circular("No argument");
}
}
circular("hello");
circular();
Здесь функция, сохраненная в circular
, относится к circular
и, тем самым, к себе. Он неявно содержит ссылку на себя, создавая круговую ссылку. Даже если circular
теперь выходит за пределы области действия, он по-прежнему ссылается на область функций. Простые сборщики мусора не распознают этот цикл и не собирают функцию.
Или даже проще, массив «содержащий» сам. См. Пример:
var arr = [];
arr[0] = arr;
Или используя ES6:
class Circular {
constructor() {
this.value = "Hello World";
this.self = this;
}
}
circular = new Circular();
Вероятно, самый короткий способ определить циклический объект.
a = {}; a.a = a;
window.onload = function() { hookup(document.getElementById('menu')); function hookup(elem) { elem.attachEvent( "onmouseover", mouse); function mouse() { } } }
Как вы можете видеть, обработчик вложен в attacher, что означает, что он закрыт над областью вызова.
function circular(arg){
var count = 0;
function next(arg){
count++;
if(count > 10) return;
if(arg){
console.log('hava arg: ' + arg);
next();
}else{
console.log('no arg');
next('add');
}
}
next();
}
circular();
Циркуляр и с закрытием.
var b = [];
var a = [];
a[0] = b;
b[0] = a;
Печать a
или b
вернет Circular
.
Вы можете сделать:
window.window...window
var circle = {}; circle.circle = circle;
var circle = []; circle[0] = circle; or circle.push(circle)
function Circle(){this.self = this}; var circle = new Circle()