点击按钮播放人物动画 实现三连击效果
public class PlayerAttack : MonoBehaviour
{
// Use this for initialization
private ETCButton normalBtn;
private ETCButton attackBtn;
private ETCButton rangeBtn;
private ETCButton jumpBtn;
private Animator ani;
public float attackBValue;
public float rangeValue; //范围攻击的攻击力
public float attackAValue;
public float combo_2Value;
public float combo_3Value;
private void Awake()
{
attackBValue = 20;
rangeValue = 15;
attackAValue = 18;
combo_2Value = 10;
combo_3Value = 10;
ani = this.GetComponent<Animator>();
}
void Start()
{
normalBtn = ETCInput.GetControlButton("normalBtn");
normalBtn.onDown.AddListener(normalBtnDown);
attackBtn = ETCInput.GetControlButton("attackBtn");
attackBtn.onDown.AddListener(attackBtnDown);
rangeBtn = ETCInput.GetControlButton("rangeBtn");
rangeBtn.onDown.AddListener(rangeBtnDown);
}
private void rangeBtnDown()
{
if (ani != null)
ani.SetTrigger("range");
}
private void attackBtnDown()
{
if (ani != null)
ani.SetTrigger("attackB");
}
private void normalBtnDown()
{
AnimatorStateInfo stateinfo = ani.GetCurrentAnimatorStateInfo(0);
if (stateinfo.IsName("Idle"))
{
ani.SetTrigger("attackA");
} ///AttackA动画播放到一半以上了。 整数部分为播放次数,小数部分为播放的百分比。
else if (stateinfo.IsName("AttackA") && stateinfo.normalizedTime % 1 > 0.5f)
{
ani.SetTrigger("combo_2");
}
else if (stateinfo.IsName("Combo_2") && stateinfo.normalizedTime % 1 > 0.5f)
{
ani.SetTrigger("combo_3");
}
}
/// <summary>
/// 动画事件 的回调函数。
/// </summary>
public void attackB()
{
///单体攻击、前方、在攻击范围之内的第一个。
List<GameObject> list = SpawnEnemy.Instance.EnemyList;
// GameObject tmp = null;
// tmp = list[0]; ///距离最小的敌人游戏队形
foreach (GameObject item in list)
{
//判断是不是在前方
float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
if (dot > 0) //前方
{
float dis = Vector3.Distance(item.transform.position, this.transform.position);
if (dis < G.AttackRange) //小于攻击范围
{
// float d = Vector3.Distance(tmp.transform.position, this.transform.position);
//if (dis < d)
//{
// tmp = item;
//}
item.GetComponent<TakeDamage>().damage(attackBValue);
break;
}
}
}
}
public void RangeAttack()
{
///范围攻击 前方二米范围内所有敌人
List<GameObject> list = SpawnEnemy.Instance.EnemyList;
foreach (GameObject item in list)
{
//判断是不是在前方
float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
if (dot > 0) //前方
{
float dis = Vector3.Distance(item.transform.position, this.transform.position);
if (dis < G.AttackRange) //小于攻击范围
{
item.GetComponent<TakeDamage>().damage(rangeValue);
}
}
}
}
public void Combo_2()
{
///单体, 前方二米范围内所有敌人
List<GameObject> list = SpawnEnemy.Instance.EnemyList;
foreach (GameObject item in list)
{
//判断是不是在前方
float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
if (dot > 0) //前方
{
float dis = Vector3.Distance(item.transform.position, this.transform.position);
if (dis < G.AttackRange) //小于攻击范围
{
item.GetComponent<TakeDamage>().damage(combo_2Value);
break;
}
}
}
}
public void Combo_3()
{
///范围攻击 前方二米范围内所有敌人
List<GameObject> list = SpawnEnemy.Instance.EnemyList;
foreach (GameObject item in list)
{
//判断是不是在前方
float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
if (dot > 0) //前方
{
float dis = Vector3.Distance(item.transform.position, this.transform.position);
if (dis < G.AttackRange) //小于攻击范围
{
item.GetComponent<TakeDamage>().damage(combo_3Value);
}
}
}
}
public void AttackA()
{
///单体攻击 前方二米范围内所有敌人
List<GameObject> list = SpawnEnemy.Instance.EnemyList;
foreach (GameObject item in list)
{
//判断是不是在前方
float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
if (dot > 0) //前方
{
float dis = Vector3.Distance(item.transform.position, this.transform.position);
if (dis < G.AttackRange) //小于攻击范围
{
item.GetComponent<TakeDamage>().damage(combo_3Value);
break;
}
}
}
}
// Update is called once per frame
void Update()
{
//AnimatorStateInfo stateinfo = ani.GetCurrentAnimatorStateInfo(0);
//if (stateinfo.IsName("Idle"))
//{
// print("idle" + stateinfo.normalizedTime); ///
//}
// print(ani.IsInTransition(0));
}
}