Unity射线系统

Demo展示

UI+Physical射线测试:

FPS自定义射线测试:

UGUI射线工具

实现功能,鼠标点击UI,返回鼠标点击的UI对象;

需要使用到鼠标点击事件-PointerEventData;

关键API:EventSystem.current.RaycastAll();

参数为鼠标点击事件,和接受射线返回结果集合;

public static GameObject RaycastUI()
{
if (EventSystem.current == null)
return null;
//鼠标点击事件
PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
//设置鼠标位置
pointerEventData.position = Input.mousePosition;
//射线检测返回结果
List<RaycastResult> results = new List<RaycastResult>();
//检测UI
EventSystem.current.RaycastAll(pointerEventData, results); //返回最上层ui
if (results.Count > 0)
return results[0].gameObject;
else
return null;
}

Physcial射线工具

从摄像机发射射线,方向为,摄像机——鼠标位置;

可以获取射线碰撞到的3D物品的大部分信息:

可以活着hit.collider;意味着可以获取碰撞点的位置,物体等信息;

用来做鼠标点击地面控制人物位移;

public static GameObject RaycastPhysical()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
bool isHit = Physics.Raycast((Ray) ray, out hit); if (isHit)
{
Debug.Log(hit.collider.name);
return hit.collider.gameObject; //检测到碰撞,就把检测到的点记录下来
} return null;
}

测试代码:

public class Test : MonoBehaviour
{
void Update()
{
if (Input.GetMouseButtonUp(0))
{
GameObject temp = RayCastTool.RaycastUI(); if (temp.CompareTag("Pic"))
{
temp.GetComponent<Image>().color = Color.red;
}
} if (Input.GetMouseButtonUp(1))
{
GameObject temp = RayCastTool.RaycastPhysical(); temp.GetComponent<Renderer>().material.color = Color.red;
}
}
}

FPS射线测试

自定义射线的起始点Origin,方向,以及射线长度;

获取射线碰撞点的位置物体信息;

用来做第三人称FPS的射击判定,或者RPG远程技能判定;

第一人称FPS,射线起始点和方向,替换成相机——屏幕中心瞄准心;

public class TestRayCast : MonoBehaviour
{
private Transform player;
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
} void Update()
{
Ray ray = new Ray(player.position, player.forward);
RaycastHit hit;
bool isHit = Physics.Raycast((Ray) ray, out hit,10); Debug.DrawRay(player.position, player.forward*10, Color.blue);
if (isHit)
{
if (hit.collider.CompareTag("Enemy"))
hit.collider.GetComponent<Renderer>().material.color = Color.red;
}
}
}

最新文章

  1. 简述抽象和封装,对你学习Java有一些作用
  2. Win10/UWP新特性—Drag&amp;Drop 拖出元素到其他App
  3. Socket开发框架之消息的回调处理
  4. 【java手记】------------------------java中转发和重定向区别
  5. bzoj2565: 最长双回文串
  6. Windows Server 2003下ASP.NET无法识别IE11的解决方法
  7. crystal report format number
  8. Unity CCTween UGUI 动画插件
  9. linux kernel 结构体赋值方法{转载}
  10. 使用fixed制作浮动广告(注意:解决闪屏问题,但适用于高版本浏览器,低版本的浏览器不适用)
  11. jquery 模态窗口 蒙层无法覆盖flash解决办法
  12. Quartz入门指南
  13. 20155205 郝博雅 《网络对抗技术》Exp1 PC平台逆向破解
  14. Oauth2.0客户端服务端示例
  15. Python概念-上下文管理协议中的__enter__和__exit__
  16. SQLAlchemy中表结构的一对多
  17. HDU1814(2-SAT)
  18. FPGA千兆位收发器选择指南
  19. ajax 二级联动与springmvc 交互
  20. js 原型链 prototype __proto__

热门文章

  1. tcpdump使用手册
  2. python 小鸡飞行小游戏
  3. 计算机网络 -- TCP/IP
  4. 手把手教你实现栈以及C#中Stack源码分析
  5. 学习PHP中的信息格式化操作
  6. mysql 不常用的存储引擎
  7. Python return self
  8. P7737-[NOI2021]庆典【tarjan,虚树】
  9. Ueditor Version 1.4.3.3 SSRF
  10. 10.3 Nginx