在统一的游戏对象上点击检测[重复]
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");
将上述脚本附加到场景中任何活动的gameObject
,OnMouseDown()
也适用于移动设备。
【讨论】:
我不认为 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侦听器添加到游戏对象统一[重复]