Skip to content

Canon Weapon

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Canon : Projectile
{
    public float damage;

    protected override void Hit(IDamageable damageable)
    {
        damageable.Damage(damage);
        base.Hit(damageable);
    }
}

public class CanonFactory : ProjectileFactory
{
    public float damage;
    public float speed;
    public LayerMask hitMask;
    public float lifetime;
    public int ammo;


    public override Projectile CreateProjectile(IWeaponUser user)
    {
        GameObject bulletObj = new("Projectile Canon");
        bulletObj.transform.position = user.Position;

        Rectangle rectangle = new("Large Projectile");

        Transform rectangleTransform = rectangle.GameObject.transform;
        rectangleTransform.parent = bulletObj.transform;
        rectangleTransform.localPosition = Vector3.zero;
        rectangleTransform.localScale = Vector3.one * 0.5f;
        rectangleTransform.Rotate(Vector3.forward, 45f);
        rectangle.CreateCollider(bulletObj, true);

        Vector2 aimDirection = user.AimDirection; // Caching expensive get

        Canon bullet = bulletObj.AddComponent<Canon>();
        bulletObj.AddComponent<Rigidbody2D>().velocity = aimDirection * speed;
        bullet.transform.up = aimDirection;
        bullet.damage = damage;
        bullet.hitMask = hitMask;
        bullet.lifetime = lifetime;

        return bullet;
    }
}

Input Bindings changes

public KeyCode shoot, shootSecondary, shootThird;

Creating third shooting method

 player._bindings = new InputBindings(); 
    }

        BulletFactory mainFactory = new()
        {
            damage = 1f,
            speed = 20f,
            hitMask = IWeaponUser.EnemyMask,
            lifetime = 10f
        };
        player._weapon = new BasicWeapon(mainFactory, 0.2f);

        // Rocket Launcher Weapon
        // RocketFactory secondaryFactory = new()
        // {
        //     damage = 1f,
        //     speed = 20f,
        //     hitMask = IWeaponUser.EnemyMask,
        //     lifetime = 0.9f,
        //     ammo = 20
        // };
        // player._secondaryWeapon = new AmmoWeapon(secondaryFactory, 0.2f, 20);

        // Canon Weapon   
        CanonFactory secondaryFactory = new()
        {
            damage = 5f,
            speed = 15f,
            hitMask = IWeaponUser.EnemyMask,
            lifetime = 5f,
            ammo = 20
        };
        player._secondaryWeapon = new AmmoWeapon(secondaryFactory, 0.5f, 20);

        // Machine Gun weapon
        MachineGunFactory thirdFactory = new()
        {
            damage = 1f,
            speed = 20f,
            hitMask = IWeaponUser.EnemyMask,
            lifetime = 3f,
            // Ammo doesnt work?
            ammo = 20
        };
        player._thirdWeapon = new AmmoWeapon(thirdFactory, 0.1f, 50);

        player._maxHealth = 5f;
        HUD.HealthBar.Max = player._maxHealth;
        player.Health = player._maxHealth;
        HUD.HealthBar.ForceUpdate();

        return player;
    }

    private Weapon _weapon, _secondaryWeapon, _thirdWeapon;

    private Rigidbody2D _rigidbody;
    private Camera _camera;

    private float _movementSpeed = 6f;
    private Vector2 _moveInput;
    private Vector2 _aimInput;
    private InputBindings _bindings;

    private List<MetricsData> _data = new();

    private float _maxHealth;
    private float _health;

    public float Health
    {
        get => _health;
        set
        {
            _health = Mathf.Min(_maxHealth, value); // Health can't exceed max health
            HUD.HealthBar.Value = _health;
            if (_health <= 0)
                Debug.Log("Dead");
        }
    }


    private void Update()
    {
        _moveInput = GetMoveInput();
        _aimInput = _camera.ScreenToWorldPoint(Input.mousePosition);

        transform.up = _aimInput - (Vector2)transform.position;

        if (Input.GetKey(_bindings.shoot))
        {
            _weapon.TryFire(this);
        }

        if (Input.GetKey(_bindings.shootSecondary))
        {
            _secondaryWeapon.TryFire(this);
        }

        // Created temporary third weapon (shoot with mousewheel)
        if (Input.GetKey(_bindings.shootThird))
        {
            _thirdWeapon.TryFire(this);
        }
    }

Last update: May 23, 2023