unity3d新手,在项目中用到过伤害的判断,就实现了先一个扇形伤害区域,大家共同分享下,希望能对刚接触unity3d的童鞋有所帮助,先上代码。

/// <summary>
    /// 判断目标是否在主角面前一个扇形内
    /// </summary>
    /// <param name="player">角色</param>
    /// <param name="target">目标</param>
    /// <param name="radius">扇形半径</param>
    /// <returns></returns>
    public static bool IsInSector(GameObject player, GameObject target, float radius)
    {
        if (target != null && player != null)
        {
            Vector3 playerPos = player.transform.position;//角色自身坐标
            Vector3 targetPos = target.transform.position;//目标坐标

Quaternion playerQua = player.transform.rotation;自身的旋转

Quaternion playerRight = playerQua * Quaternion.AngleAxis(30, Vector3.up);//以自身Y轴向右旋转30度
            Quaternion playerLeft = playerQua * Quaternion.AngleAxis(30, Vector3.down);//以自身Y轴向左旋转30度

//角色以自身Y轴向右旋转30度角的正前方radius距离的坐标点
            Vector3 right = playerPos + (playerRight * Vector3.forward) * radius;
            Debug.DrawLine(playerPos, right, Color.red);

Vector3 forward = playerPos + (playerQua * Vector3.forward) * radius;//角色正前方Radius距离的坐标点
            Debug.DrawLine(playerPos, forward, Color.red);

//角色以自身Y轴向左旋转30度角的正前方距离的坐标点
            Vector3 left = playerPos + (playerLeft * Vector3.forward) * radius;radius
            Debug.DrawLine(playerPos, left, Color.red);

            //将自身本地坐标转化成世界3D坐标
            Vector3 localToWorld = player.transform.TransformDirection(Vector3.forward);

//目标到角色的向量
            Vector3 playerToTarget = target.transform.position - player.transform.position;

//向量点乘,大于0表示目标在角色正前方
            if (Vector3.Dot(localToWorld, playerToTarget) > 0)
            {

//目标点到left的向量
                Vector3 targetToLeft = targetPos - left;
                Debug.DrawLine(targetPos, left, Color.blue);

//目标点到right的向量
                Vector3 targetToRight = targetPos - right;
                Debug.DrawLine(targetPos, right, Color.blue);

//角色到left的向量
                Vector3 playerToLeft = playerPos - left;
                Debug.DrawLine(playerPos, left, Color.blue);

//角色到right的向量
                Vector3 playerToRight = playerPos - right;
                Debug.DrawLine(playerPos, right, Color.blue);

float dis = Vector3.Distance(playerPos, targetPos);
                if (Vector3.Angle(targetToLeft, playerToLeft) < 90 && Vector3.Angle(targetToRight, playerToRight) < 90 && dis <= radius)
                {
                    return true;
                }
                else

{
                    return false;
                }
            }
            else

{
                return false;
            }

}

return false;

}

运行结果如图下:

