|
@@ -3,46 +3,126 @@ using System.Collections.Generic;
|
|
|
using UnityEngine;
|
|
using UnityEngine;
|
|
|
public enum AssassinState
|
|
public enum AssassinState
|
|
|
{
|
|
{
|
|
|
|
|
+ None = -1,
|
|
|
Normal = 0, //正常状态
|
|
Normal = 0, //正常状态
|
|
|
FindPlayer = 1, //寻找主角位置
|
|
FindPlayer = 1, //寻找主角位置
|
|
|
|
|
+ ReadyToDash = 2, //准备攻击主角
|
|
|
|
|
+ Dash = 3, //向主角方向冲刺
|
|
|
|
|
+ Down = 4, //落地斩
|
|
|
}
|
|
}
|
|
|
public class ESpirits_Assassin : MonoBehaviour
|
|
public class ESpirits_Assassin : MonoBehaviour
|
|
|
{
|
|
{
|
|
|
[HideInInspector]
|
|
[HideInInspector]
|
|
|
public float time;
|
|
public float time;
|
|
|
- public float CD;
|
|
|
|
|
|
|
+ public float attackCD;
|
|
|
|
|
+ public float readyCD;
|
|
|
public float hateDistance;
|
|
public float hateDistance;
|
|
|
public AssassinState state;
|
|
public AssassinState state;
|
|
|
public Enemy enemy;
|
|
public Enemy enemy;
|
|
|
-
|
|
|
|
|
|
|
+ public Rigidbody rb;
|
|
|
|
|
+ [HideInInspector]
|
|
|
|
|
+ public float distance;
|
|
|
|
|
+ public DashEffect dashEffect;
|
|
|
|
|
+ public float moveSpeed;
|
|
|
|
|
+ public float offset;
|
|
|
|
|
+ [HideInInspector]
|
|
|
|
|
+ public Vector3 targetDir;
|
|
|
|
|
+ public float dashTime;
|
|
|
private void Update()
|
|
private void Update()
|
|
|
{
|
|
{
|
|
|
switch (state)
|
|
switch (state)
|
|
|
{
|
|
{
|
|
|
case AssassinState.Normal:
|
|
case AssassinState.Normal:
|
|
|
time += Time.deltaTime;
|
|
time += Time.deltaTime;
|
|
|
- if (time > CD)
|
|
|
|
|
|
|
+ if (time > attackCD)
|
|
|
{
|
|
{
|
|
|
enemy.isSpiritsAttack = true;
|
|
enemy.isSpiritsAttack = true;
|
|
|
|
|
+ time = 0;
|
|
|
state = AssassinState.FindPlayer;
|
|
state = AssassinState.FindPlayer;
|
|
|
|
|
+ ChosePlayer();
|
|
|
|
|
+ enemy.searchState = SearchState.InSearchScope;
|
|
|
|
|
+ enemy.ChangeState(CharacterState.Run);
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
case AssassinState.FindPlayer:
|
|
case AssassinState.FindPlayer:
|
|
|
- float distance0 = Mathf.Abs(PlayersInput.instance[0].transform.position.x
|
|
|
|
|
- - transform.position.x);
|
|
|
|
|
- float distance1 = Mathf.Abs(PlayersInput.instance[1].transform.position.x
|
|
|
|
|
- - transform.position.x);
|
|
|
|
|
- if (distance0<=distance1)
|
|
|
|
|
|
|
+ ChosePlayer();
|
|
|
|
|
+ if (distance <= hateDistance)
|
|
|
{
|
|
{
|
|
|
- enemy.targetCharacter = PlayersInput.instance[0];
|
|
|
|
|
|
|
+ state = AssassinState.ReadyToDash;
|
|
|
|
|
+ enemy.ChangeState(CharacterState.Rush);
|
|
|
|
|
+ rb.velocity = Vector3.zero;
|
|
|
|
|
+ enemy.ani.Play("hitted", 0, 0);
|
|
|
|
|
+ enemy.aniCollider.Play("Hurt", 0, 0);
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
- else
|
|
|
|
|
|
|
+ break;
|
|
|
|
|
+ case AssassinState.ReadyToDash:
|
|
|
|
|
+ time += Time.deltaTime;
|
|
|
|
|
+ if (time >= readyCD)
|
|
|
{
|
|
{
|
|
|
- enemy.targetCharacter = PlayersInput.instance[1];
|
|
|
|
|
|
|
+ state = AssassinState.Dash;
|
|
|
|
|
+ dashEffect.isDash = true;
|
|
|
|
|
+ dashEffect.isDashAttack = true;
|
|
|
|
|
+ targetDir =
|
|
|
|
|
+ (enemy.targetCharacter.transform.position - transform.position).normalized;
|
|
|
|
|
+ enemy.ani.Play("attack_summon", 0, 0);
|
|
|
|
|
+ time = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ case AssassinState.Dash:
|
|
|
|
|
+ time += Time.deltaTime;
|
|
|
|
|
+ Dash();
|
|
|
|
|
+ if (time >= dashTime)
|
|
|
|
|
+ {
|
|
|
|
|
+ rb.velocity = Vector3.zero;
|
|
|
|
|
+ dashEffect.isDashAttack = false;
|
|
|
|
|
+ time = 0;
|
|
|
|
|
+ state = AssassinState.Normal;
|
|
|
|
|
+ enemy.isSpiritsAttack = false;
|
|
|
|
|
+ enemy.searchState = SearchState.NoTarget;
|
|
|
|
|
+ enemy.ChangeState(CharacterState.Idle);
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
- enemy.ChangeState(CharacterState.Run);
|
|
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ public void ChosePlayer()
|
|
|
|
|
+ {
|
|
|
|
|
+ float distance0 = 1000;
|
|
|
|
|
+ float distance1 = 1000;
|
|
|
|
|
+ if (PlayersInput.instance[0])
|
|
|
|
|
+ {
|
|
|
|
|
+ distance0 = Mathf.Abs(PlayersInput.instance[0].transform.position.x
|
|
|
|
|
+ - transform.position.x);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (PlayersInput.instance[1])
|
|
|
|
|
+ {
|
|
|
|
|
+ distance1 = Mathf.Abs(PlayersInput.instance[1].transform.position.x
|
|
|
|
|
+ - transform.position.x);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (distance0 <= distance1)
|
|
|
|
|
+ {
|
|
|
|
|
+ enemy.targetCharacter = PlayersInput.instance[0];
|
|
|
|
|
+ distance = distance0;
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ enemy.targetCharacter = PlayersInput.instance[1];
|
|
|
|
|
+ distance = distance1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ private void Dash()
|
|
|
|
|
+ {
|
|
|
|
|
+ if (targetDir.x < 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ dashEffect.offset = offset;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ dashEffect.offset = -offset;
|
|
|
|
|
+ }
|
|
|
|
|
+ rb.velocity = targetDir * moveSpeed;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|