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

unity学习35:用射线ray检测,实现点哪儿

目录

1 点击控制移动

1.1  种类

2 用ray 射线控制移动的原理

2.1 用射线控制移动的原理

2.2 ray的实现

2.2.1 直接生成射线

2.2.2 从摄像机发出一条射线

2.3  Physics.Raycast() 可以用out 输出一个RaycastHit类

2.3 RaycastHit类的属性

2.4 瞬移 或 移动

2.5 多碰撞检测

3 根据ray射线原理实现

3.1 实现效果

3.2  对应代码

4  修改代码实现移动过去(下一步 待完成)


1 点击控制移动

1.1  种类

  • PC端控制:鼠标点击地面,角色跟着移动到这个位置,点哪走哪
  • 手机端控制:手指点击屏幕,角色跟着移动到这个位置,点哪走哪

2 用ray 射线控制移动的原理

2.1 用射线控制移动的原理

  • 摄像机近平面=屏幕
  • 从摄像机发出射线,碰撞到的物体 或 地面

  • 摄像机有1个近平面,还有1个远平面
  • 从摄像机发出的  锥形桶盒子的近屏幕, 其实就是屏幕的最近处的那一幕。
  • 屏幕后看到的都是景深内容

  • 玩家点击屏幕,无论是PC屏幕还是手机屏幕,
  • 本质上都是点击了game窗口 = 点击了摄像机的近屏幕
  • 从点击的那一点,发射线,与游戏世界里有collider的发生碰撞,产生的点,就是应该要触摸到的内容

2.2 ray的实现

  • ray的原理
  • Ray ray1= new Ray()
  • Vector3 ray1= new Vector3 ()

2.2.1 直接生成射线

  • Ray ray1=new Ray(Vector3.zero,Vector.right);
  • 指定 出发点,向量

2.2.2 从摄像机发出一条射线

  • Ray ray1=Camera.main.SecreenPointToRay(Input.mousePostion);

2.3  Physics.Raycast() 可以用out 输出一个RaycastHit类

  • //声明一个碰撞信息类
  •         RaycastHit hit1;
  • //碰撞检测
  •         bool res1=Physics.Raycast(ray1,out hit1);

  • Physics.Raycast() 
  • 本身只返回bool值,找到了就是true,否则false
  • 但是可以用 out关键词,输出一个RaycastHit类

2.3 RaycastHit类的属性

  • hit1.point

2.4 瞬移 或 移动

瞬间移动  position= 直接修改位置

移动过去 move

  • transform.position=hit1.point;
  • transform.move 实现移动

2.5 多碰撞检测

  • 多碰撞检测,如果射线可以穿透,100是检测距离
  • RaycastHit[] hits=Physics.Raycast(ray1,100,1<<10);

3 根据ray射线原理实现

3.1 实现效果

  • 下面是一个瞬间移动的效果
  • 点到哪儿,红色立方体就出现在哪儿
  1. 只会在产生碰撞的地方
  2. 只会在第一次碰撞的物体上

3.2  对应代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestRay : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //ray,方式1
        //Ray ray1=new Ray(Vector3.zero,Vector.right);
        //ray,方式2
        //Ray ray1=Camera.main.SecreenPointToRay(Input.mousePostion);


    }

    // Update is called once per frame
    void Update()
    {
        //如果按下鼠标左键( 或触摸屏幕?)
        if(Input.GetMouseButtonDown(0))
        {
        //根据鼠标点的点发射射线
        Ray ray1=Camera.main.ScreenPointToRay(Input.mousePosition);
        //声明一个碰撞信息类
        RaycastHit hit1;
        //碰撞检测
        bool res1=Physics.Raycast(ray1,out hit1);
        if(res1==true)
        {
            Debug.Log(hit1.point);
            transform.position=hit1.point;
        }
        }
        //多碰撞检测,如果射线可以穿透,100是检测距离
        //RaycastHit[] hits=Physics.Raycast(ray1,100,1<<10);


    }
}

4  修改代码实现移动过去(下一步 待完成)

瞬间移动  position= 直接修改位置

移动过去 move

  • transform.position=hit1.point;
  • transform.move 实现移动

还要实现触摸

http://www.dtcms.com/a/18730.html

相关文章:

  • 为什么我用Python控制仪器比C#慢很多?如何优化性能?
  • web第二次作业
  • 网络初识-
  • 高效训练,深度学习GPU服务器搭建
  • Datawhale Ollama教程笔记2
  • 《图解设计模式》笔记(十)用类来表现
  • 【HDFS】addInternalPBProtocol、setProtocolEngine和registerProtocolAndImpl
  • java-LinkedList源码详解
  • 常见面试提问
  • 【Java八股文】06-MySQL面试篇
  • MySQL 支持的事务隔离级别
  • C++之2048小游戏 第二期
  • PHP 基础介绍
  • 使用Nuitka工具打包Python程序成exe
  • 【Java八股文】01-Java基础面试篇
  • 猜数字小游戏
  • 使用Hexo部署NexT主体网站
  • SQL SERVER的PARTITION BY应用场景
  • C# CountdownEvent 类 使用详解
  • 认识网络安全
  • 【css】width:100%;padding:20px;造成超出100%宽度的解决办法 - box-sizing的使用方法 - CSS布局
  • Android Studio:RxBus结合ICompositeSubscription使用
  • YOLO数据标注——LabelImg
  • PMP--冲刺--流程图
  • vue3+element-plus中的el-table表头和el-table-column内容全部一行显示完整(hook函数)
  • 【第3章:卷积神经网络(CNN)——3.8 迁移学习与微调策略】
  • 恩智浦:将开发文档迁移到DITA/XML
  • ASP.NET Core 使用 FileStream 将 FileResult 文件发送到浏览器后删除该文件
  • 趣味魔法项目 LinuxPDF —— 在 PDF 中启动一个 Linux 操作系统
  • jQuery UI 工作原理