151 lines
3.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
Rigidbody2D rb;
[HideInInspector]public Animator anim;
[HideInInspector]public PhysicsCheck physicsCheck;
[Header("基本参数")]
public float normalSpeed;//正常速度
public float chaseSpeed;//追击速度
[HideInInspector] public float currentSpeed;//当前速度
public Vector3 faceDir;//面朝方向
public float hurtForce;//受伤的力
public Transform attacker;//攻击者
[Header("计时器")]
public float waitTime;
public float waitTimeCounter;
public bool wait;
[Header("状态")]
public bool isHurt;
public bool isDead;
private BaseState currentState;
protected BaseState patrolState;
protected BaseState chaseState;
protected virtual void Awake()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
physicsCheck = GetComponent<PhysicsCheck>();
currentSpeed = normalSpeed;
waitTimeCounter = waitTime;
}
public void OnEnable()
{
// currentState = patrolState;
// currentState.OnEnter(this);
}
public void Update()
{
faceDir = new Vector3(-transform.localScale.x,0,0);
if (physicsCheck.touchLeftWall && faceDir.x < 0 || physicsCheck.touchRightWall && faceDir.x > 0)
{
wait = true;
anim.SetBool("walk", false);
}
//currentState.LogicUpdate();
TimeCounter();
}
public void FixedUpdate()
{
if(!isHurt && !isDead)
{
Move();
}
//currentState.PhysicsUpdate();
}
private void OnDisable()
{
// currentState.OnExit();
}
public virtual void Move()
{
rb.velocity = new Vector2(currentSpeed * faceDir.x * Time.deltaTime, rb.velocity.y);
}
//计时器
public void TimeCounter()
{
if(wait)
{
waitTimeCounter -= Time.deltaTime;
if(waitTimeCounter <= 0)
{
waitTimeCounter = waitTime;
wait =false;
transform.localScale = new Vector3(faceDir.x, 1, 1);
//Turn();
}
}
}
public void OnTakeDamage(Transform attackTrans)
{
attacker = attackTrans;
if(attackTrans.position.x - transform.position.x > 0)
{
transform.localScale = new Vector3(-1,1,1);
}
if (attackTrans.position.x - transform.position.x < 0)
{
transform.localScale = new Vector3(1, 1, 1);
}
//受伤击退
isHurt = true;
anim.SetTrigger("hurt");
Vector2 dir = new Vector2(transform.position.x - attackTrans.position.x, 0).normalized;
StartCoroutine(OnHurt(dir));
}
IEnumerator OnHurt( Vector2 dir)
{
rb.AddForce(hurtForce * dir, ForceMode2D.Impulse);
yield return new WaitForSeconds(0.5f);
isHurt = false;;
}
public void OnDie()
{
anim.SetBool("dead", true);
isDead = true;
Destroy(this.gameObject);//动画失效,暂时直接销毁
}
public void DestroyAffterAnimation()
{
Destroy(this.gameObject);
}
/*public void Turn()
{
if (physicsCheck.touchLeftWall)
{
transform.localScale = new Vector3(-1, 1, 1);
}
else if (physicsCheck.touchRightWall)
{
transform.localScale = new Vector3(1, 1, 1);
}
}*/
}