Для того, что говорит доктор: «OnTriggerStay вызывается один раз за обновление физики для каждого другого Коллайдера, который касается триггера». Это означает, что ваш код:
if (otherCollider.tag == "Desk")
{
collidingWithDesk = true;
transform.Translate(0, 0, 0);
anim.Play("enemyHit");
StartCoroutine(enemyIsAttacking());
}
будет вызываться при каждом обновлении, а затем приостанавливаться на 5 секунд из-за yield return new WaitForSeconds(5f);
. Вы должны использовать OnColliderEnter, иначе может быть лучше использовать OnTriggerEnter, потому что этот будет звонил один раз. Затем измените значение внутри вызова WaitForSeconds на 1, если вы хотите, чтобы это происходило один раз в секунду.
Также, как указано в Draco18s, ваша доходность ничего не ждет. Вы должны сделать что-то вроде этого:
IEnumerator enemyIsAttacking()
{
var deskHealth = Desk.GetComponent<DeskHealth>();
while(collidingWithDesk)
{
deskHealth.DealDamageToDesk(damageDealtToDesk);
yield return new WaitForSeconds(1f);
}
}
void OnTriggerExit(Collider otherCollider)
{
if (otherCollider.tag == "Desk")
{
collidingWithDesk = false;
// rest of your code
}
}
& версия представляет ссылку, в то время как * версия представляет указатель. Разница слишком велика для типичного поста SO. Я предлагаю вам начать с C ++ FAQ
http://www.parashift.com/c++-faq-lite/references.html
Я обычно не люблю отвечать на посты с надписью «вы должны использовать Google " ответ. Однако это одна тема, которую я настоятельно советую вам Google. В частности, Google "c ++ указатели против ссылок". По этой теме доступно огромное количество информации, и обсуждения на этих страницах превзойдут все, что мы напишем здесь.
Класс * может указывать на любой объект класса или ни на один.
A Класс & всегда указывает на ровно один объект класса и никогда не может указывать на другой объект.
Кроме того, я считаю, что Бьярне является членом группы людей, которые утверждают, что массивы в C разбиты за пределы ремонт, "класс * может указывать на весь массив ding-dang объектов класса, расположенных один за другим в памяти, и в C нет абсолютно никакого способа определить, указывает ли класс * на один или много.
* является указателем, а & является ссылкой. Разница между ними заключается в том, что указатель является областью памяти, на которую необходимо разыменовать, например. с помощью оператора -> для того, чтобы его «видели» как экземпляр класса. Вместо этого ссылка - это «псевдоним», просто альтернативное имя для того же экземпляра класса. Вам не нужно использовать оператор -> со ссылкой. Вы используете оператор точки.
Лично я редко использовал ссылки, в основном, когда у меня был объект значения, который я выделил в стеке. Оператор new всегда возвращает указатель, который вы затем должны разыменовать. Кроме того, одна из самых проблемных проблем ссылок - то, что вы не можете установить их в NULL. В некоторых случаях удобно иметь функцию, которая принимает либо указатель объекта, либо NULL.
Другое отличие состоит в том, что ссылочные переменные должны быть инициализированы. Вы не можете создать ссылочную переменную, как показано в примере кода. Это приведет к ошибке компилятора.
One additional tip that I would offer is the following:
Use references when you can, pointers when you have to. If the object is guaranteed to exist, you should probably use a reference. If it is not, then you probably have to use a pointer.
One additional advantage is that references remove ambiguity on ownership. As soon as a maintenance programmer sees a pointer, they'll start to wonder if they should delete it.
Check this example out:
// Wrapper class using a reference because the wrapped object always exists class Wrapper { public: // If the wrapped is guaranteed to exist at creation, do it this way Wrapper(Wrapped& wrapped):_wrapped(wrapped) { /* empty */ } // put extra methods here. int getWrappedValue() const { return _wrapped.getValue(); } private: Wrapped& _wrapped; // This object always exists and is valid }; // Wrapper class written to support a possibly non-existent wrapped object. class Wrapper { public: Wrapper(Wrapped* wrapped = 0):_wrapped(wrapped) { /* empty */ void setWrappee(WRappee* wrapped) { _wrapped = wrapped; } int getWrappedValue() const; // Not making inline -- more complex private: Wrapped* _wrapped; // Always check pointer before use }; int Wrapper::getWrappedValue() const { if (_wrapped) { return _wrapped->getValue(); } else { return -1; // NOTE, this is a contrived example -- not getting into exceptions } }
Как уже говорилось, вы должны гуглить, но во избежание недоразумений:
Думайте о Ссылке как о сокращении назначенного ему термина.
Ссылка (&) - это то же самое, что указатель (*), за исключением того, что компилятор C ++ гарантирует, что он не быть нулевым. Тем не менее, он все еще может быть висящим указателем (переменная-указатель, которая не имеет ссылки, так что она является мусором и недопустима для любого использования).