Урок супер, правда, это лучшее что я видел, пул не легкая штука, но ты всё очень понятно объясняешь. Огромное тебе спасибо
@lakostyali25832 жыл бұрын
У объекта Player в дочернем объекте StartFire(этот объект мы указываем Player в скрипт Weapon в строчку BulletPosition) и весит скрипт Weapon. На объекте Pool скрипт BulletPool. На префабе пули скрипт Bullet. Скрипт Shooting никуда не накидываем, т.к. мы только наследуем Weapon от него.
@ФаридЮсубов-с8ф3 жыл бұрын
Вау, отличные туториалы, так ещё и с объяснением, и видно что автор разбирается в том, что говорит
@Serhii_GDL3 жыл бұрын
Спасибо за комментарий и поддержку!
@GoodFilms90 Жыл бұрын
Приветствую. Заинтересовала тема пула пуль. Посмотрел в инете еще парочку реализаций (сильно не копал), и все делают через список (List). А если сделать пул через очередь (Queue)? Реализация как по мне проще, но тут вопрос в производительности, неужели список будет быстрее, с учетом того, что для каждого выстрела нужно его перебирать в цикле для поиска свободной пульки?
@Serhii_GDL Жыл бұрын
Реализация через список - это как "классика" так и уже устаревшее решение. Очередь (взяли первый элемент) явно удобнее в использовании по сравнению со списком (перебираем список в поиске свободного элемента). На текущий момент Unity предлагает встроенное решение пула, например вот это на основе стека - docs.unity3d.com/ScriptReference/Pool.ObjectPool_1.html Последнее время пользуюсь этим решением!
@maxmartin5011 Жыл бұрын
как сделать чтоб пуля летела просто в сторону текущего направления джойстика на таче, (например, если передвижение игрока вправо, то пуля вылетает вправо, и так во все 360 сторон)?
@Serhii_GDL Жыл бұрын
В следующей серии реализована стрельба в сторону под небольшим углом. У пули центральная точка смещена в самый низ объекта, так объект вращается вокруг этой точки. Таким образом поворачивая пулю на нужный угол задаём нужное направление. Если вы написали или используете ассет джойстик, то можно из него получить вектор направления для пули.
@lakostyali25832 жыл бұрын
У меня стрельба реализована через кнопку "E"
@fastlearning64022 жыл бұрын
Получил ошибку, что при запуске, пули в иерархии(в pool) не активны, из-за чего в логах вижу, что получаю null. Не могли бы подсказать, где я мог ошибиться?
@Serhii_GDL2 жыл бұрын
Трудно отвечать на такие вопросы! Могу посоветовать пересмотреть видео, может что-то пропустил или зайти на гит(ссылка в описании канала) и свериться с моим кодом.
@Андрей-с8п8в2 жыл бұрын
Такаю же ошибку получил. Причем с начало unty в симуляторе стрельба работает. а на смартфоне в игре пули не появлялись. Иногда unyty ругалась что в пулу null. Попробуй в базовом классе _bulletPool инициализировать по раньше не в Starte а в Awake. Мне помогло.
Чтобы исключить проверку на null в скрипт пул нужно добавить создание объекта(чтоб пул сам создал необходимый объект и вернул его), если нет свободных. Я вроде в дальнейшем это добавил. Уже не помню, давно это было. 😁
@lakostyali25832 жыл бұрын
BulletsPool: private readonly List _bullets = new List(); public void AddBullets(GameObject _prefabBullet ,int count) { for(int i=0; i < count; i++) { var bullet = Instantiate(_prefabBullet, transform); bullet.SetActive(false); _bullets.Add(bullet); } } public GameObject Shot() { for(int i =0; i
@Serhii_GDL2 жыл бұрын
Метод Shot здесь некорректно (название метода), этот метод возвращает неактивный объект и должен называться соответственно - Get**.
В общем допустимо весь код пули написать в одном скрипте, но я предпочитаю разделять по функционалу. И тоже замечание по методу ReturnToPool. Данный метод не возвращает объект в пул, а переводит объект в начальное состояние. Если бы объект извлекался из пула (т.е. удалялся из списка), тогда нужно было бы его вернуть после использования.
@lakostyali25832 жыл бұрын
Shooting: public GameObject _prefabBullet; private WaitForSeconds _wait; [SerializeField] private int _bulletsCount = 20; public BulletsPool _bulletsPool; private void Start() { _bulletsPool = FindObjectOfType(); _bulletsPool.AddBullets(_prefabBullet, _bulletsCount); _wait = new WaitForSeconds(1f); } private void Update() { if (Input.GetKeyDown(KeyCode.E)) { Shot(); } } protected abstract void Shot();
@Serhii_GDL2 жыл бұрын
Мысль интересная, но все орудия унаследуют Update и будут выполнят его ожидая нажатие клавиши, т.е. 5-ть орудий 5-ть Update-ов, тут лучше использовать событие.