7

请看下面的图片。

在此处输入图像描述

在此处输入图像描述

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

这是附加到玩游戏的代码(它是一个 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);             
        }           
    }   
}
}
4

1 回答 1

6

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

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

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

代码可能看起来像这样:

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

于 2013-05-08T21:08:42.480 回答