对统一的游戏对象进行敲击检测

本文关键字:检测 对象 游戏 | 更新日期: 2023-09-27 17:58:27

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

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

所以我写道:

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

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

我该怎么做?

谢谢!:)

对统一的游戏对象进行敲击检测

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

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

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

你需要在这里做几个项目

  1. 你需要对触球进行光线投射,以确定球是否被触球

  2. 你需要增加触摸的持续时间

  3. 你需要发射球并重置触摸的通电释放


这里的代码示例显示了如何处理rayCast

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

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

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

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;        
               }
           }
        }
    }
}

注:例如,代码尚未经过测试,并且不是完整的

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

所建议的那样

使用Co-Rouitne的Take Touch Event将对您有好处。如果您不使用coroutine,然后它在OnUpdate中不断检查触摸事件。最好带上共同程序中的触摸事件。这是我的链接,你可以在其中检查如何使用它。


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