私のUnity C#
のAndroid用ゲームでは、キャラクターに最も近いゲームオブジェクトが探しているもの(左)であることを検出したいと思います。画面(swipeLeft)で左にスワイプされず、strike
と呼ばれるコードの値を変更したい。しかし、正しく動作していません。私の "if"文が期待通りに動作しない
ゲームビューでImを押すと、毎回leftSwipe
値が機能しません(if関数が削除されたときに値が変化します)、ストライクがまったく変更されません。私はこれを修正する方法を知りたいのですが、この問題の代替方法があります。ここで
はif
文は次のとおりです。
using UnityEngine;
using System.Collections;
public class SwipeChecker : MonoBehaviour
{
public float maxTime;
public float minSwipeDistance;
float startTime;
float endTime;
Vector3 startPos;
Vector3 endPos;
float swipeDistance;
float swipeTime;
public float swipeScore;
public GameObject left;
public GameObject right;
public GameObject up;
public GameObject down;
public GameObject swipeChecker;
public GameObject[] platforms = new GameObject[5];
public bool leftSwipe;
public bool didntSwipe;
public float strike;
public GameObject closestPlatform;
// Use this for initialization
public GameObject FindClosestPlatform()
{
GameObject[] gos;
GameObject[] gos2;
GameObject[] gos3;
GameObject[] gos4;
gos = GameObject.FindGameObjectsWithTag("platform");
GameObject closest = null;
float distance = Mathf.Infinity;
Vector3 position = transform.position;
foreach (GameObject go in gos)
{
Vector3 diff = go.transform.position - position;
float curDistance = diff.sqrMagnitude;
if (curDistance < distance)
{
closest = go;
distance = curDistance;
}
}
return closest;
}
public IEnumerator wait()
{
leftSwipe = true;
yield return new WaitForSeconds(0.5f);
leftSwipe = false;
}
void Start()
{
}
// Update is called once per frame
void Update()
{
closestPlatform = FindClosestPlatform();
if ((closestPlatform = left) && (leftSwipe = false))
{
strike = 1;
}
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
startTime = Time.time;
startPos = touch.position;
}
else if (touch.phase == TouchPhase.Ended)
{
endTime = Time.time;
endPos = touch.position;
swipeDistance = (endPos - startPos).magnitude;
swipeTime = endTime - startTime;
if (swipeTime < maxTime && swipeDistance > minSwipeDistance)
{
swipe();
}
}
}
}
void swipe()
{
Vector2 distance = endPos - startPos;
if (Mathf.Abs(distance.x) > Mathf.Abs(distance.y))
{
Debug.Log("Horizontal Swipe");
if (distance.x > 0)
{
Debug.Log("Right Swipe");
}
if (distance.x < 0)
{
Debug.Log("Left Swipe");
StartCoroutine(wait());
}
}
else if (Mathf.Abs(distance.x) < Mathf.Abs(distance.y))
{
Debug.Log("Vertical Swipe");
if (distance.y > 0)
{
Debug.Log("Up Swipe");
}
if (distance.y < 0)
{
Debug.Log("Down Swipe");
}
}
}
}
C#では、一般に公開フィールドを使用することは悪い習慣と考えられています。これらのフィールドはすべて「プライベート」とマークする必要があります。それらを統一インスペクタに表示させるには、それらに '[SerializeField]'属性を置きます。クラスの外にあるものにアクセスする必要がある場合は、それらを*プロパティ*にラップします。そうすれば、プロパティが変更されるたびに何かを行う必要がある場合は、プロジェクト全体を通してコードを変更することなくその変更を行うことが容易になります。 –