检查一个触摸点是不是在 Unity 中的盒子碰撞器内

Posted

技术标签:

【中文标题】检查一个触摸点是不是在 Unity 中的盒子碰撞器内【英文标题】:Checking if a Touch point is inside box collider in Unity检查一个触摸点是否在 Unity 中的盒子碰撞器内 【发布时间】:2013-05-08 14:01:49 【问题描述】:

请看下面的图片。

在第一张图片中,您可以看到有盒子碰撞器。 第二张图片是当我在 android 设备上运行代码时

这是附加到 Play Game 的代码(它是一个 3D 文本)

using UnityEngine;
using System.Collections;

public class PlayButton : MonoBehaviour    

    public string levelToLoad;
    public AudioClip soundhover ;
    public AudioClip beep;
    public bool QuitButton;
    public Transform mButton;
    BoxCollider boxCollider;

    void Start () 
        boxCollider = mButton.collider as  BoxCollider;
    

    void Update () 

        foreach (Touch touch in Input.touches) 

            if (touch.phase == TouchPhase.Began) 

                if (boxCollider.bounds.Contains (touch.position)) 
                    Application.LoadLevel (levelToLoad);
                
                            
        
    

我想看看接触点是否在碰撞器内部。我想这样做是因为现在如果我单击场景中的任何位置 Application.LoadLevel(levelToLoad);叫做。

如果我只点击 PLAY GAME 文本,我希望它被调用。谁能帮我处理这段代码,或者可以给我另一种解决我的问题的方法??


按照 Heisenbug 的逻辑编写最近的代码

void Update () 

foreach( Touch touch in Input.touches ) 

    if( touch.phase == TouchPhase.Began ) 

        Ray ray = camera.ScreenPointToRay(new Vector3(touch.position.x, touch.position.y, 0));
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, Mathf.Infinity, 10)) 
            Application.LoadLevel(levelToLoad);             
                   
       


【问题讨论】:

【参考方案1】:

触摸的位置以屏幕空间坐标系Vector2)表示。您需要在世界空间坐标系中转换该位置,然后再尝试将其与场景中对象的其他 3D 位置进行比较。

Unity3D 提供了这样做的便利。由于您在文本周围使用BoundingBox,因此您可以执行以下操作:

创建一个Ray,其原点位于触摸点位置,方向平行于相机前轴 (Camera.ScreenPointToRay)。 检查该射线是否与您的GameObject (Physic.RayCast) 的BoundingBox 相交。

代码可能看起来像这样:

Ray ray = camera.ScreenPointToRay(new Vector3(touch.position.x, touch.position.y, 0));
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerOfYourGameObject))

   //enter here if the object has been hit. The first hit object belongin to the layer "layerOfYourGameObject" is returned.

添加一个特定层到你的“玩游戏”GameObject 很方便,以便让光线只与它发生碰撞。


编辑

上面的代码和解释很好。如果你没有得到正确的碰撞,可能你没有使用正确的层。我暂时没有触控设备。以下代码适用于鼠标(不使用图层)。

using UnityEngine;
using System.Collections;

public class TestRay : MonoBehaviour 

    void Update () 

        if (Input.GetMouseButton(0))
        
            Vector3 pos = Input.mousePosition;
            Debug.Log("Mouse pressed " + pos);

            Ray ray = Camera.mainCamera.ScreenPointToRay(pos);
            if(Physics.Raycast(ray))
            
                Debug.Log("Something hit");
            

        
    


这只是一个示例,可以帮助您找到正确的方向。尝试找出您的情况出了什么问题或发布SSCCE。

【讨论】:

我所做的是,选择 3d 文本并在检查器中选择分配给它的图层。层数为 8。之后我将参数 layerOfYourGameObject 传递为 8 并运行代码,但仍然没有发生碰撞。我在上面的问题中附上了代码。 如果我对如何将图层添加到 3D 文本有错误,请纠正我。 1) 选择 3d 文本。 2)在 Inpector 中转到 AddLayer 并将 Unity Layer 10 命名为 PlayGameLayer。 3)在检查员标签=未标记和图层= PlayGameLayer。 4) 带有上述代码的脚本附加到 PlayGame 3d Text。这是正确的方法吗?如果是这样,那么可能出了什么问题? @Jawad Amjad:您是否已将边界框附加到已附加 Text 组件的同一个 GameObject 上? 是的,我已将其附加到 3D 文本

以上是关于检查一个触摸点是不是在 Unity 中的盒子碰撞器内的主要内容,如果未能解决你的问题,请参考以下文章

unity里面translate是否可以无视碰撞

Unity学习——碰撞器

Unity3D中碰撞器和触发器的区别是啥啊?

Unity 2D - OnMouseDown()不起作用

unity网格碰撞器接缝问题

为啥物体在 Unity 中会粘在一起?