InsAsterix/InsAsterix/Assets/Scripts/Entities/Enemies/GreenEnemy.cs
2023-09-25 19:43:07 +02:00

137 lines
3.6 KiB
C#

using System;using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Serialization;
public class GreenEnemy : MonoBehaviour
{
public bool goLeftInit = false;
public float walkSpeed;
public float sprintSpeed;
private bool _isSprinting= false;
public float attackPhaseDuration;
private float _currentSpeed;
private GameObject _attackPhaseIndicator;
private SpriteRenderer _attackPhaseIndicatorSpriteRenderer;
private bool _isAttacking = false;
public float hitForce;
private int _direction = 1;
// public float sight;
private BoxCollider2D _sightCollider;
private GameObject _attackRange;
public GameObject player;
private Rigidbody2D _playerRigidbody2D;
// Start is called before the first frame update
void Start()
{
_currentSpeed = walkSpeed;
if (goLeftInit)
{
TurnAround();
}
// Attack phase color
_attackPhaseIndicator = transform.Find("AttackPhaseIndicator").GameObject();
_attackPhaseIndicatorSpriteRenderer = _attackPhaseIndicator.GetComponent<SpriteRenderer>();
// Attack range
_attackRange = transform.Find("AttackRange").GameObject();
_attackRange.GetComponent<EnemyAttack>().HitByEnemy += OnHitByEnemy;
_sightCollider = transform.GetComponent<BoxCollider2D>();
}
// Update is called once per frame
void Update()
{
transform.position += Time.deltaTime*_currentSpeed*_direction*Vector3.right ;
}
void TurnAround()
{
_direction *= -1;
transform.Rotate(Vector3.up, 180);
}
IEnumerator AttackSequence()
{
_currentSpeed = 0f;
_attackPhaseIndicator.SetActive(true);
_attackPhaseIndicatorSpriteRenderer.color = Color.green;
yield return new WaitForSeconds(attackPhaseDuration);
_attackPhaseIndicatorSpriteRenderer.color = Color.yellow;
yield return new WaitForSeconds(attackPhaseDuration);
_attackPhaseIndicatorSpriteRenderer.color = Color.red;
yield return new WaitForSeconds(attackPhaseDuration);
_attackPhaseIndicator.SetActive(false);
_attackRange.SetActive(true);
_currentSpeed = _isSprinting ? sprintSpeed : walkSpeed;
}
IEnumerator OnCollisionStay2D(Collision2D coll) {
// Changing direction
if (coll.gameObject.CompareTag("Wall") )
{
TurnAround();
}
// Attacking
if (coll.gameObject.CompareTag("Player") && !_isAttacking)
{
_isAttacking = true;
var speed = _currentSpeed;
yield return AttackSequence();
_isAttacking = false;
}
yield return null;
}
private void OnTriggerEnter2D(Collider2D coll)
{
if (coll.gameObject.CompareTag("Player"))
{
_isSprinting = true;
if (!_isAttacking)
{
_currentSpeed = sprintSpeed;
}
}
}
private void OnTriggerExit2D(Collider2D coll)
{
if (coll.gameObject.CompareTag("Player"))
{
_isSprinting = false;
if(!_isAttacking)
{
_currentSpeed = walkSpeed;
}
}
}
public void OnHitByEnemy(Collider2D coll)
{
Debug.Log(coll.gameObject.tag);
// coll.gameObject.GetComponent<Rigidbody2D>()
// .AddForce(hitForce * _direction * Vector3.right, ForceMode2D.Impulse);
}
}