• 人物角色群体攻击判定二(叉乘来判断敌人的位置)


    建议阅读: 判断敌人在玩家的某一个区域: http://www.cnblogs.com/plateFace/p/4716799.html

    我们可以根据玩家和敌人的坐标, 进行叉乘来获取一个向量可以用它来判断敌人的位置, 敌人是否在攻击范围内. 下面我简单实现下对单体敌人是否攻击做判定

    这种方式有一种重大的BUG, 假设我把敌人大小增加100倍, 很显然玩家已经在敌人的体内了. 我们是通过坐标来判断敌人是否可以攻击, 跟敌人的体积大小无关系. 所以攻击的距离是跟敌人体积的大小所决定的 

    代码的实现:

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class Player : MonoBehaviour {
    
        public float speed = 2;
    
        public GameObject enemy;
        public Dictionary<string,GameObject> enemyList = new Dictionary<string,GameObject>();
    
        public TextMesh text1;
        public TextMesh text2;
    
        //判断敌人是否可以攻击
        public void CanAttack(GameObject obj)
        {
            Vector3 toOther = this.transform.position - obj.gameObject.transform.position;
            Vector3 chaCheng1 = Vector3.Cross(transform.forward, toOther);
            Vector3 chaCheng2 = Vector3.Cross(transform.right, toOther);
    
            //调试距离的代码
            text1.text = chaCheng1.ToString ();
            text2.text = chaCheng2.ToString ();
    
            //经过调试 前后距离是3 左右距离是2,
            //当敌人在左上或右上 并且 距离小于攻击距离, 就可以攻击
    
    
            if (chaCheng1.y > 0 && chaCheng2.y > 0) 
            {
                Debug.Log("位置: 左上");
                if(Mathf.Abs(chaCheng2.y) <= 3 && Mathf.Abs(chaCheng1.y) <= 2)
                {
                    //打开头顶可攻击标示
                    obj.gameObject.transform.FindChild ("T").gameObject.SetActive(true);
                }else
                {
                    obj.gameObject.transform.FindChild ("T").gameObject.SetActive(false);
                }
    
                return;
            }
            if (chaCheng1.y < 0 && chaCheng2.y > 0)
            {
                Debug.Log("位置: 右上");
                
                if(Mathf.Abs(chaCheng2.y) <= 3 && Mathf.Abs(chaCheng1.y) <= 2)
                {
                    obj.gameObject.transform.FindChild ("T").gameObject.SetActive(true);
                }else
                {
                    obj.gameObject.transform.FindChild ("T").gameObject.SetActive(false);
                }
                return;
            }
    
            obj.gameObject.transform.FindChild ("T").gameObject.SetActive(false);
    
    
            if (chaCheng1.y > 0 && chaCheng2.y < 0)
            {
                Debug.Log("位置: 左下");
                return;
            }
    
    
            if (chaCheng1.y < 0 && chaCheng2.y < 0)
            {
                Debug.Log("位置: 右下");
                
            }
    
        }
    }

    判断之后的效果图:(人物头顶的红色表示可以攻击)

    6~O{{V_S{E)DZN0R(RKYX[9  LFIMXL_ARVTZ7IW7$TT0WXI

    $`NGJ4XMJ%]WT%]YI]SZF]G  @T`YS@~QA{XJW8KGS0_D5[H

    如果你感兴趣,你可以把你妹妹介绍给我
  • 相关阅读:
    CF235D
    模拟赛 circle 题解
    平面图总结
    kd 树总结
    思维题
    luogu P1600 天天爱跑步
    UOJ #42. 【清华集训2014】Sum
    FZOJ 4344 连通性
    平衡树
    计蒜客 T3225 Darko 的生成树
  • 原文地址:https://www.cnblogs.com/plateFace/p/4718144.html
Copyright © 2020-2023  润新知