Untitled
unknown
csharp
a year ago
4.3 kB
8
Indexable
Never
using System; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.EventSystems; public class ShootAction : BaseAction { private enum State { Aiming, Shooting, Cooloff, } public event EventHandler<OnShootEventArgs> OnShoot; public class OnShootEventArgs : EventArgs { public Unit targetUnit; public Unit shootingUnit; } private State state; private int maxShootDistance = 7; private float stateTimer; private Unit targetUnit; private bool canShootBullet; private void Update() { if (!isActive) { return; } stateTimer -= Time.deltaTime; switch (state) { case State.Aiming: Vector3 aimDirection = (targetUnit.GetWorldPosition() - unit.GetWorldPosition()).normalized; float rotateSpeed = 10f; transform.forward = Vector3.Lerp(transform.forward, aimDirection, Time.deltaTime * rotateSpeed); break; case State.Shooting: if (canShootBullet) { Shoot(); canShootBullet = false; } break; case State.Cooloff: break; } if(stateTimer <= 0f) { NextState(); } } private void NextState() { switch (state) { case State.Aiming: state = State.Shooting; float shootingStateTime = 0.1f; stateTimer = shootingStateTime; break; case State.Shooting: state = State.Cooloff; float coolOffStateTime = 0.5f; stateTimer = coolOffStateTime; break; case State.Cooloff: ActionComplete(); break; } } private void Shoot() { OnShoot?.Invoke(this, new OnShootEventArgs { targetUnit = targetUnit, shootingUnit = unit }); //Later Make this weapon based and not just 40 damage targetUnit.Damage(40); } public override string GetActionName() { return "Shoot"; } public override List<GridPosition> GetValidActionGridPositionList() { List<GridPosition> validGridPositionList = new List<GridPosition>(); GridPosition unitGridPosition = unit.GetGridPosition(); for (int x = -maxShootDistance; x <= maxShootDistance; x++) { for (int z = -maxShootDistance; z <= maxShootDistance; z++) { GridPosition offsetGridPosition = new GridPosition(x, z); GridPosition testGridPosition = unitGridPosition + offsetGridPosition; if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition)) { continue; } int testDistance = Mathf.Abs(x) + Mathf.Abs(z); if(testDistance > maxShootDistance) { continue; } if (!LevelGrid.Instance.HasAnyUnitOnGridPosition(testGridPosition)) { //Grid position is empty, no unit continue; } Unit targetUnit = LevelGrid.Instance.GetUnitAtGridPosition(testGridPosition); if (targetUnit.IsEnemy() == unit.IsEnemy()) { //Both Units on same 'team' continue; } validGridPositionList.Add(testGridPosition); } } return validGridPositionList; } public override void TakeAction(GridPosition gridPosition, Action onActionComplete) { ActionStart(onActionComplete); targetUnit = LevelGrid.Instance.GetUnitAtGridPosition(gridPosition); state = State.Aiming; float aimingStateTime = 1f; stateTimer = aimingStateTime; canShootBullet = true; } }