在统一的游戏对象上点击检测[重复]

Posted

技术标签:

【中文标题】在统一的游戏对象上点击检测[重复]【英文标题】:tap detection on a gameobject in unity [duplicate] 【发布时间】:2016-07-25 10:49:01 【问题描述】:

我目前正在制作足球游戏。

在这个小游戏中,当玩家触球时,它会增加力量,目标是获得更高的分数。

所以我写了:

 void Update()

    if(Input.touchCount == 1 && Input.GetTouch(0).phase== TouchPhase.Began)
      
       AddForce, and playsound ect...
      


有了这个,当我触摸屏幕上的任何地方时,它会增加力量,但我只想在我触摸我的游戏对象(球)时增加力量。

我该怎么做?

谢谢! :)

【问题讨论】:

足球是 2D Sprite/Image 还是 3D 网格? 这是一个 3d 网格,游戏看起来像 facebook messenger 中的足球小游戏。 包括我在内的所有答案都使用了光线投射,但这是执行此操作的旧方法。现在有一种新的方法可以做到这一点,这使得光线投射不适合检测由于点击通过 UI 对象而对对象的点击。有关详细信息,请参阅副本。 完全现代的方法***.com/questions/40323677/… 【参考方案1】:

有了这个,当我触摸屏幕上的任何地方时,它会增加力量,但我 只是想在我触摸我的游戏对象(球)时增加力量。

要检测对特定游戏对象的点击,您必须使用Raycast 来检测对该足球的点击。只要确保一个对撞机(例如Sphere Collider)连接到它。

void Update()

    if ((Input.touchCount > 0) && (Input.GetTouch(0).phase == TouchPhase.Began))
    
        Ray raycast = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
        RaycastHit raycastHit;
        if (Physics.Raycast(raycast, out raycastHit))
        
            Debug.Log("Something Hit");
            if (raycastHit.collider.name == "Soccer")
            
                Debug.Log("Soccer Ball clicked");
            

            //OR with Tag

            if (raycastHit.collider.CompareTag("SoccerTag"))
            
                Debug.Log("Soccer Ball clicked");
            
        
    

【讨论】:

它适用于安卓系统吗?因为我使用的是触摸屏。 是的。请在评论之前尝试代码。 我只使用了 void OnMouseDown 方法,它适用于我的安卓设备(不是统一遥控器)。【参考方案2】:

在您的脚本中使用OnMouseDown()。这是一个例子:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour 
    void OnMouseDown() 
        Application.LoadLevel("SomeLevel");
    

P.S : 从 Update() 方法中删除之前的代码。


编辑:移动设备的替代代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class OnTouchDown : MonoBehaviour

    void Update () 
        // Code for OnMouseDown in the iPhone. Unquote to test.
        RaycastHit hit = new RaycastHit();
        for (int i = 0; i < Input.touchCount; ++i) 
            if (Input.GetTouch(i).phase.Equals(TouchPhase.Began)) 
            // Construct a ray from the current touch coordinates
            Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position);
            if (Physics.Raycast(ray, out hit)) 
                hit.transform.gameObject.SendMessage("OnMouseDown");
              
           
       
    

将上述脚本附加到场景中任何活动的gameObjectOnMouseDown() 也适用于移动设备。

【讨论】:

我不认为 mouseDown 会起作用,因为我在触摸设备上工作。 @Ophélia 将此脚本添加到您的场景中,现在您可以像往常一样使用OnMouseDown()。使您的OnMouseDown() 方法public 我使用 void OnMouseDown(),它适用于 android 设备。非常感谢大家 :) (特别是 Umair M.);) 没问题。请为以后的用户标记我的答案是正确的:) 如何以通用方式使用它?就像如果它击中对象 x,做 y,如果它击中对象 z,做 w。【参考方案3】:

这里需要做几件事情

    您需要对触摸进行光线投射以确定球是否被触摸

    您需要增加触摸持续时间的电源

    您需要发射球并重置触摸释放的电源


代码示例here 展示了如何处理rayCast

代码示例here 应该可以帮助您完成第 2 部分

3 很好很简单,你只需要在 Ended 上触发你的启动代码重置

把它们放在一起,你会得到这样的东西

public class ExampleClass : MonoBehaviour 

    void FixedUpdate() 
       for (int i = 0; i < Input.touchCount; ++i) 
           Ray camRay = Camera.main.ScreenPointToRay (Input.GetTouch(i).Position);
           RaycastHit ballHit;
           if(Physics.Raycast (camRay, out ballHit, camRayLength, ballMask))
           
               if (Input.GetTouch(i).phase == TouchPhase.Stationary) 
                   power += speed + Time.deltaTime;             
               

               else if (Input.GetTouch(i).phase == TouchPhase.Ended) 
                   LauchBall(power);
                   power = 0;        
               
           
        
    

注意:代码仅作为示例,它未经测试且不完整

这使用物理更新作为触发器,您可以直接链接到其他一些答案所建议的对象触发器

【讨论】:

永远不要使用 FixedUpdate 我承认我对 Unity 还很陌生,所以我的水平不够高,无法决定什么是有效的,什么是最好的,但 Unity 团队自己的示例使用固定更新作为主要过程用于管理用户输入,例如unity3d.com/learn/tutorials/projects/survival-shooter/… 不幸的是(大部分)Unity 的文档是完整的、完整的、废话 在这种情况下,如果您能提出更好的文档来源,我会很感兴趣, 真的没有,迈克 - 只需在这里和其他地方阅读关于 Unity 的 10000 篇 QA。不要忘记更新只是意味着“每一帧”。对于这里的问题,您当然希望每一帧都这样做。 (等待物理帧或任何其他问题将是毫无意义/奇怪的。)关于 FixedUpdate。 (与手头的问题完全没有联系。)这只是一种在增加力时避免做数学的方法,你知道吗?如果您正在做的事情发生在一段时间内。这在任何游戏引擎中都是一个坏主意,也是 Unity 中巨大混乱的根源【参考方案4】:

使用 Co-Rouitne 参加 Touch Event 对您有好处。如果你不会使用 协程,然后在 OnUpdate 中不断检查触摸事件。最好采取 协程中的触摸事件。 这是我的链接,您可以在其中查看如何使用它。


http://unitycodestuff.blogspot.in/2017/11/how-to-use-co-routine-for-taking-touch.html

【讨论】:

以上是关于在统一的游戏对象上点击检测[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时将onclick侦听器添加到游戏对象统一[重复]

如何在统一的每个按键上重复动画(Unity3d,C#)

检测 UITextView 上的点击仅检测取消 [重复]

检测特定的iPhone / iPod touch型号[重复]

检测另一个游戏对象上方的移动对象

检测声音文件中的重复