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 实现移动

还要实现触摸