游戏开发学习笔记(十四)角色攻击处理

思路:

先获取角色前面的敌人

通过攻击类别攻击敌人

新建脚本Player Attack,编辑脚本
public class PlayerAttack : MonoBehaviour {

    public enum AttackRange
    {
        Forward,
        Around
    }

    public static PlayerAttack _instance;
    public Animator Anim;
    public float forward_dis = 4f;      //向前攻击的距离
    public float around_dis = 4f;       //周围攻击的距离
	
    void Awake()
    {
        _instance = this;
    }

	void Update () {
        
	}
    //通过攻击类型释放攻击
    public void OnAttack_SkillBtn(bool isPress, AttackType attackType)
    {
        ArrayList array = null;
        if (PlayerControl._instance.animatorInfo.normalizedTime > 0.5f)
        {
            switch (attackType)
            {
                case AttackType.Basic:
                    array = GetEnemyInAttackRange(AttackRange.Forward);
                    foreach (GameObject go in array)
                        go.SendMessage("Hurt", PlayerState._instance.ReadAttack());
                    break;
                case AttackType.Skill01:
                    array = GetEnemyInAttackRange(AttackRange.Around);
                    foreach (GameObject go in array)
                        go.SendMessage("Hurt", PlayerState._instance.ReadAttack() * 1.2f);
                    break;
                case AttackType.Skill02:
                    array = GetEnemyInAttackRange(AttackRange.Forward);
                    foreach (GameObject go in array)
                        go.SendMessage("Hurt", PlayerState._instance.ReadAttack() * 1.5f);
                    break;
                case AttackType.Skill03:
                    array = GetEnemyInAttackRange(AttackRange.Around);
                    foreach (GameObject go in array)
                        go.SendMessage("Hurt", PlayerState._instance.ReadAttack() * 1.8f);
                    break;
            }
        }

    }
     //得到在范围之内的敌人
    ArrayList GetEnemyInAttackRange(AttackRange attackRange)
    {
        ArrayList arrayList = new ArrayList();
        if (attackRange == AttackRange.Around)    //范围攻击不需要判断是否在前面,只需判断距离时否在攻击范围内
        {
            foreach (GameObject go in TransformScripManage._instance.enemyList)
            {
                Vector3 pos = transform.InverseTransformPoint(go.transform.position);
                float distance = Vector3.Distance(Vector3.zero, pos);    //敌人跟主角的距离
                if (distance <= around_dis)
                {
                    arrayList.Add(go);
                }
                
            }
        }
       if (attackRange == AttackRange.Forward) //在向前的攻击范围内
        {
            foreach(GameObject go in TransformScripManage._instance.enemyList)  //遍历敌人
            {
                Vector3 pos = transform.InverseTransformPoint(go.transform.position);   //把敌人坐标转化为主角的局部坐标
                if (pos.z > -0.2f)  //如果在主角前面
                {
                    float distance = Vector3.Distance(Vector3.zero, pos);    //敌人跟主角的距离
                    if (distance <= forward_dis)
                        arrayList.Add(go);
                }
            }
        }
       
        return arrayList;
    }
    
}
点击攻击按钮时,调用这里的方法即可攻击敌人
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值