2D платформер, стрельба

Стрельба для двухмерной игры, платформера. Пример, прежде всего будет интересен начинающим игроделам, впрочем, не только, так как вариант уже готовый, бери и используй. Код достаточно простой, легко отредактировать если что. Стрельба реализована не через луч, а объектами. То есть, как в обычном платформере, чтобы пули были видимы. Подойдет для игры наподобие, как Contra или для управления какой-нибудь турелью. Реализовано вращение указанного объекта по оси Z, допустим, автомата. И предусмотрено ограничение на вращения. Настраиваются такие параметры как, скорость пули и скорострельность.

2D платформер, стрельба

Для организации стрельбы в платформере, нам понадобится спрайт оружия и пули.

Итак, добавляем на сцену пустой объект, и делаем спрайт оружия дочерним к нему. В дальнейшем, чтобы скрипт работало правильно, вращать мы будем именно дочерний спрайт оружия, но не родителя. Теперь, для спрайта оружия надо еще один пустой дочерний ему объект и пододвинуть его в то место, откуда будут вылетать пули. Важно помнить, что определяющая тут ось Х, проще говоря она должна "вылетать" из дула, в этом же направление будут потом лететь пули.


Далее, на родителя модельки нашего оружия вешаем скрипт FireScript2D:

using UnityEngine;
using System.Collections;

public class FireScript2D : MonoBehaviour {

	public float speed = 10; // скорость пули
	public Rigidbody2D bullet; // префаб нашей пули
	public Transform gunPoint; // точка рождения
	public float fireRate = 1; // скорострельность

	public Transform zRotate; // объект для вращения по оси Z

	// ограничение вращения
	public float minAngle = -40;
	public float maxAngle = 40;

	private float curTimeout;
	
	void Start()
	{
	}

	void SetRotation()
	{
		Vector3 mousePosMain = Input.mousePosition;
		mousePosMain.z = Camera.main.transform.position.z; 
		Vector3 lookPos = Camera.main.ScreenToWorldPoint(mousePosMain);
		lookPos = lookPos - transform.position;
		float angle  = Mathf.Atan2(lookPos.y, lookPos.x) * Mathf.Rad2Deg;
		angle = Mathf.Clamp(angle, minAngle, maxAngle);
		zRotate.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
	}
	
	void Update()
	{
		if(Input.GetMouseButton(0))
		{
			Fire();
		}
		else
		{
			curTimeout = 100;
		}

		if(zRotate) SetRotation();
	}

	void Fire()
	{
		curTimeout += Time.deltaTime;
		if(curTimeout > fireRate)
		{
			curTimeout = 0;
			Rigidbody2D clone = Instantiate(bullet, gunPoint.position, Quaternion.identity) as Rigidbody2D;
			clone.velocity = transform.TransformDirection(gunPoint.right * speed);
			clone.transform.right = gunPoint.right;
		}
	}
}



Создадим модельку пули. Там дело на пару кликов. На спрайт пули вешаем компонент Rigidbody 2D и параметр Gravity Scale ставим на ноль, чтобы выключить гравитацию. Добавляем коллайдер и ставим галочку Is Trigger. И перетаскиваем объект в папку с префабами.


В завершении, цепляем на префаб скрипт Bullet2D:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Rigidbody2D))]

public class Bullet2D : MonoBehaviour {

	void Start()
	{
		// уничтожить объект по истечению указанного времени (секунд), если пуля никуда не попала
		Destroy(gameObject, 20);
	}
	
	void OnTriggerEnter2D(Collider2D coll)
	{
		if(!coll.isTrigger) // чтобы пуля не реагировала на триггер
		{
			switch(coll.tag)
			{
			case "Enemy_1":
				// что-то...
				break;
			case "Enemy_2":
				// что-то еще...
				break;
			}

			Destroy(gameObject);
		}
	}
}

Указываем префаб в переменной скрипта стрельбы и можно тестировать.

Кстати, у основной камеры должен быть стандартный тег MainCamera.

Скачать демо сцену:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.

Комментариев 63

Офлайн
Deadinside 11 мая 2020
а можно ли как то сделать такой же скрипт для кнопки(я имею ввиду для игр на андроид), просто уже около недели пытаюсь, что-то сделать, но никак не выходит , нашел этот скрипт , вроде бы устраивает, но есть одно но, я меня оружие приделано к спрайту игрока, но скрипт работает как надо, и все же когда я поворачиваю в другую сторону(спавнится игрок смотря в правую сторону и стреляет в правую сторону, при повороте влево он продолжает стрелять вправо)
Офлайн
Fedos 14 июня 2020
Здравствуйте. Столкнулся с такой проблемой, что когда разворачиваю оружие он стреляет в другую сторону использую transform.rotation = Quaternion.Euler(0, 180, 0); ка можно исправить это?
За ранние спасибо!
Офлайн
Fedos 14 июня 2020
Здравствуйте.Если есть время можете сделать стрельбу по джойстику для android/ios.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика