如何检测游戏对象上的触摸

4

我正在为iOS设备在Unity上开发游戏。我已经实现了以下的触摸代码:

void Update () {
    ApplyForce ();
}

void ApplyForce() {

    if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Began) {
        Debug.Log("Touch Occured");     
    }
}

我把这个脚本拖到了一个球体游戏对象上。但是无论我触摸哪里,日志消息都出现了。我希望只有用户触摸物体时才能检测到触摸。


针对这个非常老的问题,使用现代化的Unity:https://dev59.com/questions/q1kS5IYBdhLWcg3wJDUP - Fattie
2个回答

18

把以下代码粘贴到你的相机或其他将持续存在于你设计的关卡中的物体上。它可以是任何东西,甚至是一个空的Gameobject。唯一重要的是,它在你的关卡中只存在一次,否则会有多个触摸检查同时运行,这会对系统造成严重的负载。

void Update () {
    if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Began) 
    {
        Ray ray = Camera.main.ScreenPointToRay( Input.GetTouch(0).position );
        RaycastHit hit;

        if ( Physics.Raycast(ray, out hit) && hit.transform.gameObject.Name == "myGameObjectName")
        {
            hit.GetComponent<TouchObjectScript>().ApplyForce();  
        }
    }
}
在上述脚本中,hit.transform.gameObject.Name == "myGameObjectName" 可以替换为任何其他你想要检查的方法,以确保被raycast触碰到的物体是你要施加力的物体。例如,使用标签(Tags)是一种简单的方法。
另一件需要记住的事情是,raycast将起源于相机(相对于手指触摸的位置),并击中第一个具有碰撞器的物体。因此,如果你的物体被其他物体遮挡,你就无法触摸它。
同时,在你的触控对象中放置下方的脚本(在这个例子中称为TouchObjectScript.cs)。
void Update () {
}

public void ApplyForce() {

        Debug.Log("Touch Occured");   
}
如果有任何不清楚的地方,或者需要进一步的帮助,请留言,我会回复您。

2
真糟糕...刚好需要再一分钟就可以发布了。所以,是的,+1. ;) - Bart
@Steven,如果我将此脚本附加到我的球体或游戏对象上,会有什么问题吗?使用collider.Raycast代替Physics.Raycast有什么区别?还有,什么是screenPos?我已经用Input.GetTouch(0).position代替了它。 - Ashish Beuwria
@Steven 我把它附加到相机上,它就可以工作了。现在我明白为什么脚本需要附加到相机而不是对象本身,因为射线是从相机发出来击中对象的。 - Ashish Beuwria
1
错误 CS1061:类型UnityEngine.RaycastHit'不包含定义gameObject'的内容,并且类型为UnityEngine.RaycastHit'的扩展方法gameObject'未找到(是否缺少使用指令或程序集引用?) - Ahmed Mohsen
1
@AhmedMohsen 不知道为什么这么长时间都没被注意到...我已经更新了我的答案,谢谢。 - Steven Mills
显示剩余2条评论

2
最好的方法是只需添加以下内容:

void OnMouseDown () {}

为了让特定的游戏对象可以被点击,你需要将事件绑定到该对象上。 但问题在于,你不能同时按下两个物体。


它只会检测第一次触摸。 - Olexy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接