我正在制作足球比赛。
在这个迷你游戏中,当玩家触球时,它会增加力量,目标是获得更高的分数。
所以我写道:
void Update()
{
if(Input.touchCount == 1 && Input.GetTouch(0).phase== TouchPhase.Began)
{
AddForce, and playsound ect...
}
}
有了这个,当我触摸屏幕上的任何地方时,它会增加力量,但我只想在触摸我的游戏对象(球)时增加力量。
我该怎么做?
谢谢! :)
答案 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");
}
}
}
}
}
将以上脚本附加到场景中的任何有效gameObject
,OnMouseDown()
也适用于移动设备。
答案 2 :(得分:0)
你需要在这里做几件事
您需要通过光线投射来确定球是否被触碰
您需要在触摸持续时间内增加电量
你需要发射球并重置触发释放的力量
代码示例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