Нет, это неправильно. 2d физика почти всегда (и именно так это в Unity) обрабатывает только столкновения в 2d плоскости, то есть в XY. Соответственно, луч "из камеры" идет в плоскости Z и никогда не столкнется со спрайтом. Чтобы все работало, нужно повесить на спрайт трехмерный коллайдер и кастовать трехмерный луч.
Но, если кнопка - это именно кнопка, и нажать нужно именно на нее, то проще и лучше будет использовать встроенный UI (тот, который называют uGUI или new UI). Там есть уже готовая кнопка, нажатие на которую будет обрабатываться автоматически и ничего кастовать не нужно. Для этого надо создать GameObject->UI->Button
, указать ей в качестве Source Image
Вашу текстуру. Дальше на компоненте Button (Script)
добавить действие на событие OnClick()
(плюс в самом низу). Там нужно будет выбрать объект, а затем компонент, висящий на объекте и его метод или свойство для вызова. Для того, чтобы суметь вызвать метод собственноручно написанного скрипта, метод должен быть публичным и, если я правильно помню, он должен иметь не более одного параметра (можно без).
Update
Из кода подписаться на событие нажатия можно так:
using UnityEngine;
using UnityEngine.UI;
public class ButtonPress : MonoBehaviour {
public Button Button;
void OnEnable () {
Button.onClick.AddListener(ClickHandler);
}
void OnDisable () {
Button.onClick.RemoveListener(ClickHandler);
}
void ClickHandler() {
Debug.Log ("Clicked");
}
}
Update 2
Варианты, как отловить удержание кнопки:
Вариант 1: повесить на кнопку компонент EventTrigger
. Добавить на него события OnPointerDown
и OnPointerUp
, повесить на них вызовы публичных методов скрипта (может висеть на любом объекте), в которых ставить булевое поле класса в false
или true
. И это поле проверять, например, в Update
. Скрипт будет выглядеть примерно так:
using UnityEngine;
public class ButtonHold : MonoBehaviour
{
bool pressed;
public void PointerDown()
{
pressed = true;
}
public void PointerUp()
{
pressed = false;
}
void Update()
{
if (!pressed)
return;
Debug.Log("Pressed");
}
}
Вариант 2: сделать скрипт, обрабатывающий эти события автоматически. Скрипт нужно вешать на кнопку.
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class ButtonHold : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
bool pressed;
public void OnPointerDown(PointerEventData eventData)
{
pressed = true;
}
public void OnPointerUp(PointerEventData eventData)
{
pressed = false;
}
void Update()
{
if (!pressed)
return;
Debug.Log("Pressed");
}
}