判断目标是否在角色正前方一个扇形区域内,一般战斗系统中用作伤害处理相关推荐

  1. java中,判断当前时间是否处于某个一个时间段内

    今天同事拿了个问题问我,有一个回调工程,会一直查询今日订单表和回调表中的订单数据,然后这条sql今日订单日期是动态的, select * from QYPT_QUERY_GOODS goods,qyp ...

  2. 利用shell脚本批量判断目标ip存活情况

    一.目的 有时候需要批量去判断目标ip是否存活,一个一个去试多麻烦所以写了个shell脚本去批量尝试,原理使用的是去ping目标ip,虽然这种方法受很多因素影响,比如网速,防火墙禁ping等,但是也是 ...

  3. java-记录一个子串在整串中出现的次数

    转载 :https://blog.csdn.net/best_xing/article/details/70244858 任务描述:  编写一个程序,记录一个子串在整串中出现的次数,例如记录子串&qu ...

  4. 如何判断目标主机是否在监听一个UDP端口(阿里云二面)

    面试官:我问一个简单的问题,如何判断目标主机是否在监听一个UDP端口port? 我:给目标主机发送一个UDP报文(含目标port),如果收到回复,表示监听,否则表示没有监听. 面试官:有没有通用一点的 ...

  5. python判断一个文件夹里面是否为空_Python碎片化学习教程 @8. 判断目标文件夹是否为空...

    代码功能:判断目标文件夹是否为空 代码如下:import os  # 导入负责处理操作系统相关事务的os模块 tar_dir = "D:\\666"  # 指定目标文件夹 if l ...

  6. WordPress:如何判断登录用户的角色

    过去判断登录用户的角色我喜欢用current_user_can(),比如判断当前用户是否是作者用current_user_can('author'),记得WordPress官方文档中给的例子也是这样用 ...

  7. 单词迷阵游戏就是从一个10x10的字母矩阵中找出目标单词,查找方向可以从左往右、从右往左、从上往下或者从下往上。例如下面的迷阵中包含quot等单词。

    单词迷阵游戏就是从一个10x10的字母矩阵中找出目标单词,查找方向可以从左往右.从右往左.从上往下或者从下往上.例如下面的迷阵中包含quot等单词. rmhlzxceuq bxmichelle mnn ...

  8. unity3d:向量计算:获得两点连线的垂直向量,判断目标方位(前后左右)

    获得两点连线垂直向量 /// <summary>/// 获取某向量的垂直向量/// </summary>public static Vector3 GetVerticalDir ...

  9. Vue3.0 使用 ref 判断目标 node 区域之外的点击事件(实现下拉框、弹窗关闭功能)

    有时候会遇到点击目标区域绑定事件 / 展示效果,然后点击目标区域之外的地方就关闭效果 / 触发另一事件,为了实现这样的功能,我们需要通过比对 node 节点来进行判断,在下面我会使用 Vue3.0 的 ...

最新文章

  1. Java学习总结:7
  2. 认识HTML5的WebSocket 认识HTML5的WebSocket
  3. Hibernate Session的delete()方法
  4. 成功解决''g++' 不是内部或外部命令,也不是可运行的程序 或批处理文件
  5. Node.js HTTPS
  6. 获取系统信息3——proc文件系统介绍和使用
  7. 2.图像作为函数 | 裁剪、颜色通道、图像相加_5
  8. 环保公益PSD分层海报,小景合成美好世界
  9. codevs1197 Vigenère密码
  10. Windows版Mysql5.6.11的安装与配置
  11. 抽象工厂模式_设计模式(3) 抽象工厂模式
  12. 如何获取当前显示的片段?
  13. 刘海屏的MacBook Pro还值得入手吗?
  14. python数据结构与算法 pdf_数据结构与算法:Python语言描述.pdf
  15. 电脑开热点手机无法连接,无法启用 Internet 连接共享.为 LAN 连接配置的 IP 地址需要使用自动 IP 寻址.
  16. 移动数字化平台原来可以这样帮企业打造协同生态链
  17. 网站打不开如何解决?教你4个方法搞定它!
  18. Connection closed prematurely
  19. ANSYS WORKBENCH基础学习之应力奇异及位移结果对比
  20. 企业微信oauth认证_OAuth验证接口

热门文章

  1. zynq 黑金 linux 教程,【黑金ZYNQ7000系列原创视频教程】05.FPGA和ARM的初次结合——LED实验...
  2. 每日一练--世纪难题
  3. java解一元一次方程
  4. 编程经验NO.1 from月光博客
  5. Qt继承QWidget或者QWidget直接弹出窗口(非模态对话框)(对话框)
  6. 饿了么股权变更,创始人被架空,马云亲信上任!
  7. PDF如何翻译成中文?三种方法教你怎样翻译PDF上的文字
  8. 十级龙王间的决斗(C++)
  9. gulp 雪碧图制作
  10. 一种基于嵌入式的多重识别门禁系统设计方案