SavePoge/Assets/Scripts/Enemy.cs
2023-02-13 12:21:38 +05:30

94 lines
2.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float moveSpeed = 0.1f;
public bool canSeePlayer = false;
float distanceThreshold = 0.45f;
float playerDistanceThreshold = 1f;
float dodgeTime = 0.25f;
float dodgeTimer = 0;
public LayerMask linecastLayer;
float offset;
private void Awake()
{
dodgeTimer = dodgeTime;
offset = Random.Range(-0.5f,0.5f);
}
Color debugColor = Color.white;
void FixedUpdate()
{
if (GameManager.Player == null) { return; }
RaycastHit2D hit = Physics2D.Linecast(transform.position, GameManager.Player.position, linecastLayer);
if (hit.collider == null) {
canSeePlayer = true;
} else if (hit.collider.transform == GameManager.Player.transform)
{
canSeePlayer = true;
}
else if(hit.collider.tag == "Obstacle")
{
canSeePlayer = false;
float distanceToBarrier = Vector2.Distance(transform.position, hit.point);
if (distanceToBarrier < distanceThreshold && distanceToBarrier > 0.001f)
{
dodgeTimer = 0;
}
Debug.DrawLine(transform.position, hit.point, debugColor);
}
if (canSeePlayer)
{
if (Vector2.Distance(GameManager.Player.position, transform.position) < playerDistanceThreshold)
{
GameManager.GameOver();
return;
}
}
Vector3 direction = (GameManager.Player.position - new Vector3(-offset/2f,offset,0) - transform.position).normalized;
float rot_z = Mathf.Atan2(direction.y,direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0,0,rot_z+180);
if (dodgeTimer < dodgeTime)
{
dodgeTimer += Time.deltaTime;
if(!attacked){
Drawer.instance.lineRenderer.GetComponent<Rigidbody2D>().AddForce(((Vector2)transform.position- hit.point) * -attackForce);
attacked=true;
}
if (dodgeTimer > dodgeTime/100f || true)
{
debugColor = Color.red;
Vector3 new_direction = (hit.point - (Vector2)transform.position).normalized;
Vector3 newPos = transform.position + (-new_direction * moveSpeed);
RaycastHit2D hitBack = Physics2D.Linecast(transform.position, newPos, linecastLayer);
if(hitBack.collider != null){
return;
}
transform.Translate(-new_direction * moveSpeed * 0.5f, Space.World);
return;
}
}
attacked=false;
transform.Translate(direction * moveSpeed, Space.World);
debugColor = Color.white;
}
bool attacked =false;
float attackForce =50;
}