私は現在サッカーの試合を作っています。
このミニゲームでは、プレーヤーがボールに触れると力が加わり、ゴールは高得点になります。
だから私は書いた:
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");
}
}
_
PS:Update()
メソッドから以前のコードを削除します。
EDIT:モバイルデバイスの代替コード
_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()
が機能します。
ここでいくつかの項目を実行する必要があります
ボールに触れたかどうかを判断するには、タッチをレイキャストする必要があります
タッチしている間、パワーを増やす必要があります
あなたはボールを発射し、タッチのリリース時に電源をリセットする必要があります
コード例 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;
}
}
}
}
}
注:コードは一例であり、テストされておらず、完全ではありません
これは、物理的な更新をトリガーとして使用します。代わりに、他のいくつかの回答で示唆されているように、オブジェクトトリガーに直接リンクできます。
Co-Rouitneを使用したTake Touchイベントが適しています。コルーチンを使用しない場合は、OnUpdateのタッチイベントを常にチェックします。コルーチンでタッチイベントを取るのが良いです。使い方を確認できるリンクです。
http://unitycodestuff.blogspot.in/2017/11/how-to-use-co-routine-for-taking-touch.html