Пожалуйста, ознакомьтесь с приведенными ниже изображениями.
На первом изображении вы видите, что есть коллайдер коробки. Второе изображение – когда я запускаю код на 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. Может ли кто-нибудь помочь мне с этим фрагментом кода или может дать мне другое решение моей проблемы?
Последний код, следуя логике Гейзенбуга
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); } } } }
Позиция Touch выражается в системе координат экрана ( 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. }
Удобно добавить определенный слой в игру Game Game для игры «Игра в игру», чтобы заставить луч сталкиваться только с ним.
РЕДАКТИРОВАТЬ
Код и объяснение выше в порядке. Если у вас нет правильного столкновения, возможно, вы не использовали правильный слой. На данный момент у меня нет сенсорного устройства. Следующий код будет работать с мышью (без использования слоев).
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 .