Загружаем...
год и 5 месяцев назад
Наследование в Unity на примере системы оружия


Как использовать наследование для создания системы оружия в Unity
В любой игре с боевой системой есть разные виды оружия: мечи, луки, огнестрел. Вместо того, чтобы дублировать код для каждого типа оружия, мы можем использовать наследование, чтобы создать гибкую и расширяемую систему.

Сегодня мы создадим базовый класс оружия и несколько его подклассов с разными механиками атаки.

Базовый класс Weapon
Создадим базовый класс Weapon, который будет содержать общие характеристики и методы:

using UnityEngine;

using System.Collections;

public abstract class Weapon : MonoBehaviour
{
public string weaponName;
public int damage;
public float attackCooldown;

protected bool canAttack = true;

public virtual void Attack()
{
if (canAttack)
{
Debug.Log($"{weaponName} атакует с уроном {damage}");
StartCoroutine(AttackCooldown());
}
}

private IEnumerator AttackCooldown()
{
canAttack = false;
yield return new WaitForSeconds(attackCooldown);
canAttack = true;
}
}

Этот класс определяет имя оружия, урон, перезарядку атаки и саму атаку. Теперь создадим разные виды оружия.

Ближнее оружие (MeleeWeapon)
Создадим класс для ближнего оружия, например меча:


public class MeleeWeapon : Weapon

{
public float attackRange;

public override void Attack()
{
base.Attack();
Debug.Log($"Ближняя атака мечом {weaponName} на расстоянии {attackRange}");
// Здесь можно добавить логику удара по врагу в радиусе атаки
}
}

Этот класс наследует все свойства Weapon, но дополняет их логикой ближнего боя.


Дальнобойное оружие (RangedWeapon)
Теперь создадим класс для дальнобойного оружия, например пистолета:
public class RangedWeapon : Weapon

{
public GameObject projectilePrefab;
public Transform shootPoint;

public override void Attack()
{
if (canAttack)
{
base.Attack();
GameObject projectile = Instantiate(projectilePrefab, shootPoint.position, shootPoint.rotation);
Debug.Log($"Выстрел из {weaponName}");
}
}
}


Теперь при атаке создается снаряд, который можно запрограммировать на движение и нанесение урона.

Использование системы
Добавляем оружие на персонажа:

public class Player : MonoBehaviour

{
public Weapon currentWeapon;

void Update()
{
if (Input.GetMouseButtonDown(0)) // ЛКМ - атака
{
if (currentWeapon != null)
currentWeapon.Attack();
}
}
}


Теперь можно назначать игроку разные виды оружия, и система сама будет использовать нужную механику атаки.

Использование наследования позволяет легко добавлять новые типы оружия, не дублируя код. Нужно добавить огнемет? Просто создаем Flamethrower : Weapon и переопределяем Attack().

Таким образом, мы получаем гибкую, масштабируемую и удобную систему.

Какой вид оружия вы бы добавили в свою игру?


Наверх