在一个游戏对象上点击检测

时间:2016-07-25 10:49:01

标签: c# android unity3d touch detect

我正在制作足球比赛。

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

所以我写道:

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

}

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

我该怎么做?

谢谢! :)

4 个答案:

答案 0 :(得分:5)

  

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

要检测特定GameObject的点击,您必须使用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");
            }
        }
    }
}

答案 1 :(得分:4)

在脚本中使用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()也适用于移动设备。

答案 2 :(得分:0)

你需要在这里做几件事

  1. 您需要通过光线投射来确定球是否被触碰

  2. 您需要在触摸持续时间内增加电量

  3. 你需要发射球并重置触发释放的力量

  4. 代码示例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;        
                   }
               }
            }
        }
    }
    

    注意:代码仅举例说明它尚未经过测试且不完整

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

答案 3 :(得分:0)

使用Co-Rouitne进行触摸事件对您有好处。如果你不会使用 coroutine,然后它在OnUpdate中不断检查触摸事件。它更好 在共同例行中触摸事件。 这是我的链接,您可以在其中查看如何使用它。

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