How to access another class using C#(in unity3d)?

2019-05-05 17:06发布

问题:

This is my problem: I have a player class and SwipeDetector Class in c#, the SwipeDetector class helps to do recognized swipe touches vertically on the iPhone.

p.s. I'm using unity3d but this is a programming question oppose to gaming techniques :))

In my player class I'm trying to access the SwipeDetector and find out which is swipe it was (up, down).

player.cs:

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

this is the SwipeDetector class, it looks scary but its not!!

    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;
                }
            }
        }
    }

回答1:

If you want to access your SwipeDetector from the player class, you simply can use a public variable.

// Player.cs
public SwipeDetector MySwipeDetector;

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

If you don't want to set the public variable in unity, you can use a kind of singletone pattern.

// SwipeDetector.cs
private static SwipeDetector _Instance;

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

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

And use it this way:

// Player.cs
void Update()
{
    if (SwipeDetector.Instance.lastSwipe == SwipeDirection.Up) { .... }
}


回答2:

Add a public variable to your Player class.

// player.cs
public SwipeDetector swipeDetector;

You will now see the SwipeDetector variable in the editor when you click on the Player GameObject. Assign that empty gameObject that has SwipeDetector (in the Editor) to it. And now you have access to that class.

// you can now use it like this:
if(swipeDetector.lastSwipe == SwipeDetector.SwipeDirection.UP)
{
    // do something
}