• 关于Unity中的3D拾取


    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

  • 相关阅读:
    第五周作业
    作业4
    20182302 2019-2020-1 《数据结构与面向对象程序设计》实验3报告
    作业四
    实验二
    实验一
    排序大集合java
    阿里面试——运筹优化工程师
    树的子结构判断
    剑指offer——合并两个排序的链表——对象、引用和赋值初接触
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7236801.html
Copyright © 2020-2023  润新知