Unity——射线系统
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;
}
}
}
Unity——射线系统的更多相关文章
- Unity——技能系统(二)
Unity技能系统(二) Unity技能系统(一) Demo展示: 五.技能管理和释放 1.CharacterSkillSystem 技能系统类,给外部(技能按钮,按键)提供技能释放方法: 技能释放逻 ...
- 三维软件转Unity的系统单位设置研究
Unity的系统单位为米,其他3D软件的模型导入,而保持和Unity的比例一致是非常重要的,下面对各软件进行测试: ㈠. 3dsmax 转 Unity的比例为100:1:也就是说Unity单位是3ds ...
- unity射线碰撞检测+LayerMask的使用
射线在unity中是个很方便的东西,对对象查找.多用于碰撞检测(如:子弹飞行是否击中目标).角色移动等提供了很大的帮助,在此做个总结与大家分享下 ,若有不足欢迎吐槽 好了,话补多说啦,直接进入主题: ...
- Unity——技能系统(三)
Unity技能系统(三) Unity技能系统(一) Unity技能系统(二) Demo展示 六.Buff系统 buff分为增益和减益buff,应该区分开来: /// <summary> / ...
- Unity——射线检测(鼠标点击开关门效果)
Unity射线检测--实现简单的开关门效果 简要:通过鼠标点击来发射一条射线,来获得射线所碰到的物体名称,再通过改变门的Rotation值来实现开关门的效果. 一.代码实现 1.1 简易的场景搭建 注 ...
- Unity射线检测的用法总结
RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...
- unity shader序列帧动画代码,顺便吐槽一下unity shader系统
一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Sh ...
- unity射线检测
unity中射线检测时非常实用也经常实用的一种手段.下面讲解一下射线检测问题. 1)Ray 根据射线端点和射线的方向定义一条射线 Ray ray= new Ray(transform.position ...
- Unity——技能系统(一)
技能系统(一) 一.Demo展示 二.功能介绍 集成了技能,冷却,buff,UI显示,倒计时,动画等: 技能类型:弹道技能,动画事件根据帧数采用延迟调用技能,自定义释放位置(偏移,发射点两种),buf ...
随机推荐
- Math.round真的是四舍五入吗?我不这么认为
public static long round(double a) 返回最接近参数的 long.结果将舍入为整数:加上 1/2,对结果调用 floor 并将所得结果强制转换为 long 类型.换句话 ...
- 图的遍历BFS广度优先搜索
图的遍历BFS广度优先搜索 1. 简介 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点"死磕到底"的思维不同,广度优先 ...
- CodeForce-810B Summer sell-off (结构体排序)
http://codeforces.com/problemset/problem/810/B 已知n天里,已知第i天的供货量和需求量,给定一个f,可以在n天之中选f天促销使得供货量翻倍. 问选择其中f ...
- PHP中PDO关闭连接的问题
在之前我们手写 mysql 的连接操作时,一般都会使用 mysql_close() 来进行关闭数据库连接的操作.不过在现代化的开发中,一般使用框架都会让我们忽视了底层的这些封装,而且大部分框架都已经默 ...
- windows日志查看与清理
日志查看 (1) 启动Windows实验台,点击:开始 - 控制面板 - 管理工具 - 事件查看器. (2) 应用程序日志.安全日志.系统日志.DNS日志默认位置:%sys temroot%\syst ...
- python编码问题:UnicodeDecodeError: 'gbk' codec can't decode
在获取yaml文件数据时,提示:UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 2: illegal multib ...
- pyqt5无边框拖动
from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sys class ...
- YbtOJ#912-神秘语言【结论,欧拉定理】
正题 题目链接:http://www.ybtoj.com.cn/problem/912 题目大意 给出\(L,R\),求有多少长度在\([L,R]\)之间的字符串满足依次取出所有偶数位置的放在最前面后 ...
- apiserver源码分析——启动流程
前言 apiserver是k8s控制面的一个组件,在众多组件中唯一一个对接etcd,对外暴露http服务的形式为k8s中各种资源提供增删改查等服务.它是RESTful风格,每个资源的URI都会形如 / ...
- 现在有一个长度20的SET,其中每个对象的内容是随机生成的字符串,请写出遍历删除LIST里面字符串含"2"的对象的代码。
现在有一个长度20的SET,其中每个对象的内容是随机生成的字符串,请写出遍历删除LIST里面字符串含"2"的对象的代码. public class RemoveTwo { //le ...