Из Явы в Шарп
dostalition Дата: Ср, 23 Янв 2013, 13:07 | Сообщение # 1
Сообщений: 155
Награды:
0
Репутация:
9
Статус: Offline
Не могу вставить строчку с задержкой времени, напрмер, на 2сек. в шарп-скрипт - Юня выдаёт ошибку. Написал другой простейший скрипт на Яве для примера var box : GameObject; function OnTriggerEnter() { yield WaitForSeconds(3); Destroy(box); } - всё работает, как надо и ошибок нет, а тоже самое на Шарпе using UnityEngine; using System.Collections; public class TEST_time : MonoBehaviour { public GameObject box ; void OnTriggerEnter() { yield return new WaitForSeconds(3); Destroy(box); } } - вылазит ошибка .... Подскажите, будьте добры, в чём дело ?Добавлено (23.01.2013, 13:07) --------------------------------------------- Вопрос решен Просто нужно вместо void ставить IEnumerator
Hunjeth Дата: Ср, 23 Янв 2013, 13:31 | Сообщение # 2
Сообщений: 354
Награды:
1
Репутация:
112
Статус: Offline
может Destroy(box, 3); надо писать IEnumerator в с# IEnumerator OnTriggerEnter()
Сообщение отредактировал Hunjeth - Ср, 23 Янв 2013, 13:38
Сообщение может Destroy(box, 3); надо писать IEnumerator в с# IEnumerator OnTriggerEnter() Автор - Hunjeth Дата добавления - 23 Янв 2013 в 13:31
dostalition Дата: Ср, 23 Янв 2013, 14:07 | Сообщение # 3
Сообщений: 155
Награды:
0
Репутация:
9
Статус: Offline
Вот скрипт в котором Я хочу сделать задержки по времени using UnityEngine; using System.Collections; public class ZRENIE : MonoBehaviour { public bool VIDIT; public Transform target; void OnTriggerStay(Collider other) { if (other.gameObject.name != "Player1") return; var layerMask = 1 << 9 | 1 << 8; if (other.gameObject.name == "Player1" && !Physics.Linecast (transform.position, target.position, layerMask)) { VIDIT = true; } else{ VIDIT = false;} } IEnumerator OnTriggerExit(Collider other) { if (other.gameObject.name == "Player1") yield return new WaitForSeconds(3); VIDIT = false; } } Код
Когда , как в этом варианте, задержка идёт только после выхода из триггера, то всё работает. А когда ставлю задержку и в первой функции, как здесь using UnityEngine; using System.Collections; public class ZRENIE : MonoBehaviour { public bool VIDIT; public Transform target; IEnumerator OnTriggerStay(Collider other) { if (other.gameObject.name != "Player1") return; var layerMask = 1 << 9 | 1 << 8; if (other.gameObject.name == "Player1" && !Physics.Linecast (transform.position, target.position, layerMask)) { VIDIT = true; } else{ yield return new WaitForSeconds(3); VIDIT = false;} } IEnumerator OnTriggerExit(Collider other) { if (other.gameObject.name == "Player1") yield return new WaitForSeconds(3); VIDIT = false; } }
то ошибка ругается на RETURN ... Подскажите, что не так теперь с первой функцией ?
Сообщение Вот скрипт в котором Я хочу сделать задержки по времени using UnityEngine; using System.Collections; public class ZRENIE : MonoBehaviour { public bool VIDIT; public Transform target; void OnTriggerStay(Collider other) { if (other.gameObject.name != "Player1") return; var layerMask = 1 << 9 | 1 << 8; if (other.gameObject.name == "Player1" && !Physics.Linecast (transform.position, target.position, layerMask)) { VIDIT = true; } else{ VIDIT = false;} } IEnumerator OnTriggerExit(Collider other) { if (other.gameObject.name == "Player1") yield return new WaitForSeconds(3); VIDIT = false; } } Код
Когда , как в этом варианте, задержка идёт только после выхода из триггера, то всё работает. А когда ставлю задержку и в первой функции, как здесь using UnityEngine; using System.Collections; public class ZRENIE : MonoBehaviour { public bool VIDIT; public Transform target; IEnumerator OnTriggerStay(Collider other) { if (other.gameObject.name != "Player1") return; var layerMask = 1 << 9 | 1 << 8; if (other.gameObject.name == "Player1" && !Physics.Linecast (transform.position, target.position, layerMask)) { VIDIT = true; } else{ yield return new WaitForSeconds(3); VIDIT = false;} } IEnumerator OnTriggerExit(Collider other) { if (other.gameObject.name == "Player1") yield return new WaitForSeconds(3); VIDIT = false; } }
то ошибка ругается на RETURN ... Подскажите, что не так теперь с первой функцией ? Автор - dostalition Дата добавления - 23 Янв 2013 в 14:07
Hunjeth Дата: Ср, 23 Янв 2013, 14:13 | Сообщение # 4
Сообщений: 354
Награды:
1
Репутация:
112
Статус: Offline
попробуй просто написать if (other.gameObject.name == "Player1") {...}
Сообщение отредактировал Hunjeth - Ср, 23 Янв 2013, 14:14
Сообщение попробуй просто написать if (other.gameObject.name == "Player1") {...} Автор - Hunjeth Дата добавления - 23 Янв 2013 в 14:13
dostalition Дата: Ср, 23 Янв 2013, 14:45 | Сообщение # 5
Сообщений: 155
Награды:
0
Репутация:
9
Статус: Offline
if (other.gameObject.name == "Player1") это в функции выхода из триггера, а проблема с функцией OnTriggerStay Там сначала идёт проверка того, кто стоит в триггере и , если это не игрок, то RETURN (дальше дело не идёт) И вот этот ретурн конфликтует как-то с IEnumerator, видимо ...
Сообщение if (other.gameObject.name == "Player1") это в функции выхода из триггера, а проблема с функцией OnTriggerStay Там сначала идёт проверка того, кто стоит в триггере и , если это не игрок, то RETURN (дальше дело не идёт) И вот этот ретурн конфликтует как-то с IEnumerator, видимо ... Автор - dostalition Дата добавления - 23 Янв 2013 в 14:45
seaman Дата: Ср, 23 Янв 2013, 16:00 | Сообщение # 6
Гуру
Сообщений: 1748
Награды:
10
Репутация:
660
Статус: Offline
Ваши сообщения читать невозможно. Неужели так сложно кнопочку нажать? В енумераторах return; использовать нельзя.
Сообщение Ваши сообщения читать невозможно. Неужели так сложно кнопочку нажать? В енумераторах return; использовать нельзя. Автор - seaman Дата добавления - 23 Янв 2013 в 16:00
dostalition Дата: Ср, 23 Янв 2013, 16:02 | Сообщение # 7
Сообщений: 155
Награды:
0
Репутация:
9
Статус: Offline
Так объясните что где нажать ...
Сообщение Так объясните что где нажать ... Автор - dostalition Дата добавления - 23 Янв 2013 в 16:02
seaman Дата: Ср, 23 Янв 2013, 16:04 | Сообщение # 8
Гуру
Сообщений: 1748
Награды:
10
Репутация:
660
Статус: Offline
А вы не видите кнопочки над формой добавления сообщения?
Сообщение А вы не видите кнопочки над формой добавления сообщения? Автор - seaman Дата добавления - 23 Янв 2013 в 16:04
dostalition Дата: Ср, 23 Янв 2013, 16:29 | Сообщение # 9
Сообщений: 155
Награды:
0
Репутация:
9
Статус: Offline
Я вижу кнопочку КОД , но не пойму после неё код вставлять , до или между двух таких ...:)
Сообщение Я вижу кнопочку КОД , но не пойму после неё код вставлять , до или между двух таких ...:) Автор - dostalition Дата добавления - 23 Янв 2013 в 16:29
seaman Дата: Ср, 23 Янв 2013, 16:35 | Сообщение # 10
Гуру
Сообщений: 1748
Награды:
10
Репутация:
660
Статус: Offline
Как же Вы на Юнити3д ру сумели код вставить? Почти на всех форумах это делается одинаково. Пишешь код, выделяешь, нажимаешь кнопку. Что тут еще можно придумать?
Сообщение Как же Вы на Юнити3д ру сумели код вставить? Почти на всех форумах это делается одинаково. Пишешь код, выделяешь, нажимаешь кнопку. Что тут еще можно придумать? Автор - seaman Дата добавления - 23 Янв 2013 в 16:35
dostalition Дата: Ср, 23 Янв 2013, 17:04 | Сообщение # 11
Сообщений: 155
Награды:
0
Репутация:
9
Статус: Offline
:))) Дело в том, что Я, за 27 лет, впервые( пару дней назад) зарегистрировался на форуме Не было до этого необходимости. Вот здесь залип и ещё на одном по Юне. Так вот на том форуме , когда Я нажимаю кнопку кода, появляется две рамки , между которыми Я и вставляю скрипт, а тут - одна, вот Я и запутался А что нужно скрипт выделять, а потом нажимать кнопку - вообще не знал НЕ ВИНИТЕ, исправлюсь :))
Сообщение :))) Дело в том, что Я, за 27 лет, впервые( пару дней назад) зарегистрировался на форуме Не было до этого необходимости. Вот здесь залип и ещё на одном по Юне. Так вот на том форуме , когда Я нажимаю кнопку кода, появляется две рамки , между которыми Я и вставляю скрипт, а тут - одна, вот Я и запутался А что нужно скрипт выделять, а потом нажимать кнопку - вообще не знал НЕ ВИНИТЕ, исправлюсь :)) Автор - dostalition Дата добавления - 23 Янв 2013 в 17:04
seaman Дата: Ср, 23 Янв 2013, 20:40 | Сообщение # 12
Гуру
Сообщений: 1748
Награды:
10
Репутация:
660
Статус: Offline
А по теме то поняли? В енумераторах return; использовать нельзя. Нужно yield return null; Это, кстати, не правило Юнити, а правило шарпа.
Сообщение А по теме то поняли? В енумераторах return; использовать нельзя. Нужно yield return null; Это, кстати, не правило Юнити, а правило шарпа. Автор - seaman Дата добавления - 23 Янв 2013 в 20:40
dostalition Дата: Ср, 23 Янв 2013, 22:50 | Сообщение # 13
Сообщений: 155
Награды:
0
Репутация:
9
Статус: Offline
Заменил RETURN на yield return null , но что-то не срабатывает всё-равно ... В итоге сделали с кентом вот так Код
using UnityEngine; using System.Collections; public class ZRENIE : MonoBehaviour { public bool VIDIT; public bool check;//показатель того, что пошел отсчёт времени после исчезновения цели public Transform target; public float time_ISCHEZ; void OnTriggerStay(Collider other) { if (other.gameObject.name != "Player1") return; var layerMask = 1 << 9 | 1 << 8; if (other.gameObject.name == "Player1" && !Physics.Linecast (transform.position, target.position, layerMask)) { VIDIT = true; check = false; } else if (!check){ //т.е. check = false time_ISCHEZ = Time.time;//записываем в time_ISCHEZ время на момент исчезновения check = true; } } void OnTriggerExit(Collider other) { if (other.gameObject.name == "Player1" && !check) time_ISCHEZ = Time.time; check = true; } public void Update () { if (check && Time.time - time_ISCHEZ > 2) { VIDIT = false; check = false; } } }
всё работает, но вариант с елд Мне больше нравился, проще как-то ... Благодарю за внимание Добавлено (23.01.2013, 22:50) --------------------------------------------- И , наконец-то, научился ПРАВИЛЬНО код тут вставлять ! :)))
Сообщение Заменил RETURN на yield return null , но что-то не срабатывает всё-равно ... В итоге сделали с кентом вот так Код
using UnityEngine; using System.Collections; public class ZRENIE : MonoBehaviour { public bool VIDIT; public bool check;//показатель того, что пошел отсчёт времени после исчезновения цели public Transform target; public float time_ISCHEZ; void OnTriggerStay(Collider other) { if (other.gameObject.name != "Player1") return; var layerMask = 1 << 9 | 1 << 8; if (other.gameObject.name == "Player1" && !Physics.Linecast (transform.position, target.position, layerMask)) { VIDIT = true; check = false; } else if (!check){ //т.е. check = false time_ISCHEZ = Time.time;//записываем в time_ISCHEZ время на момент исчезновения check = true; } } void OnTriggerExit(Collider other) { if (other.gameObject.name == "Player1" && !check) time_ISCHEZ = Time.time; check = true; } public void Update () { if (check && Time.time - time_ISCHEZ > 2) { VIDIT = false; check = false; } } }
всё работает, но вариант с елд Мне больше нравился, проще как-то ... Благодарю за внимание Добавлено (23.01.2013, 22:50) --------------------------------------------- И , наконец-то, научился ПРАВИЛЬНО код тут вставлять ! :)))
Автор - dostalition Дата добавления - 23 Янв 2013 в 22:50
Hunjeth Дата: Ср, 23 Янв 2013, 23:39 | Сообщение # 14
Сообщений: 354
Награды:
1
Репутация:
112
Статус: Offline
Код
using UnityEngine; using System.Collections; public class ZRENIE : MonoBehaviour { public bool VIDIT; public Transform target; IEnumerator OnTriggerStay(Collider other) { if (other.gameObject.name == "Player1" && Physics.Linecast(transform.position, target.position, 1<<9|1<<8) == false) { VIDIT = true; }else if (VIDIT == true) { yield return new WaitForSeconds(3); VIDIT = false; } } IEnumerator OnTriggerExit(Collider other) { if (other.gameObject.name == "Player1" && VIDIT == true) { yield return new WaitForSeconds(3); VIDIT = false; } } }
Сообщение отредактировал Hunjeth - Ср, 23 Янв 2013, 23:51
Сообщение Код
using UnityEngine; using System.Collections; public class ZRENIE : MonoBehaviour { public bool VIDIT; public Transform target; IEnumerator OnTriggerStay(Collider other) { if (other.gameObject.name == "Player1" && Physics.Linecast(transform.position, target.position, 1<<9|1<<8) == false) { VIDIT = true; }else if (VIDIT == true) { yield return new WaitForSeconds(3); VIDIT = false; } } IEnumerator OnTriggerExit(Collider other) { if (other.gameObject.name == "Player1" && VIDIT == true) { yield return new WaitForSeconds(3); VIDIT = false; } } }
Автор - Hunjeth Дата добавления - 23 Янв 2013 в 23:39
dostalition Дата: Чт, 24 Янв 2013, 00:56 | Сообщение # 15
Сообщений: 155
Награды:
0
Репутация:
9
Статус: Offline
Благодарю Попробовал, но что-то не так ... Как-то моб дёргается при беге ... Hunjeth, Я так понял, что Ты убрал это Код
if (other.gameObject.name != "Player1") return
из скрипта и поэтому возникают проблемы ...
Сообщение Благодарю Попробовал, но что-то не так ... Как-то моб дёргается при беге ... Hunjeth, Я так понял, что Ты убрал это Код
if (other.gameObject.name != "Player1") return
из скрипта и поэтому возникают проблемы ... Автор - dostalition Дата добавления - 24 Янв 2013 в 00:56
Hunjeth Дата: Чт, 24 Янв 2013, 01:09 | Сообщение # 16
Сообщений: 354
Награды:
1
Репутация:
112
Статус: Offline
да когда тип функции IEnumerator то в ней не должно быть return
Сообщение отредактировал Hunjeth - Чт, 24 Янв 2013, 01:09
Сообщение да когда тип функции IEnumerator то в ней не должно быть return Автор - Hunjeth Дата добавления - 24 Янв 2013 в 01:09