79 lines
2.7 KiB
C#
79 lines
2.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Core.Extensions;
|
|
using UnityEngine;
|
|
|
|
public class Laser : PlayerAbility
|
|
{
|
|
[Header("Laser Properties")]
|
|
public float length;
|
|
public float width;
|
|
public float duration;
|
|
private float currentDuration;
|
|
[Header("Beam")]
|
|
[SerializeField] private BeamCollider beamObject;
|
|
private BeamCollider beamObjectInstance;
|
|
public float turnSpeed;
|
|
public float offset;
|
|
[Header("Weapon Properties")]
|
|
[HideInInspector] public List<Entity> enemyList = new();
|
|
public float damageDebounceTime;
|
|
private float currentDebounce;
|
|
public float damage;
|
|
private void Start()
|
|
{
|
|
CreateBeam();
|
|
}
|
|
|
|
protected override void AbilityEffects()
|
|
{
|
|
canCooldown = false;
|
|
currentDuration = duration;
|
|
currentDebounce = damageDebounceTime;
|
|
beamObjectInstance.gameObject.SetActive(true);
|
|
transform.Lookat2D(thisPlayer.mouseWorldPos);
|
|
}
|
|
|
|
protected override void Update()
|
|
{
|
|
if (currentDuration > 0)
|
|
{
|
|
Vector3 direction = (thisPlayer.mouseWorldPos - (Vector2)transform.position).normalized;
|
|
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
|
|
transform.rotation = Quaternion.RotateTowards(beamObjectInstance.transform.rotation, Quaternion.Euler(0,0,angle), turnSpeed * Time.deltaTime);
|
|
currentDuration -= Time.deltaTime;
|
|
if (currentDebounce > 0)
|
|
{
|
|
currentDebounce -= Time.deltaTime;
|
|
if (currentDebounce <= 0)
|
|
{
|
|
foreach (Entity enemy in enemyList.ToArray())
|
|
{
|
|
if (!enemy)
|
|
{
|
|
enemyList.Remove(enemy);
|
|
continue;
|
|
}
|
|
enemy.TakeDamage(damage);
|
|
}
|
|
currentDebounce = damageDebounceTime;
|
|
}
|
|
}
|
|
if (currentDuration <= 0)
|
|
{
|
|
canCooldown = true;
|
|
beamObjectInstance.gameObject.SetActive(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void CreateBeam()
|
|
{
|
|
beamObjectInstance = Instantiate(beamObject, transform.position, Quaternion.identity);
|
|
beamObjectInstance.transform.SetParent(transform);
|
|
beamObjectInstance.transform.localScale = new Vector3(length, width, 1);
|
|
beamObjectInstance.transform.Translate(Vector3.right * (beamObjectInstance.transform.localScale.x * 0.5f) + new Vector3(offset, 0, 0));
|
|
beamObjectInstance.thisLaser = this;
|
|
beamObjectInstance.gameObject.SetActive(false);
|
|
}
|
|
}
|