当前位置: 首页 > news >正文

Unity之射线检测

不知道大家有没有玩过红色警戒 —— 一款即时战略游戏,和罪恶都市一样小编小学的时候就开始玩了,这款游戏控制单位角色移动是通过鼠标的点击来实现。

同样的操作方法还有英雄联盟等很多游戏,那本篇文章小编就通过简单小实例来讲解这种操作在Unity中是如何实现的。

小编先展示一下实例的演示动图:红色球体表示我们控制的角色,鼠标左键点击小球就会到相应的坐标位置并打印坐标。

一、原理

先来讲一下这种操作方式的原理:它其实是从摄像机发射出的一条射线。当鼠标点击的时候,射线就从摄像机发射打到你点击的位置,通过检测射线获取到位置坐标,角色就向这个坐标移动。

 注:射线发射后碰到的游戏物体必须要有碰撞组件才会被检测到,演示动图中点击平面区域以外的地方是没有任何反应的。

二、实现实例 

创建射线的两种方法:该实例是通过摄像机创建射线

//创建射线的两种方法:
//方式一 通过向量创建
Ray ray1 = new Ray(Vector3.zero , Vector3.up);
//方式二 通过摄像机创建
Ray ray2 = Camera.main.ScreenPointToRay(Input.mousePosition);

新建一个平面一个球体,球体挂载上红色的材质方便我们观察,新建RayTest脚本用来检测射线并挂载到球体上。

public class RayTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//当点击鼠标左键时执行if(Input.GetMouseButtonDown(0)){//按下鼠标左键发射射线  射线发射后碰到的游戏物体必须要有碰撞组件才会被检测到Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//声明一个碰撞信息类RaycastHit hit;//碰撞检测用布尔类型表示bool res = Physics.Raycast(ray,out hit);//如果碰撞到的情况下,hit就有内容了if (res == true){//打印出碰撞信息的坐标Debug.Log(hit.point);//把坐标赋值给球体,球体位置就会直接闪现到射线检测点transform.position = hit.point;}//多检测//RaycastHit[] hits = Physics.RaycastAll(ray, 100, 1 << 10);}}
}

点击运行就是动图的演示效果了,很简单的一个实例,拜拜┏(^0^)┛

相关文章:

  • 【河海大学论文LaTeX+VSCode全指南】
  • axios封装-reques.js
  • 给WordPress网站增加一个带时间的led广告牌
  • Kafka-消费者-KafkaConsumer分析-PartitionAssignor
  • 如何手写一个RPC?
  • rust跟我学三:文件时间属性获得方法
  • MySQL三大日志
  • 编写RedisUtil来操作Redis
  • Java中的finally字句
  • 006.Oracle事务处理
  • python爬虫如何写,有哪些成功爬取的案例
  • pytest -- 进阶使用详解
  • iproute 随手记
  • Spring Boot程序的打包与运行:构建高效部署流程
  • HarmonyOS—开发环境诊断的功能
  • 《剑指offer》分解让复杂问题更简单
  • 【node学习】协程
  • Android组件 - 收藏集 - 掘金
  • CSS 提示工具(Tooltip)
  • FastReport在线报表设计器工作原理
  • Java反射-动态类加载和重新加载
  • jquery ajax学习笔记
  • Lsb图片隐写
  • Octave 入门
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Vue 重置组件到初始状态
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 手写双向链表LinkedList的几个常用功能
  • 学习使用ExpressJS 4.0中的新Router
  • 主流的CSS水平和垂直居中技术大全
  • 阿里云服务器购买完整流程
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 移动端高清、多屏适配方案
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #{}和${}的区别?
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (6)添加vue-cookie
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (六)激光线扫描-三维重建
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (转)jQuery 基础
  • ... 是什么 ?... 有什么用处?
  • .NET Core中的去虚
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 的程序集加载上下文
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET企业级应用架构设计系列之技术选型
  • .Net中的设计模式——Factory Method模式
  • /etc/sudoers (root权限管理)
  • @DataRedisTest测试redis从未如此丝滑
  • @Documented注解的作用