博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Unity中的3D拾取
阅读量:5965 次
发布时间:2019-06-19

本文共 1287 字,大约阅读时间需要 4 分钟。

3D拾取

3D游戏实际上看到的是2D画面,我们在屏幕上点击,想要找到哪个3D物体,我们实际上是在一个2维平面内做3D拾取。

3D拾取实际上是,当玩家点击屏幕的时候,会从显示屏幕的摄像头发射一条射线,射到它所照射的平面上,射线第一次碰撞到的物体就是玩家所选的物体。

1: 游戏中需要用户触摸/点击 操作3D世界里面的3D物体,那么需要判断用户点击的是3D中的哪个物体;

2: 3D拾取的原理: 从摄像机到屏幕空间的触摸点发出一条射线,这条射线第一个撞到哪个3D物体就会认为哪个3D物体被用户选择;
3: 代码编写
  (1) 发射一条射线: Ray ray = Camera.main.ScreenPointToRay(Touch.position);
  (2) 检测撞到那个物体: Raycast hit; bool Physics.Raycast(ray, out hit);
  (3) hit.transform, 获得物体的transform组件, name可以获得被碰撞的物体的名字;
  (4) Camera.main获取当前我们的主Camera
  (5) 如果要拾取,需要有一个碰撞器

 

 

3D拾取实例

1.创建Unity工程目录

2.创建一个立方体Cube,自带Box Collider(其他物体想要参与3D拾取的必须有碰撞器组件才可以)

3.创建一个脚本ray_test挂载到Cube节点下

4.打开ray_test

using UnityEngine;using System.Collections;public class ray_test : MonoBehaviour {    // Use this for initialization    void Start () {            }        // Update is called once per frame    void Update () {        if (Input.GetMouseButtonDown(0)) {
//判断鼠标是否按下 // 从摄像机开始,到屏幕触摸点,发出一条射线 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 撞击到了哪个3D物体 RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Debug.Log(hit.transform.name);//打印出碰撞到的节点的名字 } } }}

5.点击Game视图中的Cube,控制台打印出Cube的名字Cube

 

 

注意:

获取主摄像机方法,main是数据成员,使用的时候注意Main Camera节点的Tag必须是MainCamera

Camera.main

 

转载地址:http://rrvax.baihongyu.com/

你可能感兴趣的文章
java实现双向循环链表
查看>>
如何使用缓存提高程序性能
查看>>
【trie树】HDU4825 Xor Sum
查看>>
服务器搭建4 安装其它库
查看>>
CAD绘制栏杆5.10
查看>>
自动化学习
查看>>
JS中的!=、== 、!==、===的用法和区别。
查看>>
vs2017 增加平台集
查看>>
Kinect+OpenNI学习笔记之10(不需要骨骼跟踪的人体多个手部分割)
查看>>
spring mvc(4)处理模型数据
查看>>
JS 判断当前使用浏览器名及版本
查看>>
【Kernal Support Vector Machine】林轩田机器学习技术
查看>>
CSS+DIV学习笔记——页面布局
查看>>
让所有浏览器支持HTML5 video视频标签
查看>>
Socket 详解
查看>>
[Android Pro] Java进阶学习:jar打包详解
查看>>
xampp-apache配置
查看>>
Linux平台Cpu使用率的计算
查看>>
fiddler(二)、配置抓取https协议
查看>>
php环境配置
查看>>