如何使用C#(在unity3d中)访问另一个类? [英] How to access another class using C#(in 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屋!