Arrow_controller.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Arrow_controller : MonoBehaviour
{
[SerializeField] private int damage;
[SerializeField] private string tagertLayerName = "Player";
[SerializeField] private float xVelocity;
[SerializeField] private Rigidbody2D rb;
[SerializeField] private bool canMove;
[SerializeField] private bool flipped;
private void Update()
{
if (canMove)
rb.velocity = new Vector2(xVelocity,rb.velocity.y);
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.layer == LayerMask.NameToLayer(tagertLayerName))
{
collision.GetComponent<CharacterStats>()?.TakeDamage(damage);
StuckInto(collision);
}
else if (collision.gameObject.layer == LayerMask.NameToLayer("Ground"))
StuckInto(collision);
}
private void StuckInto(Collider2D collision)
{
GetComponentInChildren<ParticleSystem>().Stop();
GetComponent<CapsuleCollider2D>().enabled = false;
canMove = false;
rb.isKinematic = true;
rb.constraints = RigidbodyConstraints2D.FreezeAll;
transform.parent = collision.transform;
Destroy(gameObject, Random.Range(5, 7));
}
public void FlipArrow()
{
if (flipped)
return;
xVelocity = xVelocity * -1;
flipped = true;
transform.Rotate(0, 180, 0);
tagertLayerName = "Enemy";
}
}
Enemy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(CapsuleCollider2D))]
[RequireComponent(typeof(EnemyStats))]
[RequireComponent(typeof(EntityFX))]
[RequireComponent(typeof(ItemDrop))]
public class Enemy : Entity
{
[SerializeField] protected LayerMask whatIsPlayer;
[Header("Stunned info")]
public float stunDuration;
public Vector2 stunDirection;
protected bool canBeStunned;
[SerializeField] protected GameObject counterImage;
[Header("Move info")]
public float moveSpeed;
public float idleTime;
public float battleTime;
private float defaultMoveSpeed;
[Header("Attack info")]
public float agroDistance = 2;
public float attackDistance;
public float attackCooldown;
public float minAttackCooldown;
public float maxAttackCooldown;
[HideInInspector] public float lastTimeAttacked;
public EnemyStateMachine stateMachine { get; private set; }
public EntityFX fx { get; private set; }
public string lastAnimBoolName { get; private set; }
protected override void Awake()
{
base.Awake();
stateMachine = new EnemyStateMachine();
defaultMoveSpeed = moveSpeed;
}
protected override void Start()
{
base.Start();
fx = GetComponent<EntityFX>();
}
protected override void Update()
{
base.Update();
stateMachine.currentState.Update();
}
public virtual void AssignLastAnimName(string _animBoolName)
{
lastAnimBoolName = _animBoolName;
}
public override void SlowEntityBy(float _slowPercentage, float _SlowDuration)
{
moveSpeed = moveSpeed * (1 - _slowPercentage);
anim.speed = anim.speed * (1- _slowPercentage);
Invoke("ReturnDefaultSpeed", _SlowDuration);
}
protected override void ReturnDefaultSpeed()
{
base.ReturnDefaultSpeed();
moveSpeed = defaultMoveSpeed;
}
public virtual void FreezeTime(bool _timerFrozen)
{
if(_timerFrozen)
{
moveSpeed = 0;
anim.speed = 0;
}
else
{
moveSpeed = defaultMoveSpeed;
anim.speed = 1;
}
}
public virtual void FreezeTimeFor(float _duration) => StartCoroutine(FreezeTimerCoroutine(_duration));
protected virtual IEnumerator FreezeTimerCoroutine(float _Seconds)
{
FreezeTime(true);
yield return new WaitForSeconds(_Seconds);
FreezeTime(false);
}
#region Counter Attack window
public virtual void OpenCounterAttackWindow()
{
canBeStunned = true;
counterImage.SetActive(true);
}
public virtual void CloseCounterAttackWindow()
{
canBeStunned = false;
counterImage.SetActive(false);
}
#endregion
public virtual bool CanBeStunned()
{
if (canBeStunned)
{
CloseCounterAttackWindow();
return true;
}
return false;
}
public virtual void AnimationFinishTrigger() => stateMachine.currentState.AnimationFinishTrigger();
public virtual RaycastHit2D IsPlayerDetected() => Physics2D.Raycast(wallCheck.position,Vector2.right* facingDir,50,whatIsPlayer);
protected override void OnDrawGizmos()
{
base.OnDrawGizmos();
Gizmos.color = Color.yellow;
Gizmos.DrawLine(transform.position, new Vector3(transform.position.x + attackDistance * facingDir, transform.position.y));
}
}