Стрельба игрока | Космический шутер на Unity. Часть #9

  Рет қаралды 1,177

GameDev Labyrinth

GameDev Labyrinth

Күн бұрын

Пікірлер: 21
@lakostyali2583
@lakostyali2583 2 жыл бұрын
Урок супер, правда, это лучшее что я видел, пул не легкая штука, но ты всё очень понятно объясняешь. Огромное тебе спасибо
@lakostyali2583
@lakostyali2583 2 жыл бұрын
У объекта Player в дочернем объекте StartFire(этот объект мы указываем Player в скрипт Weapon в строчку BulletPosition) и весит скрипт Weapon. На объекте Pool скрипт BulletPool. На префабе пули скрипт Bullet. Скрипт Shooting никуда не накидываем, т.к. мы только наследуем Weapon от него.
@ФаридЮсубов-с8ф
@ФаридЮсубов-с8ф 3 жыл бұрын
Вау, отличные туториалы, так ещё и с объяснением, и видно что автор разбирается в том, что говорит
@Serhii_GDL
@Serhii_GDL 3 жыл бұрын
Спасибо за комментарий и поддержку!
@GoodFilms90
@GoodFilms90 Жыл бұрын
Приветствую. Заинтересовала тема пула пуль. Посмотрел в инете еще парочку реализаций (сильно не копал), и все делают через список (List). А если сделать пул через очередь (Queue)? Реализация как по мне проще, но тут вопрос в производительности, неужели список будет быстрее, с учетом того, что для каждого выстрела нужно его перебирать в цикле для поиска свободной пульки?
@Serhii_GDL
@Serhii_GDL Жыл бұрын
Реализация через список - это как "классика" так и уже устаревшее решение. Очередь (взяли первый элемент) явно удобнее в использовании по сравнению со списком (перебираем список в поиске свободного элемента). На текущий момент Unity предлагает встроенное решение пула, например вот это на основе стека - docs.unity3d.com/ScriptReference/Pool.ObjectPool_1.html Последнее время пользуюсь этим решением!
@maxmartin5011
@maxmartin5011 Жыл бұрын
как сделать чтоб пуля летела просто в сторону текущего направления джойстика на таче, (например, если передвижение игрока вправо, то пуля вылетает вправо, и так во все 360 сторон)?
@Serhii_GDL
@Serhii_GDL Жыл бұрын
В следующей серии реализована стрельба в сторону под небольшим углом. У пули центральная точка смещена в самый низ объекта, так объект вращается вокруг этой точки. Таким образом поворачивая пулю на нужный угол задаём нужное направление. Если вы написали или используете ассет джойстик, то можно из него получить вектор направления для пули.
@lakostyali2583
@lakostyali2583 2 жыл бұрын
У меня стрельба реализована через кнопку "E"
@fastlearning6402
@fastlearning6402 2 жыл бұрын
Получил ошибку, что при запуске, пули в иерархии(в pool) не активны, из-за чего в логах вижу, что получаю null. Не могли бы подсказать, где я мог ошибиться?
@Serhii_GDL
@Serhii_GDL 2 жыл бұрын
Трудно отвечать на такие вопросы! Могу посоветовать пересмотреть видео, может что-то пропустил или зайти на гит(ссылка в описании канала) и свериться с моим кодом.
@Андрей-с8п8в
@Андрей-с8п8в 2 жыл бұрын
Такаю же ошибку получил. Причем с начало unty в симуляторе стрельба работает. а на смартфоне в игре пули не появлялись. Иногда unyty ругалась что в пулу null. Попробуй в базовом классе _bulletPool инициализировать по раньше не в Starte а в Awake. Мне помогло.
@lakostyali2583
@lakostyali2583 2 жыл бұрын
Weapon: Shooting [SerializeField] private Transform _bulletPosition; protected override void Shot() { var bullet = _bulletsPool.Shot(); if(bullet==null) { Debug.Log("!"); } else { bullet.transform.position = _bulletPosition.position; bullet.transform.Rotate(transform.rotation.eulerAngles); //разворот пули по направлению оружия bullet.SetActive(true); } }
@Serhii_GDL
@Serhii_GDL 2 жыл бұрын
Чтобы исключить проверку на null в скрипт пул нужно добавить создание объекта(чтоб пул сам создал необходимый объект и вернул его), если нет свободных. Я вроде в дальнейшем это добавил. Уже не помню, давно это было. 😁
@lakostyali2583
@lakostyali2583 2 жыл бұрын
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_GDL
@Serhii_GDL 2 жыл бұрын
Метод Shot здесь некорректно (название метода), этот метод возвращает неактивный объект и должен называться соответственно - Get**.
@lakostyali2583
@lakostyali2583 2 жыл бұрын
Bullet: public Rigidbody _rb; private float speed = 20f; private void OnCollisionEnter(Collision collision) { //Instantiate(_effectShoot, transform.position, Quaternion.identity); //Destroy(_effectShoot, 5f); ReturnToPool(); } private void FixedUpdate() { _rb.velocity = transform.forward * speed; } public void ReturnToPool() { transform.rotation = Quaternion.identity; gameObject.SetActive(false); }
@Serhii_GDL
@Serhii_GDL 2 жыл бұрын
В общем допустимо весь код пули написать в одном скрипте, но я предпочитаю разделять по функционалу. И тоже замечание по методу ReturnToPool. Данный метод не возвращает объект в пул, а переводит объект в начальное состояние. Если бы объект извлекался из пула (т.е. удалялся из списка), тогда нужно было бы его вернуть после использования.
@lakostyali2583
@lakostyali2583 2 жыл бұрын
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_GDL
@Serhii_GDL 2 жыл бұрын
Мысль интересная, но все орудия унаследуют Update и будут выполнят его ожидая нажатие клавиши, т.е. 5-ть орудий 5-ть Update-ов, тут лучше использовать событие.
@lakostyali2583
@lakostyali2583 2 жыл бұрын
@@Serhii_GDL ты прав)
Support each other🤝
00:31
ISSEI / いっせい
Рет қаралды 81 МЛН
Enceinte et en Bazard: Les Chroniques du Nettoyage ! 🚽✨
00:21
Two More French
Рет қаралды 42 МЛН
СОЗДАЛ ИГРУ ИСПОЛЬЗУЯ ТОЛЬКО ChatGPT
6:01
Robert Sergeev
Рет қаралды 186 М.
КАК СДЕЛАТЬ СТРЕЛЬБУ | UNITY 2D
4:40
Amfich
Рет қаралды 12 М.
Support each other🤝
00:31
ISSEI / いっせい
Рет қаралды 81 МЛН