如何使用C#(在unity3d中)访问另一个类? [英] How to access another class using C#(in unity3d)?

查看:450
本文介绍了如何使用C#(在unity3d中)访问另一个类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的问题:我在c#中有一个播放器类和SwipeDetector类,SwipeDetector类有助于在iPhone上垂直进行可识别的滑动​​触摸.

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.我正在使用unity3d,但这是一个与游戏技术相对的编程问题:))

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

在播放器类中,我尝试访问SwipeDetector并找出是哪个(向上,向下)滑动.

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

player.cs:

player.cs:

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

这是SwipeDetector类,它看上去很吓人,但事实并非如此!

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

推荐答案

如果要从播放器类访问SwipeDetector,则只需使用公共变量即可.

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

并以这种方式使用它:

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

这篇关于如何使用C#(在unity3d中)访问另一个类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