Как получить доступ к другому классу, используя C # (в unity3d)? - PullRequest
4 голосов
/ 22 марта 2012

Это моя проблема: у меня есть класс проигрывателя и класс SwipeDetector в c #, класс SwipeDetector помогает делать распознанные касания пальцем вертикально на iPhone.

ps Я использую unity3d, но это программированиеВопрос против игровых приёмов:))

В моем классе игрока я пытаюсь получить доступ к SwipeDetector и выяснить, какой это был пролистывание (вверх, вниз).

player.cs:

if(SwipeDetetcor is up){
   print("up");
}

это класс SwipeDetector, он выглядит страшно, но это не так! *

    using UnityEngine;
    using System.Collections;

    public class SwipeDetector : MonoBehaviour {

        // Values to set:
        public float comfortZone = 70.0f;
        public float minSwipeDist = 14.0f;
        public float maxSwipeTime = 0.5f;

        private float startTime;
        private Vector2 startPos;
        private bool couldBeSwipe;

        public enum SwipeDirection {
            None,
            Up,
            Down
        }

        public SwipeDirection lastSwipe = SwipeDetector.SwipeDirection.None;
        public float lastSwipeTime;

        void  Update()
        {
            if (Input.touchCount > 0)
            {
                Touch touch = Input.touches[0];

                switch (touch.phase)
                {
                    case TouchPhase.Began:
                        lastSwipe = SwipeDetector.SwipeDirection.None;
                                            lastSwipeTime = 0;
                        couldBeSwipe = true;
                        startPos = touch.position;
                        startTime = Time.time;
                        break;

                    case TouchPhase.Moved:
                        if (Mathf.Abs(touch.position.x - startPos.x) > comfortZone)
                        {
                            Debug.Log("Not a swipe. Swipe strayed " + (int)Mathf.Abs(touch.position.x - startPos.x) +
                                      "px which is " + (int)(Mathf.Abs(touch.position.x - startPos.x) - comfortZone) +
                                      "px outside the comfort zone.");
                            couldBeSwipe = false;
                        }
                        break;
                    case TouchPhase.Ended:
                        if (couldBeSwipe)
                        {
                            float swipeTime = Time.time - startTime;
                            float swipeDist = (new Vector3(0, touch.position.y, 0) - new Vector3(0, startPos.y, 0)).magnitude;

                            if ((swipeTime < maxSwipeTime) && (swipeDist > minSwipeDist))
                            {
                                // It's a swiiiiiiiiiiiipe!
                                float swipeValue = Mathf.Sign(touch.position.y - startPos.y);

                                // If the swipe direction is positive, it was an upward swipe.
                                // If the swipe direction is negative, it was a downward swipe.
                                if (swipeValue > 0){
                                    lastSwipe = SwipeDetector.SwipeDirection.Up;
                                    print("UPUPUP");
                                }
                                else if (swipeValue < 0)
                                    lastSwipe = SwipeDetector.SwipeDirection.Down;

                                // Set the time the last swipe occured, useful for other scripts to check:
                                lastSwipeTime = Time.time;
                                Debug.Log("Found a swipe!  Direction: " + lastSwipe);
                            }
                        }
                        break;
                }
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Если вы хотите получить доступ к вашему SwipeDetector из класса игрока, вы можете просто использовать открытую переменную.

// Player.cs
public SwipeDetector MySwipeDetector;

void Update() 
{
    if (MySwipeDetector.lastSwipe == SwipeDirection.Up) { .... }
}

Если вы не хотите устанавливать общедоступную переменную в единице, вы можете использовать своего рода шаблон синглетона.

// SwipeDetector.cs
private static SwipeDetector _Instance;

public static SwipeDetector Instance { get { return _Instance; } }

void Awake()
{
    if (_Instance!= null) throw new Exception(...);
    _Instance= this;
}

И используйте это так:

// Player.cs
void Update()
{
    if (SwipeDetector.Instance.lastSwipe == SwipeDirection.Up) { .... }
}
1 голос
/ 22 марта 2012

Добавьте общедоступную переменную в свой класс Player.

// player.cs
public SwipeDetector swipeDetector;

Теперь вы увидите переменную SwipeDetector в редакторе, когда щелкнете по PlayerObject Player.Назначьте этот пустой игровой объект с SwipeDetector (в редакторе).И теперь у вас есть доступ к этому классу.

// you can now use it like this:
if(swipeDetector.lastSwipe == SwipeDetector.SwipeDirection.UP)
{
    // do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...