对统一的游戏对象进行敲击检测
本文关键字:检测 对象 游戏 | 更新日期: 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");
}
}
}
}
}
将上述脚本附加到场景中的任何活动gameObject
,OnMouseDown()
也适用于移动设备。
你需要在这里做几个项目
-
你需要对触球进行光线投射,以确定球是否被触球
-
你需要增加触摸的持续时间
-
你需要发射球并重置触摸的通电释放
这里的代码示例显示了如何处理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